В этом примере показано, как идентифицировать и сегментировать области на основе их структуры.
Считайте и отобразите полутоновое изображение текстурированных шаблонов на сумке.
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')
bwareaopen
| bwperim
| entropyfilt
| imbinarize
| imclose
| imfill
| rangefilt