从RGB颜色中删除R

时间:2016-06-27 20:01:10

标签: image-processing colors rgb

有没有办法删除 RGB 像素的红色频道,使得在结果图片中红色变为白色不要黑?我需要区分红色和蓝色/黑色,但在不同的光线下, RGB 值会有所不同。如果我只是删除 R 频道,则较暗的红色变为黑色,我想要相反的结果。

谢谢!

1 个答案:

答案 0 :(得分:3)

如果我理解正确 -

您需要规范化红色通道值,然后将其用作混合值:

mix = R / 255

然后使用混合因子将白色与正常颜色减去红色通道混合:

     Original-red    White
R' = 0             + 255 * mix
G' = G * (1 - mix) + 255 * mix
B' = B * (1 - mix) + 255 * mix

注意它会杀死黄色和洋红色的颜色,当然这些颜色使用红色通道,红色越多,混合的白色越多。

您应该能够使用CMYK颜色模型或两者的组合来解决这个问题,因此您可以将所有主要组件分开。然后用f.ex覆盖混音。来自CMYK的黄色/洋红色成分。

混合过程应与描述的相同。

概念演示



var ctx = c.getContext("2d");
var img = new Image;
img.onload = function() {
  c.width = img.width;
  c.height = img.height;
  ctx.drawImage(this, 0, 0);

  var idata = ctx.getImageData(0,0,c.width,c.height),
      data = idata.data, len = data.length, i, mix;
 
  /* mix = R / 255
     R = 0             + 255 * mix
     G = G * (1 - mix) + 255 * mix
     B = B * (1 - mix) + 255 * mix
  */
  for(i = 0; i < len; i+= 4) {
    mix = data[i] / 255;                           // mix using red
    data[i  ] = 255 * mix;                         // red channel
    data[i+1] = data[i+1] * (1 - mix) + 255 * mix; // green channel
    data[i+2] = data[i+2] * (1 - mix) + 255 * mix; // blue channel
  }
  ctx.putImageData(idata,0,0);
};
img.crossOrigin = "";
img.src = "//i.imgur.com/ptOPQZx.png";
document.body.appendChild(img)
&#13;
<h4>Red removed + to white</h4><canvas id=c></canvas><h4>Original:</h4>
&#13;
&#13;
&#13;