Удаление R из цвета RGB

Есть ли способ удалить красный канал пикселя RGB таким образом, чтобы в результирующем изображении красный цвет перешел в белый, а не в черный? Мне нужно различать красный цвет и синий / черный цвет, но при разном освещении значение RGB меняется. Если я просто удалю канал R, более темные красные цвета станут черными, и я хочу получить противоположный результат.

Спасибо!


person Zdravko Donev    schedule 27.06.2016    source источник
comment
установить R на 255/1 вместо 0?   -  person le_m    schedule 27.06.2016
comment
К сожалению нет. Установка R на 255 делает все похожим на красный, даже синие / черные пиксели почти не отличаются от красного цвета.   -  person Zdravko Donev    schedule 27.06.2016
comment
Каков ожидаемый результат для чистого красного, желтого и пурпурного цветов? А оранжевый и фиолетовый?   -  person Joni    schedule 27.06.2016
comment
Если вы просто хотите различать красный и синий / черный, почему бы просто не посмотреть на относительные значения канала R и синего канала? Возможно, используется что-то вроде меры R / B или R-B?   -  person ffledgling    schedule 27.06.2016
comment
Мне нужно различать синий (оттенки) / черный (оттенки) и красный (оттенки) / белый, поэтому, если есть способ увеличить оттенки синего и черного цветов, это было бы идеальным решением или наоборот, уменьшить. синий и черный цвета.   -  person Zdravko Donev    schedule 27.06.2016
comment
Я попробовал R / B, и на более светлых снимках это работает, но на более темных снимках соотношение становится почти равным (скажем, с разницей 0,2), что касается RB, я не думаю, что это сработает, потому что почти каждый черный пиксель имеет B. значение 0. @ffledgling   -  person Zdravko Donev    schedule 27.06.2016


Ответы (1)


Если я вас правильно понял -

Вам нужно нормализовать значение красного канала, а затем использовать его как значение микширования:

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)
<h4>Red removed + to white</h4><canvas id=c></canvas><h4>Original:</h4>

person Community    schedule 27.06.2016
comment
Вау, это потрясающий эффект, я пытался сделать другие нормализации, но, судя по вашему образцу изображения, это лучшее, что я могу получить! Это именно то, что мне нужно, сохранить синий / черный цвета и избавиться от красного цвета. Большое спасибо! @ K3N - person Zdravko Donev; 28.06.2016
comment
@ZdravkoDonev без проблем! Я обновил и переместил свой предыдущий комментарий в ответ. - person ; 28.06.2016