Текстурируйте сегментацию Используя фильтры структуры

В этом примере показано, как идентифицировать и сегментировать области на основе их структуры.

Readimage

Считайте и отобразите полутоновое изображение текстурированных шаблонов на сумке.

I = imread('bag.png');
imshow(I)
title('Original Image')

Создайте изображение структуры

Используйте entropyfilt создать изображение структуры. Функциональный entropyfilt возвращает массив, где каждый выходной пиксель содержит энтропийное значение 9 9, окружение вокруг соответствующего пикселя во входе отображает I. Энтропия является статистической мерой случайности.

Можно также использовать stdfilt и rangefilt достигнуть подобных результатов сегментации. Для сравнения с изображением структуры локальной энтропии создайте изображения структуры S и R показ локального стандартного отклонения и локальной области значений, соответственно.

E = entropyfilt(I);
S = stdfilt(I,ones(9));
R = rangefilt(I,ones(9));

Используйте rescale перемасштабировать структуру отображает E и S так, чтобы пиксельными значениями был в области значений [0, 1], как ожидается изображений типа данных double.

Eim = rescale(E);
Sim = rescale(S);

Отобразите три изображения структуры в монтаже.

montage({Eim,Sim,R},'Size',[1 3],'BackgroundColor','w',"BorderSize",20)
title('Texture Images Showing Local Entropy, Local Standard Deviation, and Local Range')

Создайте маску для нижней структуры

Этот пример продолжается путем обработки энтропийного изображения структуры Eim. Можно повторить подобный процесс для других двух типов изображений структуры с другими морфологическими функциями, чтобы достигнуть подобных результатов сегментации.

Порог перемасштабированное изображение Eim сегментировать структуры. Пороговое значение 0,8 выбрано, потому что это - примерно значение интенсивности пикселей вдоль контура между структурами.

BW1 = imbinarize(Eim,0.8);
imshow(BW1)
title('Thresholded Texture Image')

Сегментированные объекты в двухуровневом изображении BW1 являются белыми. Если вы сравниваете BW1 к I, вы замечаете, что главная структура чрезмерно сегментируется (несколько белых объектов), и нижняя структура сегментируется почти в целом. Удалите объекты в главной структуре при помощи bwareaopen.

BWao = bwareaopen(BW1,2000);
imshow(BWao)
title('Area-Opened Texture Image')

Используйте imclose сглаживать ребра и закрыть любые открытые отверстия в объекте в BWao. Задайте то же самое 9 9 окружение, которое использовалось entropyfilt.

nhood = ones(9);
closeBWao = imclose(BWao,nhood);
imshow(closeBWao)
title('Closed Texture Image')

Используйте imfill заполнять отверстия в объекте в closeBWao. Маска для нижней структуры не совершенна, потому что маска не расширяет к нижней части изображения. Однако можно использовать маску, чтобы сегментировать структуры.

mask = imfill(closeBWao,'holes');
imshow(mask);
title('Mask of Bottom Texture')

Используйте маску, чтобы сегментировать структуры

Разделите структуры на два различных изображения.

textureTop = I;
textureTop(mask) = 0;
textureBottom = I;
textureBottom(~mask) = 0;
montage({textureTop,textureBottom},'Size',[1 2],'BackgroundColor','w',"BorderSize",20)
title('Segmented Top Texture (Left) and Segmented Bottom Texture (Right)')

Отобразите результаты сегментации

Создайте матрицу метки, которая имеет маркировать 1, где маской является false и маркировать 2, где маской является true. Наложите матрицу метки на оригинальном изображении.

L = mask+1;
imshow(labeloverlay(I,L))
title('Labeled Segmentation Regions')

Обрисуйте в общих чертах контур между двумя структурами в голубом цвете.

boundary = bwperim(mask);
imshow(labeloverlay(I,boundary,"Colormap",[0 1 1]))
title('Boundary Between Textures')

Смотрите также

| | | | | |