Как я могу найти самый красный и самый черный пиксель в растровом изображении? - PullRequest
1 голос
/ 10 марта 2011

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

Ответы [ 2 ]

3 голосов
/ 10 марта 2011

Предполагая, что ваше растровое изображение хранит цвета в цветовом формате RGB (не YCbCr или CYMK), а также при условии, что для каждого компонента цвета используется 8 бит, пиксель, ближайший к (0,0,0), является самым черным, а пиксель - ближайшим к (255,0,0) самый красный. Предполагая, что это не совсем новая информация для вас, я думаю, что ваш вопрос, скорее, заключается в том, как рассчитать «расстояние», чтобы вы могли выяснить, какое из них является ближайшим, правильным?

Чтобы узнать, какой самый черный пиксель, RGB может не быть оптимальным цветовым представлением; Я бы предпочел HSL для этого. Пиксель в формате HSL состоит из трех значений: H - это оттенок (базовый цвет), S - это насыщенность (насколько «серый» смешивается в цвете), а L - яркость (в основном, яркость). Пиксель с наименьшим значением L (L между 1,0 и 0,0) будет тогда ближе всего к черному; два пикселя с разными значениями H / S, но одинаковым значением L одинаково «черные», даже если они могут иметь разные цвета.

Чтобы выяснить, какой пиксель является ближайшим к красному, сравните значения HSL для пикселей и выполните поиск пикселя со значением H, ближайшим к 0,0 градусу (поскольку 0,0 градуса - красный, а H - от 0,0 до 360,0 градуса однако 360,0 градуса равны 0,0 градуса), значение S, наиболее близкое к 1,0 (поскольку 1,0 означает полный цвет, а 0,0 - полностью серый), и значение L, наиболее близкое к 0,5 (поскольку 0,0 будет черным, а 1,0 - белым).

например. в HSL темно-желтый - 49,5 / 0,893 / 0,497, темно-синий - 248,3 / 0,601 / 0,373, поэтому вы можете четко видеть, что темно-синий пиксель имеет яркость (= яркость) 0,373, темно-желтый - только 0,497, таким образом, темно-синий определенно «темнее», чем желтый (ближе к черному), который решает ваш первый вопрос.

Какой пиксель краснее? Красный - это 0,0 / 1,0 / 0,5. Вы можете рассчитать для каждого компонента, насколько он отличается от идеального красного пикселя. Вы одинаково «взвешиваете» все компоненты или считаете, что разница в оттенке (цвете) более важна, чем другие различия (и по какому фактору), зависит от вашего определения красного цвета. Вы можете выбрать только оттенок, если хотите.

На этой странице есть хороший рецепт того, как шаг за шагом конвертировать RGB в HSL (и обратно, если нужно): http://130.113.54.154/~monger/hsl-rgb.html

Чтобы дать вам представление о том, как выглядит цветовое пространство HSL, вот несколько фотографий из Википедии, которые пытаются визуализировать это цветовое пространство:

http://upload.wikimedia.org/wikipedia/commons/c/cb/HSL_color_solid_cylinder_alpha_lowgamma.png

и

http://upload.wikimedia.org/wikipedia/commons/a/a0/Hsl-hsv_models.svg

HSV - это альтернативное цветовое пространство, которое разделяет некоторые свойства с HSL, однако я лично предпочитаю HSL. Оба используют одно и то же определение оттенка H, но они используют очень разные определения насыщенности и, следовательно, также разные определения яркости / яркости.

3 голосов
/ 10 марта 2011

Вы можете использовать 3-мерное расстояние уравнение на вашем изображении RGB (r = x, g = y, b = x). Таким образом, чтобы получить наиболее близкий к черному p1 = (0,0,0) и текущий цвет пикселя. Ближайший пиксель к черному будет с наименьшим расстоянием. Для красного замените p1 на (255,0,0) и повторите.

...