В этом примере показано, как идентифицировать различные цвета в ткани путем анализа цветового пространства L * a * b *.
Читайте в fabric.png изображение, представляющее собой изображение красочной ткани.
fabric = imread('fabric.png'); imshow(fabric) title('Fabric')

На изображении можно увидеть шесть основных цветов: цвет фона, красный, зеленый, фиолетовый, желтый и пурпурный. Обратите внимание, как легко можно визуально отличить эти цвета друг от друга. Цветовое пространство L * a * b * (также известное как CIELAB или CIE L * a * b *) позволяет количественно определить эти визуальные различия.
Цветовое пространство L * a * b * получено из значений тристимула CIE XYZ. Пространство L * a * b * состоит из слоя светимости 'L *' или яркости, слоя цветности 'a *', указывающего, где цвет падает вдоль красно-зеленой оси, и слоя цветности 'b *', указывающего, где цвет падает вдоль синей-желтой оси.
Ваш подход заключается в выборе небольшой области выборки для каждого цвета и вычислении среднего цвета каждой области выборки в пространстве «a * b *». Эти цветовые маркеры используются для классификации каждого пикселя.
Чтобы упростить этот пример, загрузите координаты области, которые хранятся в MAT-файле.
load regioncoordinates; nColors = 6; sample_regions = false([size(fabric,1) size(fabric,2) nColors]); for count = 1:nColors sample_regions(:,:,count) = roipoly(fabric,region_coordinates(:,1,count), ... region_coordinates(:,2,count)); end imshow(sample_regions(:,:,2)) title('Sample Region for Red')

Преобразование RGB-изображения матрицы в изображение L * a * b * с помощьюrgb2lab .
lab_fabric = rgb2lab(fabric);
Вычислите среднее значение «a *» и «b *» для каждой области, извлеченной с помощьюroipoly. Эти значения служат в качестве цветовых маркеров в пространстве «a * b *».
a = lab_fabric(:,:,2); b = lab_fabric(:,:,3); color_markers = zeros([nColors, 2]); for count = 1:nColors color_markers(count,1) = mean2(a(sample_regions(:,:,count))); color_markers(count,2) = mean2(b(sample_regions(:,:,count))); end
Например, средний цвет красной области образца в пространстве «a * b *» равен
fprintf('[%0.3f,%0.3f] \n',color_markers(2,1),color_markers(2,2));[69.828,20.106]
Теперь каждый маркер цвета имеет значения «a *» и «b *». Можно классифицировать каждый пиксель в lab_fabric путем вычисления евклидова расстояния между этим пикселем и каждым цветовым маркером. Наименьшее расстояние указывает на то, что пиксель наиболее точно соответствует этому цветовому маркеру. Например, если расстояние между пикселем и маркером красного цвета является наименьшим, то пиксель будет помечен как красный пиксель.
Создайте массив, содержащий цветовые метки, т.е. 0 = фон, 1 = красный, 2 = зеленый, 3 = фиолетовый, 4 = пурпурный и 5 = желтый.
color_labels = 0:nColors-1;
Инициализируйте матрицы, которые будут использоваться в ближайшей классификации соседей.
a = double(a); b = double(b); distance = zeros([size(a), nColors]);
Выполнить классификацию
for count = 1:nColors distance(:,:,count) = ( (a - color_markers(count,1)).^2 + ... (b - color_markers(count,2)).^2 ).^0.5; end [~,label] = min(distance,[],3); label = color_labels(label); clear distance;
Матрица меток содержит цветную метку для каждого пикселя в изображении ткани. Используйте матрицу меток для разделения объектов в исходном изображении ткани по цвету.
rgb_label = repmat(label,[1 1 3]); segmented_images = zeros([size(fabric), nColors],'uint8'); for count = 1:nColors color = fabric; color(rgb_label ~= color_labels(count)) = 0; segmented_images(:,:,:,count) = color; end
Отображение пяти сегментированных цветов в качестве монтажа. Также отображаются фоновые пикселы на изображении, которые не классифицируются как цвет.
montage({segmented_images(:,:,:,2),segmented_images(:,:,:,3) ...
segmented_images(:,:,:,4),segmented_images(:,:,:,5) ...
segmented_images(:,:,:,6),segmented_images(:,:,:,1)});
title("Montage of Red, Green, Purple, Magenta, and Yellow Objects, and Background")
Можно увидеть, насколько хорошо ближайшая соседняя классификация разделяла различные цветовые совокупности, выводя на график значения «a *» и «b *» пикселов, которые были классифицированы на отдельные цвета. Для отображения отметьте каждую точку своей меткой цвета.
purple = [119/255 73/255 152/255];
plot_labels = {'k', 'r', 'g', purple, 'm', 'y'};
figure
for count = 1:nColors
plot(a(label==count-1),b(label==count-1),'.','MarkerEdgeColor', ...
plot_labels{count}, 'MarkerFaceColor', plot_labels{count});
hold on;
end
title('Scatterplot of the segmented pixels in ''a*b*'' space');
xlabel('''a*'' values');
ylabel('''b*'' values');