exponenta event banner

Цветовая сегментация с использованием

цветового пространства

L * a * b *

В этом примере показано, как идентифицировать различные цвета в ткани путем анализа цветового пространства L * a * b *.

Шаг 1: Получение изображения

Читайте в fabric.png изображение, представляющее собой изображение красочной ткани.

fabric = imread('fabric.png');
imshow(fabric)
title('Fabric')

Figure contains an axes. The axes with title Fabric contains an object of type image.

Шаг 2: Расчет образцов цветов в цветовом пространстве L * a * b * для каждой области

На изображении можно увидеть шесть основных цветов: цвет фона, красный, зеленый, фиолетовый, желтый и пурпурный. Обратите внимание, как легко можно визуально отличить эти цвета друг от друга. Цветовое пространство 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')

Figure contains an axes. The axes with title Sample Region for Red contains an object of type image.

Преобразование 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] 

Шаг 3: Классифицировать каждый пиксель с помощью правила ближайшего соседа

Теперь каждый маркер цвета имеет значения «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;

Шаг 4: Отображение результатов классификации ближайших соседей

Матрица меток содержит цветную метку для каждого пикселя в изображении ткани. Используйте матрицу меток для разделения объектов в исходном изображении ткани по цвету.

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")

Figure contains an axes. The axes with title Montage of Red, Green, Purple, Magenta, and Yellow Objects, and Background contains an object of type image.

Шаг 5: Отображение значений 'a *' и 'b *' помеченных цветов

Можно увидеть, насколько хорошо ближайшая соседняя классификация разделяла различные цветовые совокупности, выводя на график значения «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');

Figure contains an axes. The axes with title Scatterplot of the segmented pixels in 'a*b*' space contains 6 objects of type line.