|
|
||||||||||||||||||||||||||||||||
Вход |
Раздел "Обработка сигналов и изображений\Image Processing Toolbox"
И.М.Журавель "Краткий курс теории обработки изображений" В оглавление \ К следующему разделу \ К предыдущему разделу Сегментация цветных изображений на основе цветового пространства L*a*b* Рассмотрим задачу, основной целью которой является идентификация и анализ различных цветов изображения в пространстве L*a*b*. Изображение получено с помощью пакета Image Acquisition Toolbox. Содержание
Шаг 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'); |
Всероссийская научная конференция "Проектирование научных и инженерных приложений в среде MATLAB" (май 2002 г.)
|
||
На первую страницу \ Сотрудничество \ MathWorks \ SoftLine \ Exponenta.ru \ Exponenta Pro | ||
E-mail: | ||
Информация на сайте была обновлена 11.05.2004 |
Copyright 2001-2004 SoftLine Co Наши баннеры |