Этот пример показывает, как использовать сегментацию структуры, чтобы идентифицировать области на основе их структуры. Ваша цель состоит в том, чтобы сегментировать два вида матрицы в изображении с помощью фильтров структуры.
Читайте в bag.png.
I = imread('bag.png');
figure
imshow(I)
Используйте entropyfilt, чтобы создать изображение структуры. Функциональный entropyfilt возвращает массив, где каждый выходной пиксель содержит энтропийное значение 9 9, окружение вокруг соответствующего пикселя во входе отображает I. Энтропия является статистической мерой случайности.
E = entropyfilt(I);
Используйте rescale, чтобы повторно масштабироваться, структура отображают E так, чтобы его значения были в области значений по умолчанию для двойного изображения.
Eim = rescale(E); figure imshow(Eim)

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

figure imshow(I)

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

Используйте imclose, чтобы сглаживать ребра и закрыть любые открытые дыры в объекте в BWao. 9 9 окружение выбрано, потому что это окружение также использовалось entropyfilt.
nhood = true(9); closeBWao = imclose(BWao,nhood); imshow(closeBWao)

Используйте imfill, чтобы заполнить дыры в объекте в closeBWao.
roughMask = imfill(closeBWao,'holes');Сравните двухуровневое изображение roughMask с оригинальным изображением I. Заметьте, что маска для нижней структуры не совершенна, потому что маска не расширяет к нижней части изображения. Однако можно использовать roughMask, чтобы сегментировать главную структуру.
imshow(roughMask);

figure imshow(I)

Получите необработанное изображение главной структуры с помощью roughMask.
I2 = I; I2(roughMask) = 0; imshow(I2)

Используйте entropyfilt, чтобы вычислить изображение структуры.
E2 = entropyfilt(I2); E2im = rescale(E2); imshow(E2im)

Порог E2im с помощью глобального порога.
BW2 = imbinarize(E2im); imshow(BW2)

figure, imshow(I);

Если вы сравниваете BW2 с I, вы замечаете, что существует два объекта, сегментированные в BW2. Используйте bwareaopen, чтобы получить маску для главной структуры.
mask2 = bwareaopen(BW2,1000); imshow(mask2)

Используйте mask2, чтобы извлечь верхнюю и нижнюю структуру от I.
texture1 = I; texture1(~mask2) = 0; texture2 = I; texture2(mask2) = 0;
imshow(texture1)

figure imshow(texture2)

Обрисуйте в общих чертах контур между двумя структурами.
boundary = bwperim(mask2); segmentResults = I; segmentResults(boundary) = 255; imshow(segmentResults)

Вместо entropyfilt можно использовать stdfilt и rangefilt с другими морфологическими функциями, чтобы достигнуть подобных результатов сегментации.
S = stdfilt(I,nhood); imshow(rescale(S))

R = rangefilt(I,ones(5)); imshow(R)

bwareaopen | bwperim | entropyfilt | imbinarize | imclose | imfill | rangefilt