Одним из вариантов, который значительно улучшает качество получаемого изображения, является преобразование в другое цветовое пространство для более удобного выбора цветов.В частности, цветовое пространство HSV определяет цвета пикселей с точки зрения их оттенка (цвет), насыщенности (количество цвета) и значения (яркость цвета).
Например, вы можете преобразовать ваше изображение RGB в пространство HSV с помощью функции rgb2hsv
, найти пиксели с оттенками, которые охватывают то, что вы хотите определить как «не красные» цвета (например, 20 градусов)до 340 градусов), установите насыщенность для этих пикселей равной 0 (чтобы они были в оттенках серого), затем преобразуйте изображение обратно в пространство RGB с помощью функции hsv2rgb
:
cdata = imread('EcyOd.jpg'); % Load image
hsvImage = rgb2hsv(cdata); % Convert the image to HSV space
hPlane = 360.*hsvImage(:, :, 1); % Get the hue plane scaled from 0 to 360
sPlane = hsvImage(:, :, 2); % Get the saturation plane
nonRedIndex = (hPlane > 20) & ... % Select "non-red" pixels
(hPlane < 340);
sPlane(nonRedIndex) = 0; % Set the selected pixel saturations to 0
hsvImage(:, :, 2) = sPlane; % Update the saturation plane
rgbImage = hsv2rgb(hsvImage); % Convert the image back to RGB space
И вот результирующее изображение:
Обратите внимание, что по сравнению с раствором от Zellus вы можете легко поддерживать светло-розовые тона на цветах.Обратите также внимание на то, что коричневатые тона на стебле и на земле также исчезли.
Интересный пример выбора объектов из изображения на основе их цветовых свойств вы можете проверить в блоге Стива Эддинса The TwoAmigos , который описывает решение от Бретта Шоелсона из MathWorks для извлечения одного "amigo" из изображения.
Примечание по выбору цветовых диапазонов ...
Еще одна вещь, которую вы можете сделать, которая может помочь вам выбрать диапазоны цветов, - это посмотреть гистограмму оттенков (то есть hPlane
сверху), присутствующих в пикселях вашего изображения HSV.Вот пример, в котором используются функции histc
(или рекомендуемые histcounts
, если доступны) и bar
:
binEdges = 0:360; % Edges of histogram bins
hFigure = figure(); % New figure
% Bin pixel hues and plot histogram:
if verLessThan('matlab', '8.4')
N = histc(hPlane(:), binEdges); % Use histc in older versions
hBar = bar(binEdges(1:end-1), N(1:end-1), 'histc');
else
N = histcounts(hPlane(:), binEdges);
hBar = bar(binEdges(1:end-1), N, 'histc');
end
set(hBar, 'CData', 1:360, ... % Change the color of the bars using
'CDataMapping', 'direct', ... % indexed color mapping (360 colors)
'EdgeColor', 'none'); % and remove edge coloring
colormap(hsv(360)); % Change to an HSV color map with 360 points
axis([0 360 0 max(N)]); % Change the axes limits
set(gca, 'Color', 'k'); % Change the axes background color
set(hFigure, 'Pos', [50 400 560 200]); % Change the figure size
xlabel('HSV hue (in degrees)'); % Add an x label
ylabel('Bin counts'); % Add a y label
А вот итоговая гистограмма цвета пикселей:
Обратите внимание, что исходное изображение содержит в основном пиксели красного, зеленого и желтого цвета (с несколькими оранжевыми).Пикселей голубого, синего, индиго или пурпурного цвета почти нет.Также обратите внимание, что диапазоны, которые я выбрал выше (от 20 до 340 градусов), отлично справляются с исключением большинства всего, что не является частью двух больших красных кластеров на обоих концах.