이 페이지의 내용은 이전 릴리스에 관한 것입니다. 해당 영문 페이지는 최신 릴리스에서 제거되었습니다.

텍스처 필터를 사용한 텍스처 분할

이 예제에서는 텍스처 분할을 사용하여 영역의 텍스처를 기준으로 영역을 식별하는 방법을 보여줍니다. 텍스처 필터를 사용하여 영상에 있는 두 가지 종류의 직물을 분할하는 것이 목적입니다.

1단계: 영상 읽어 들이기

bag.png를 읽어 들입니다.

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

2단계: 텍스처 영상 만들기

entropyfilt를 사용하여 텍스처 영상을 만듭니다. 함수 entropyfilt는 배열을 반환합니다. 여기서 각 출력 픽셀은 입력 영상 I의 해당 픽셀 주변의 9x9 이웃에 있는 엔트로피 값을 포함합니다. 엔트로피는 임의성에 대한 통계적 측정값입니다.

E = entropyfilt(I);

텍스처 영상 E의 값이 double형 영상의 디폴트 범위에 속하도록 rescale을 사용하여 텍스처 영상을 다시 스케일링합니다.

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

3단계: 하단 텍스처의 대략적인 마스크 만들기

다시 스케일링한 영상 Eim을 텍스처 분할을 위해 이진화(임계값 기준으로 흑과 백으로 나누기)합니다. 두 텍스처의 경계에 있는 픽셀의 대략적인 명암 값 0.8이 임계값으로 선택됩니다.

BW1 = imbinarize(Eim, .8);
imshow(BW1);

figure
imshow(I)

이진 영상 BW1에서 분할된 객체는 흰색입니다. BW1I를 비교하면, 상단 텍스처는 과도하게 분할(흰색 객체 중복)되었고 하단 텍스처는 거의 완벽하게 분할되었음을 알 수 있습니다. bwareaopen을 사용하여 하단 텍스처를 추출할 수 있습니다.

BWao = bwareaopen(BW1,2000);
imshow(BWao)

imclose를 사용하여 BWao에 있는 객체의 가장자리를 매끄럽게 만들고 열린 구멍을 메웁니다. entropyfilt에서 9x9 이웃이 사용되었기 때문에 여기에서도 이 이웃을 선택합니다.

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);

BW2I를 비교하면 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 대신에 stdfiltrangefilt를 다른 모폴로지 함수와 함께 사용하여 비슷한 분할 결과를 얻을 수 있습니다.

S = stdfilt(I,nhood);
imshow(rescale(S))

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