이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

마커 제어 워터셰드 분할(Marker-Controlled Watershed Segmentation)

이 예제에서는 워터셰드 분할을 사용하여 영상에서 서로 닿는 객체를 분리하는 방법을 보여줍니다. 서로 닿는 객체를 분리하는 데 워터셰드 변환이 자주 적용됩니다. 워터셰드 변환은 영상을 밝은 픽셀은 높은 곳에, 어두운 픽셀은 낮은 곳에 있는 곡면으로 처리하여, 영상에서 "집수 구역(catchment basin)"과 "워터셰드 능선(watershed ridge line)"을 찾습니다.

전경 객체와 배경 위치를 식별하거나 "표시"할 수 있는 경우에는 워터셰드 변환을 사용한 분할이 더 효과적입니다. 마커 제어 워터셰드 분할의 기본 절차는 다음과 같습니다.

1. 분할 함수를 계산합니다. 아래 영상에서 어두운 영역이 분할할 객체에 해당합니다.

2. 전경 마커를 계산합니다. 전경 마커는 각 객체 내에 있는 픽셀의 연결된 블롭(blob)입니다.

3. 배경 마커를 계산합니다. 배경 마커는 객체에 포함되지 않는 픽셀입니다.

4. 전경과 배경 마커 위치에서 분할 함수가 국소 최솟값만 갖도록 분할 함수를 수정합니다.

5. 수정된 분할 함수의 워터셰드 변환을 계산합니다.

이 예제에서는 imgradient, watershed, label2rgb, labeloverlay, imopen, imclose, imreconstruct, imcomplement, imregionalmax, bwareaopen, graythresh, imimposemin 등 Image Processing Toolbox™의 다양한 함수를 중점적으로 알아보겠습니다.

1단계: 컬러 영상을 읽어 들인 후 회색조 영상으로 변환하기

rgb = imread('pears.png');
I = rgb2gray(rgb);
imshow(I)

text(732,501,'Image courtesy of Corel(R)',...
     'FontSize',7,'HorizontalAlignment','right')

2단계: 기울기 크기를 분할 함수로 사용하기

기울기 크기를 계산합니다. 기울기는 객체 테두리에서 크고 (대체로) 객체 내부에서 작습니다.

gmag = imgradient(I);
imshow(gmag,[])
title('Gradient Magnitude')

기울기 크기에 바로 워터셰드 변형을 사용하여 영상을 분할할 수 있을까요?

L = watershed(gmag);
Lrgb = label2rgb(L);
imshow(Lrgb)
title('Watershed Transform of Gradient Magnitude')

분할할 수 없습니다. 아래의 마커 계산과 같은 추가 전처리 없이 워터셰드 변형을 바로 사용하면 "과다분할(oversegmentation)"이 자주 발생합니다.

3단계: 전경 객체 표시하기

여기서는 전경 마커(각 전경 객체 내에 있는 픽셀의 연결된 블롭이어야 함)를 찾는 데 다양한 절차를 적용할 수 있습니다. 이 예제에서는 영상을 "정리"하기 위해, "재구성에 의한 열기(opening-by-reconstruction)"와 "재구성에 의한 닫기(closing-by-reconstruction)"라는 모폴로지 기법을 사용합니다. 이러한 연산에서 imregionalmax를 사용하여, 각 객체 내에 위치할 수 있는 평탄한 최댓값을 생성할 것입니다.

열기는 침식을 수행한 후 팽창을 수행하는 것이고, 재구성에 의한 열기는 침식을 수행한 후 모폴로지 재구성을 수행하는 것입니다. 두 연산을 비교해 보겠습니다. 먼저, imopen을 사용하여 열기를 계산합니다.

se = strel('disk',20);
Io = imopen(I,se);
imshow(Io)
title('Opening')

그런 다음, imerodeimreconstruct를 사용하여 재구성에 의한 열기를 계산합니다.

Ie = imerode(I,se);
Iobr = imreconstruct(Ie,I);
imshow(Iobr)
title('Opening-by-Reconstruction')

열기를 수행한 후 닫기를 수행하면 검은색 점과 줄기 표시를 제거할 수 있습니다. 표준 모폴로지 닫기와 재구성에 의한 닫기를 비교해 보겠습니다. 먼저 imclose를 사용해 보겠습니다.

Ioc = imclose(Io,se);
imshow(Ioc)
title('Opening-Closing')

이제 imdilateimreconstruct를 차례로 사용해 보겠습니다. imreconstruct의 영상 입력값과 출력값을 보완해야 합니다.

Iobrd = imdilate(Iobr,se);
Iobrcbr = imreconstruct(imcomplement(Iobrd),imcomplement(Iobr));
Iobrcbr = imcomplement(Iobrcbr);
imshow(Iobrcbr)
title('Opening-Closing by Reconstruction')

IobrcbrIoc를 비교하여 알 수 있듯이, 객체의 전반적인 형태에 영향을 주지 않고 사소한 결점을 제거할 때는 재구성 기반의 열기/닫기가 표준 열기/닫기보다 더 효과적입니다. 우수한 전경 마커를 얻기 위해 Iobrcbr의 국부 최댓값을 계산합니다.

