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

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

Шаг 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)

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

| | | | | |