Как получить канал любого цвета из фотографии? - PullRequest
2 голосов
/ 13 марта 2012

RGB состоит из трех каналов - красного, зеленого, синего.Как получить, скажем, коричневый канал из rgb?

Мне нужно, чтобы он мог распознавать коричневые (ржавые) объекты на фотографии, поэтому было бы неплохо преобразовать фотографию в «коричневый канал».

РЕДАКТИРОВАТЬ:

Вот фотография, из которой следует распознать коричневый цвет:

http://dl.dropbox.com/u/4571/section.jpg

Ответы [ 4 ]

2 голосов
/ 13 марта 2012

Можно думать о коричневости буквально в двух измерениях, но коричневый канал будет только одномерным.Следовательно, вы не можете определить коричневый канал так легко, как пожелаете.

Даже красный канал не определяет истинно красноту цвета, поэтому вам нужно определить, что вы подразумеваете под коричневым каналом, прежде чем кто-либомог бы помочь тебе.Есть много способов, которыми можно ошибочно окрасить изображение, чтобы отразить коричневость любого данного пикселя.Возможно, вы могли бы выбрать евклидово расстояние в единицах L * a * b * (часто называемое дельта E) из некоторого номинального коричневого цвета.Конечно, это даст вам ту же коричневость, если вы красный, зеленый или синий (все на одно и то же количество) от данного цвета.И предположим, что мы движемся прямо от нейтральной оси на k единиц, а не прямо на нейтральную ось на k единиц.Конечно, если вы отойдете от нейтрального, это создаст БОЛЕЕ коричневый цвет, но приведенное выше определение (в терминах дельты E) скажет, что это не так.,Таким образом, рассмотрите путь от белого до точки, которую вы определите как «коричневый».(Точно выберите эту точку. Она находится на границе гаммы? Если нет, что произойдет, если вы будете двигаться дальше в этом направлении?) Теперь коричневость - это, по сути, расстояние от белого на вашем пути.Для любого цвета, отсутствующего на этом пути, спроецируйте точку ортогонально вниз на путь, чтобы определить ее существенную коричневость.Обратите внимание, что это поможет, если ваше определение пути будет прямой линией в вашем цветовом пространстве, так как в противном случае эта ортогональная проекция станет немного неприятной.

Если через некоторое время я смогу найти другой способопределить коричневый, но это ваш вопрос, а не мой.Только ВЫ можете определить, что вы имеете в виду.

Изменить: Учитывая рисунок, показанный в пересмотренном вопросе, я бы предложил простую схему.«Коричневые» пятна, кажется, состоят из темно-коричневых цветов и более легкого, почти желтоватого «загара», но между этими двумя альтернативами не так много.Итак, преобразуйте ваше изображение в цветовое пространство, такое как CIE Lab.Каждый пиксель теперь будет представлен в виде соответствующих координат в пространстве Lab вместо RGB.Теперь выберите номинальный коричневый цвет и номинальный желтый, и вычислите евклидово расстояние в Lab из этих двух точек.Если пиксель находится в пределах определенного допуска, то назовите его коричневым или желтым.Это общее решение вашей проблемы.

1 голос
/ 13 марта 2012

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

Евклидово расстояние в пространстве RGB просто: distance = sqrt ((Rt-Rp) ^ 2 + (Rt-Rp) ^ 2 + (Rt-Rp) ^ 2)

С Xt и Xp, являющимися компонентами RGB целевого цвета и пикселей изображения.

Вы можете нормализовать это по максимально возможному расстоянию, то есть расстоянию между черным и белым (я не определен в этой последней части, вы можете попробовать альтернативную нормализацию).

Вот пример в Matlab:

% Load image in RGB encoding
file='rust.jpg';
img=imread(file);
% Target
brown=[165 42 42];
imgd=double(img);
% Compute the euclidean distance so that 255 is exactly this color and 0 the maximum possible distance (between black and white)
browndistance=uint8(255-255*sqrt((brown(1)-imgd(:,:,1)).^2+(brown(2)-imgd(:,:,2)).^2+(brown(3)-imgd(:,:,3)).^2)/sqrt(255^2+255^2+255^2));
figure;
imshow(browndistance,[0 255]);

Только проверено, что оно может работать, возможно, оно не будет достаточно точным для ваших нужд.

0 голосов
/ 13 марта 2012

Я бы просмотрел фото в поисках моего коричневого цвета

Мой ржавый коричневый был бы "165; 42; 42" в RGB.

цветовая палитра
http://web.njit.edu/~kevin/rgb.txt.html#Brown

Я бы перебрал каждый пиксель и проверил, есть ли подобные значения.Если один из каналов достаточно близок к эталону (скажем, +/- 5), я бы сохранил координаты такого пикселя в отдельном списке.

Это также дало бы мне контроль чувствительности - я мог бы решить, насколько точным должно быть решение ...

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

Это решение может быть медленным, хотя ... и если есть какие-то встроенные решения, о которых я не знаю, оно можетразумнее их использовать.

0 голосов
/ 13 марта 2012

Вы можете попробовать AForge.NET, я думаю, AForge.Imaging.Filters.ExtractChannel - это то, что вы хотите. Если нет, то есть и другие методы, связанные с каналами RGB.

...