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

Благодарность!

0
Zdravko Donev 27 Июн 2016 в 23:01
Установить R на 255/1 вместо 0?
 – 
le_m
27 Июн 2016 в 23:05
К сожалению нет. Установка R на 255 делает все похожим на красный, даже синие / черные пиксели почти не отличаются от красного цвета.
 – 
Zdravko Donev
27 Июн 2016 в 23:09
1
Каков ожидаемый результат для чистого красного, желтого и пурпурного цветов? А оранжевый и фиолетовый?
 – 
Joni
27 Июн 2016 в 23:19
Если вы просто хотите различать красный и синий / черный, почему бы просто не посмотреть на относительные значения канала R и синего канала? Возможно, используется что-то вроде меры R / B или R-B ?
 – 
ffledgling
27 Июн 2016 в 23:23
Мне нужно различать синий (оттенки) / черный (оттенки) и красный (оттенки) / белый, поэтому, если есть способ увеличить оттенки синего и черного цветов, это было бы идеальным решением или наоборот, уменьшить. синий и черный цвета.
 – 
Zdravko Donev
27 Июн 2016 в 23:29

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>
3
Community 20 Июн 2020 в 12:12
1
Вау, это потрясающий эффект, я пытался сделать другие нормализации, но, судя по вашему образцу изображения, это лучшее, что я могу получить! Это именно то, что мне нужно, сохранить синий / черный цвета и избавиться от красного цвета. Большое спасибо! @ K3N
 – 
Zdravko Donev
28 Июн 2016 в 00:03
Нет проблем! Я обновил и переместил свой предыдущий комментарий в ответ.
 – 
user1693593
28 Июн 2016 в 00:47