Текстурируйте сегментацию Используя фильтры структуры

Этот пример показывает, как использовать сегментацию структуры, чтобы идентифицировать области на основе их структуры. Ваша цель состоит в том, чтобы сегментировать два вида матрицы в изображении с помощью фильтров структуры.

Шаг 1: Readimage

Читайте в bag.png.

I = imread('bag.png');
figure
imshow(I)

Шаг 2: создайте изображение структуры

Используйте entropyfilt, чтобы создать изображение структуры. Функциональный entropyfilt возвращает массив, где каждый выходной пиксель содержит энтропийное значение 9 9, окружение вокруг соответствующего пикселя во входе отображает I. Энтропия является статистической мерой случайности.

E = entropyfilt(I);

Используйте rescale, чтобы повторно масштабироваться, структура отображают E так, чтобы его значения были в области значений по умолчанию для двойного изображения.

Eim = rescale(E);
figure
imshow(Eim)

Шаг 3: создайте грубую маску для нижней структуры

Порог перемасштабированное изображение 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');

Шаг 4: использование грубая маска, чтобы сегментировать главную структуру

Сравните двухуровневое изображение 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)

Шаг 5: отобразите результаты сегментации

Используйте 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)

Смотрите также

| | | | | |