Раскрасить изображение в градациях серого - PullRequest
1 голос
/ 23 сентября 2011

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

image

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

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

Ответы [ 2 ]

9 голосов
/ 23 сентября 2011

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

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

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

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

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

0 голосов
/ 23 сентября 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);
...