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