Matlab - Как определить зеленый цвет на изображении?

Я работаю в проекте, который в основном должен обнаружить тройки на изображении и удалить другую информацию. Я использовал HSV в качестве сегментации и функцию regionprops для обнаружения каждого элемента. Он работает нормально, но в тех же случаях, когда есть крыши домов, они не удаляются, потому что значение оттенка Hue похоже на тройки. Пока что это результат:

Чтобы удалить крыши, я подумал, что, возможно, возможно обнаружить зеленый цвет в каждой обнаруженной области. Если регион не имеет 70% зеленого цвета (например), этот регион удаляется. Как я могу это сделать? Как я могу определить только зеленый цвет изображения?

 Tyler07 июн. 2016 г., 18:50
Конвертировать HSV в RGB и посмотреть на общую интенсивность зеленого слоя?

Ответы на вопрос(1)

Решение Вопроса

Решение Объяснение

Оценка уровня зеленого цвета в патче - интересная идея. Я предлагаю следующий подход:

конвертируйте ваши патчи из RGB в систему цветов HSV. В цветовой системе HSV легче оценить оттенок (или - цвет) каждого пикселя, исследуя первый канал.

Найдите диапазон зеленого цвета в системе оттенков. В нашем случае это около [65 / 360,170 / 360], как видноВот:

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

Пример кода

Следующая функция оценивает «уровень зелени» в патче:

function [ res ] = evaluateLevelOfGreen( rgbPatch )
%EVALUATELEVELOFGREEN Summary of this function goes here
%   Detailed explanation goes here

%determines the green threshold in the hue channel
GREEN_RANGE = [65,170]/360;
INTENSITY_T = 0.1;

%converts to HSV color space
hsv = rgb2hsv(rgbPatch);

%generate a region of intereset (only areas which aren't black)
relevanceMask = rgb2gray(rgbPatch)>0;

%finds pixels within the specified range in the H and V channels
greenAreasMask = hsv(:,:,1)>GREEN_RANGE(1) & hsv(:,:,1) < GREEN_RANGE(2) & hsv(:,:,3) > INTENSITY_T;

%returns the mean in thie relevance mask
res = sum(greenAreasMask(:)) / sum(relevanceMask(:));



end

Результаты

При использовании на зеленых пятнах:

greenPatch1 = imread('g1.PNG');
evaluateLevelOfGreen(greenPatch1)
greenPatch2 = imread('g2.PNG');
evaluateLevelOfGreen(greenPatch2)
greenPatch3 = imread('g3.PNG');
evaluateLevelOfGreen(greenPatch3)

Результаты:

ans = 0.8230
ans =  0.8340
ans = 0.6030

при использовании не зеленых пятен:

nonGreenPatch1 = imread('ng1.PNG');
evaluateLevelOfGreen(nonGreenPatch1)

результат:

ans = 0.0197
 Pedro Marques07 июн. 2016 г., 21:03
Только одна вещь, когда вы создаете greenAreaMask, вы используете значение оттенка (h) два раза и значение интенсивности (v). Это правильно, или вы хотели использовать h на первом, saturarion (s) на втором и значение (v) на третьем?
 drorco08 июн. 2016 г., 07:53
@PedroMarques в этом случае вы можете просто написать: sum (greenAreasMask (:))
 Pedro Marques07 июн. 2016 г., 20:48
Спасибо вам за помощь. Это решило мою проблему
 Pedro Marques07 июн. 2016 г., 21:09
Хорошо понял. Спасибо
 drorco07 июн. 2016 г., 21:05
@PedroMarques, это на самом деле то, что я имею в виду. первые два сравнения проверяют, что значение находится в диапазоне правого оттенка, а третье проверяет, достаточно ли велико значение v. Я на самом деле не использую насыщенность здесь.
 Pedro Marques08 июн. 2016 г., 01:43
Этот подход вычисляет среднее значение зеленого уровня каждого региона. Но если я хочу знать зеленый уровень каждого пикселя, как я могу это сделать?

Ваш ответ на вопрос