Раскрасить изображение в градациях серого

У меня есть изображение в градациях серого и некоторый цвет, представленный в триплете RGB. И мне нужно раскрасить изображение в градациях серого, используя этот триплет.

Левое изображение представляет то, что у нас есть, а правое — то, что мне нужно иметь. Теперь в программе у меня есть некоторая функция, где на входе есть значения R, G и B исходного изображения и цвет значения RGB, который следует использовать в качестве значения окраски. И я не могу решить, как я могу увеличить или уменьшить исходный RGB, используя цвет RGB, чтобы получить правильную цветовую палитру.

Язык C++, но это не так важно. Заранее спасибо.


person fryme    schedule 22.09.2011    source источник
comment
Умножьте тройку на значение в оттенках серого, или вы хотите что-нибудь необычное?   -  person PlasmaHH    schedule 23.09.2011
comment
Всегда ли значение цвета является компонентом чистого цвета, например 0, 255, 0, поэтому окрашивайте его в зеленый цвет? Или он может принимать смешанные цвета: 255, 127, 0, поэтому покрасьте его в оранжевый цвет?   -  person Steve Blackwell    schedule 23.09.2011
comment
Какой триплет RGB вы использовали для образца изображения?   -  person Mark Ransom    schedule 23.09.2011


Ответы (2)


Другие ответы предлагают умножить значение оттенков серого на целевой цвет RGB. Это нормально, но проблема в том, что это изменит общую яркость изображения. Например, если вы выберете темный оттенок зеленого, все изображение станет темнее.

Я думаю, что цветовая модель RGB не лучше всего подходит для этого. Альтернативой может быть выбор одного цвета без соответствующей яркости, а затем раскрашивание изображения с сохранением исходной яркости каждого пикселя.

Алгоритм будет примерно таким:

  • выберите целевой цвет с точки зрения двух значений: оттенка и насыщенности. Оттенок определяет тон цвета (зеленый, красный и т. д.), а насыщенность определяет чистоту цвета (чем менее чистый, тем больше цвет становится серым).
  • Теперь для каждого пикселя вашего изображения в градациях серого вычислите новый пиксель в цветовой модели HLS, где H и S — ваши целевые оттенок и насыщенность, а L — значение серого вашего пикселя.
  • Преобразуйте этот цвет HLS в RGB и сохраните в новом изображении.

Алгоритм преобразования HLS в RGB см. на этой странице или на этой странице.

person Miguel    schedule 23.09.2011

Концептуально вы должны взять значение оттенков серого для каждого пикселя в исходном изображении и использовать его в процентах от значения зеленого. поэтому, если пиксель имеет значение шкалы серого 87, то эквивалентный пиксель в цветном изображении будет:

colorized_red = (87 / 255) * red_component(green_shade);
colorized_green = (87 / 255) * green_component(green_shade);
colorized_blue = (87 / 255) * blue_component(green_shade);
person Marc B    schedule 22.09.2011
comment
Предполагая, что исходное изображение в оттенках серого на самом деле является триплетом RGB, который выглядит серым, как вычислить 87? - person Robᵩ; 23.09.2011
comment
оттенки серого — это просто цвета, в которых три триплета одинаковы (или очень похожи). Теоретически, выбрав любое из значений r/g/b, вы получите 87, так как два других должны быть идентичными или близкими (например, 86/88). - person Marc B; 23.09.2011
comment
Эффект, показанный на примере изображения, не совсем соответствует этой простой формуле. Обратите внимание, что белый цвет соответствует белому, а не зеленому. - person Mark Ransom; 23.09.2011
comment
Да, Марк был прав. Изображение должно иметь эффект, как будто это цветное изображение на белой бумаге. - person fryme; 23.09.2011
comment
87/255 == 0. тут все будет ноль - person Emilio Garavaglia; 23.09.2011
comment
Эмилио, да, но если бы мы написали: (float) 87/255 * red, мы должны получить правильное значение. - person fryme; 23.09.2011
comment
Марк, я попробовала вашу формулу, и она выглядит хорошо, но она намного темнее, чем должна быть. Может быть, мне нужно иметь какое-то пороговое значение? - person fryme; 23.09.2011
comment
Да, фактическая реализация будет не такой простой, но это основы того, как вы начнете над ней работать. - person Marc B; 23.09.2011