fgm = imregionalmax(Iobrcbr);
imshow(fgm)
title('Regional Maxima of Opening-Closing by Reconstruction')

결과를 정확하게 판단할 수 있도록 원본 영상에 전경 마커 영상을 겹쳐 놓습니다.

I2 = labeloverlay(I,fgm);
imshow(I2)
title('Regional Maxima Superimposed on Original Image')

거의 가려지고 그늘진 객체 중 표시되지 않은 객체가 있습니다. 이러한 객체는 최종 결과에서 적절히 분할되지 않습니다. 또한 일부 객체의 전경 마커가 객체 경계에 닿습니다. 따라서 마커 블롭의 경계를 정리한 후 조금 줄어야 합니다. 그렇게 하려면 닫기를 수행한 후 침식을 수행하면 됩니다.

se2 = strel(ones(5,5));
fgm2 = imclose(fgm,se2);
fgm3 = imerode(fgm2,se2);

이 절차는 제 위치를 벗어나 고립된 픽셀을 생기게 합니다. 이러한 픽셀은 제거해야 합니다. 이를 위해, 픽셀 수가 특정 개수보다 작은 모든 블롭을 제거하는 bwareaopen을 사용하면 됩니다.

fgm4 = bwareaopen(fgm3,20);
I3 = labeloverlay(I,fgm4);
imshow(I3)
title('Modified Regional Maxima Superimposed on Original Image')

4단계: 배경 마커 계산하기

이제 배경을 표시해야 합니다. 정리된 영상 Iobrcbr에서 어두운 픽셀은 배경에 속하므로 이진화 연산을 시작할 수 있습니다.

bw = imbinarize(Iobrcbr);
imshow(bw)
title('Thresholded Opening-Closing by Reconstruction')

배경 픽셀은 검은색이지만, 이상적인 것은 배경 마커와 분할하려는 객체의 경계가 너무 가까이 있지 않도록 것입니다. bw 전경의 SKIZ("Skeleton by Influence Zones")를 계산하여 배경을 "가늘게" 만들 것입니다. 그렇게 하려면 bw의 거리 변환에 대한 워터셰드 변환을 계산한 후, 그 결과의 워터셰드 능선(DL == 0)을 찾으면 됩니다.

D = bwdist(bw);
DL = watershed(D);
bgm = DL == 0;
imshow(bgm)
title('Watershed Ridge Lines)')

5단계: 분할 함수에 대한 워터셰드 변환 계산하기

함수 imimposemin을 사용하여, 원하는 특정 위치에만 국부 최솟값이 오도록 영상을 수정할 수 있습니다. 여기서는 imimposemin을 사용하여, 전경과 배경 마커 픽셀에 유일한 국부 최솟값이 오도록 기울기 크기 영상을 수정할 수 있습니다.

gmag2 = imimposemin(gmag, bgm | fgm4);

이제 워터셰드 기반 분할을 계산할 준비가 끝났습니다.

L = watershed(gmag2);

6단계: 결과 시각화하기

한 가지 시각화 기법은 원본 영상에 전경 마커와 배경 마커, 분할된 객체 경계선을 겹쳐 놓는 것입니다. 객체 경계선과 같은 특성을 시각적으로 더 두드러지게 하려면, 필요에 따라 팽창을 사용할 수 있습니다. 객체 경계선은 L == 0인 곳에 위치합니다. 이진 전경 마커와 이진 배경 마커는 서로 다른 정수 값으로 스케일링되므로 두 마커에 서로 다른 레이블이 할당됩니다.

labels = imdilate(L==0,ones(3,3)) + 2*bgm + 3*fgm4;
I4 = labeloverlay(I,labels);
imshow(I4)
title('Markers and Object Boundaries Superimposed on Original Image')

이 시각화는 전경과 배경 마커의 위치가 결과에 어떤 영향을 주는지 보여줍니다. 몇몇 위치에서 일부 가려진 어두운 객체가 밝은 이웃 객체에 병합되었습니다. 가려진 객체는 전경 마커가 없기 때문입니다.

유용한 다른 시각화 기법은 레이블 행렬을 컬러 영상으로 표시하는 것입니다. label2rgb를 사용하여, 시각화를 위해 레이블 행렬(예: watershedbwlabel에서 생성된 레이블 행렬)을 트루컬러 영상으로 변환할 수 있습니다.

Lrgb = label2rgb(L,'jet','w','shuffle');
imshow(Lrgb)
title('Colored Watershed Label Matrix')

투명도를 사용하여, 이 의사색상 레이블 행렬을 원본 명암 영상 위에 겹쳐 놓을 수 있습니다.

figure
imshow(I)
hold on
himage = imshow(Lrgb);
himage.AlphaData = 0.3;
title('Colored Labels Superimposed Transparently on Original Image')

참고 항목

| | | | | | | | | | | |