Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Краткий курс теории обработки изображений.doc
Скачиваний:
34
Добавлен:
01.07.2025
Размер:
8 Мб
Скачать
☆

Imshow(he), title('h&e изображение');

text(size(he, 2),size(he, 1)+15,...

'Image courtesy of Alan Partin, Johns Hopkins University', ...

'FontSize',7,'HorizontalAlignment','right');

Шаг 2: Преобразование изображения из цветовой системы RGB в цветовую систему L*a*b*.

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

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

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

cform=makecform('srgb2lab');

lab_he=applycform(he, cform);

Шаг 3: Классификация цветов в пространстве 'a*b*' с использованием кластеризации (метод k-средних).

Кластеризация приводит до разделения объектов на группы. Кластеризация методом k-средних приводит также к локализации объектов в пространстве. Поиск разделения, т.е. какой объект к какому классу принадлежит, происходит на основе анализа метрического расстояния между объектами.

Далее на основании информации о цветах в пространстве 'a*b*', каждому пикселю объекта присваивается значение 'a*' и 'b*'. Используем кластеризацию методом k-средних для разделения объектов на три кластера. Для этого используем евклидовую метрику.

ab=double(lab_he(:, :, 2:3));

nrows=size(ab, 1);

ncols=size(ab, 2);

ab=reshape(ab, nrows*ncols, 2);

nColors=3;

[cluster_idx cluster_center]=kmeans(ab, nColors, 'distance', 'sqEuclidean', ...

'Replicates',3);

Шаг 4: Присвоение меток каждому пикселю изображения на основе метода k-средних.

Для каждого объекта на исходном изображении метод k-средних возвращает индекс соответствующего кластера. Значение параметра cluster_center, которое получено в результате применения метода k-средних будет использовано при дальнейшей демонстрации метода. Отметим пиксели, которые содержаться в cluster_index.

pixel_labels=reshape(cluster_idx, nrows,ncols);

imshow(pixel_labels, []), title('изображение, отмеченное кластерными индексами');

Шаг 5: Создание сегментированного изображения на основе цветного.

Используя параметр pixel_labels, можно разделить объекты на изображении hestain.png по цветах.

segmented_images=cell(1, 3);

rgb_label=repmat(pixel_labels, [1 1 3]);

for k=1 : nColors

color=he;

color(rgb_label~=k)=0;

segmented_images{k}=color;

end

imshow(segmented_images{1}), title('объекты в кластере 1');

imshow(segmented_images{2}), title('объекты в кластере 2');

mshow(segmented_images{3}), title('объекты в кластере 3');

Шаг 6: Сегментация ядер на основании отдельного изображения.

Рассмотрим изображение, которое содержит синие объекты. Отметим, что они являются темно-синими и светло-синими. Используя значение 'L*' в цветовом пространстве L*a*b* можно отделить темно-синие объекты от светло-синих.

Напомним, что параметр 'L*' содержит значения интенсивностей для каждого цвета. Найдем кластеры, которые содержат синие объекты. Получим значения интенсивностей объектов в этом кластере и обработаем их пороговым методом с использованием функции im2bw.

Параметр cluster_center содержит среднее значение 'a*' и 'b*' для каждого кластера. Синий кластер имеет второе наибольшее значение cluster_center.

mean_cluster_val=zeros(3, 1);

for k=1:nColors

mean_cluster_val(k)=mean(cluster_center(k));

end

[mean_cluster_val,idx]=sort(mean_cluster_val);

blue_cluster_num=idx(2);

L=lab_he(:, :, 1);

blue_idx=find(pixel_labels==blue_cluster_num);

L_blue=L(blue_idx);

is_light_blue=im2bw(L_blue,graythresh(L_blue));

Используем маску is_light_blue для того, чтобы пометить те пиксели, которые являются частью синего ядра. Отобразим синие ядра на разделенном изображении.

nuclei_labels=repmat(uint8(0), [nrows ncols]);

nuclei_labels(blue_idx(is_light_blue==false))=1;

nuclei_labels=repmat(nuclei_labels, [1 1 3]);

blue_nuclei=he;

blue_nuclei(nuclei_labels~=1)=0;

imshow(blue_nuclei), title('синие ядра');

Сегментация цветных изображений на основе цветового пространства 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('Материя');