В этом примере показано, как идентифицировать и сегментировать области на основе их текстуры.
Чтение и отображение полутонового изображения текстурированных шаблонов на сумке.
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