Сегментация текстуры с использованием текстурных фильтров

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

Чтение изображения

Чтение и отображение полутонового изображения текстурированных шаблонов на сумке.

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

Figure contains an axes. The axes with title Original Image contains an object of type 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')

Figure contains an axes. The axes with title Texture Images Showing Local Entropy, Local Standard Deviation, and Local Range contains an object of type image.

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

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

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

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

Figure contains an axes. The axes with title Thresholded Texture Image contains an object of type image.

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

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

Figure contains an axes. The axes with title Area-Opened Texture Image contains an object of type image.

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

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

Figure contains an axes. The axes with title Closed Texture Image contains an object of type image.

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

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

Figure contains an axes. The axes with title Mask of Bottom Texture contains an object of type image.

Использование маски для сегментации текстур

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

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)')

Figure contains an axes. The axes with title Segmented Top Texture (Left) and Segmented Bottom Texture (Right) contains an object of type image.

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

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

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

Figure contains an axes. The axes with title Labeled Segmentation Regions contains an object of type image.

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

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

Figure contains an axes. The axes with title Boundary Between Textures contains an object of type image.

См. также

| | | | | |