MATLAB.Exponenta
MATLAB и Simulink на русском
Технологии разработки и отладки
		сложных технических систем

Обработка сигналов и изображений\image Processing Toolbox

И.М.Журавель "Краткий курс теории обработки изображений"

В оглавление \ К следующему разделу \ К предыдущему разделу

Сегментация цветных изображений на основе цветового пространства L*a*b*

Рассмотрим задачу, основной целью которой является идентификация и анализ различных цветов изображения в пространстве L*a*b*. Изображение получено с помощью пакета Image Acquisition Toolbox.

Содержание

  • Шаг 1: Получение изображения.
  • Шаг 2: Вычисление выборки цветов в цветовом пространстве L*a*b* для каждой локальной области.
  • Шаг 3: Классификация каждого пикселя с использованием принципа ближайшей окрестности.
  • Шаг 4: Отображение результатов классификации по ближайшей окрестности.
  • Шаг 5: Отображение значений 'a*' и 'b*' отмеченных цветов.

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

Считываем файл fabric.png, который представляет собой изображение некоторой материи. Для получения файла fabric.png можно использовать следующие функции пакета Image Acquisition Toolbox.

% Использование захватчика изображений, камеры Pulnix TMC-9700
%  и получение данных в формате NTSC.
% vidobj=videoinput('matrox', 1, 'M_NTSC_RGB');
% Окно предварительного просмотра.
% preview(vidobj);
% Захват данных.
% fabric=getsnapshot(vidobj);
% imwrite(fabric, 'fabric.png', 'png');
% Удаление изменений.
% delete(vidobj)
% clear vidobj;
fabric=imread('fabric.png');
figure(1), imshow(fabric), title('Материя');

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

Существует возможность просмотра шести основных цветов изображения: фоновый цвет, красный, зеленый, пурпурный (фиолетовый), желтый и красно-фиолетовый (magenta). Отметим, что визуально эти цвета очень легко различаются между собой. Цветовое пространство L*a*b* (еще известное как CIELAB или CIE L*a*b*) позволяет четко отмечать эти визуальные различия.

Цветовое пространство L*a*b* получено на основе трехцветных значений CIE XYZ. Пространство L*a*b* включает информацию о значении интенсивности 'L*', значении цветности 'a*' (показывает какой цвет выбран на красно-зеленой оси) и значении цветности 'b*' (показывает какой цвет выбран на голубо-желтой оси).

Отметим, что при анализе цветов используются окрестности небольших размеров и при их вычислении берется усреднение в пространстве 'a*b*'. Эти цветовые метки можно использовать при классификации каждого пикселя.

Для упрощения демонстрации примера, считаем координаты области, которые хранятся в MAT-file.

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('Пример красной области');

Преобразуем RGB-изображение материи в L*a*b*-изображение с использованием функций makecform и applycform.

cform=makecform('srgb2lab');
lab_fabric=applycform(fabric, cform);

Вычислим средние значения 'a*' и 'b*' для каждой области представленной roipoly. 
Эти значения могут служить маркерами в пространстве 'a*b*'.

a=lab_fabric(:, :, 2);
b=lab_fabric(:, :, 3);
color_markers=repmat(0, [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*' производится так

disp(sprintf('[%0.3f,%0.3f]', color_markers(2, 1), color_markers(2, 2)));

Шаг 3: Классификация каждого пикселя с использованием принципа ближайшей окрестности.

Каждый цветовой маркер представляется некоторыми значениями 'a*' и 'b*'. Поэтому существует возможность классификации каждого пикселя изображения lab_fabric на основе вычисления евклидового расстояния между пикселем и цветовым маркером. Минимальное евклидовое расстояние соответствует минимальному расстоянию между рассматриваемыми пикселями и маркером. Например, если дистанция между двумя пикселями и красным цветовым маркером является минимальной, то пиксели будут отмечены как красные.

Создадим массив, который содержит цветовые метки, т.е. 0=background, 1=red, 2=green, 3=purple, 4=magenta и 5=yellow.

color_labels=0:nColors-1;

Создадим матрицы с использованием принципа классификации по близлежащей окрестности.

a=double(a);
b=double(b);
distance=repmat(0, [size(a), nColors]);

Выполнение классификации

for count=1:nColors
  distance(:, :, count)=((a-color_markers(count, 1)).^2+...
                      (b-color_markers(count, 2))^2).^0.5;
end
[value, label]=min(distance, [], 3);
label=color_labels(label);
clear value distance;

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

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

rgb_label=repmat(label, [1 1 3]);
segmented_images=repmat(uint8(0), [size(fabric), nColors]);
for count=1:nColors
  color=fabric;
  color(rgb_label~=color_labels(count))=0;
  segmented_images(:, :, :, count)=color;
end 
imshow(segmented_images(:, :, :, 2)), title('Красные объекты');

imshow(segmented_images(:, :, :, 3)), title('Зеленые объекты');

imshow(segmented_images(:, :, :, 4)), title('Фиолетовые объекты');

imshow(segmented_images(:, :, :, 5)), title('Красно-фиолетовые объекты');

imshow(segmented_images(:, :, :, 6)), title('Желтые объекты');

Шаг 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('Размещение сегментированных пикселей в пространстве ''a*b*'' ');
xlabel('''a*'' values');
ylabel('''b*'' values');

В оглавление \ К следующему разделу \ К предыдущему разделу


Поиск по сайту:

Система Orphus

Яндекс.Метрика