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