Main Content

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

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

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

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

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

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

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

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

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

rgb = imread("pears.png");
I = im2gray(rgb);
imshow(I)

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

Figure contains an axes object. The axes object contains 2 objects of type image, text.

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

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

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

Figure contains an axes object. The axes object with title Gradient Magnitude contains an object of type image.

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

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

Figure contains an axes object. The axes object with title Watershed Transform of Gradient Magnitude contains an object of type image.

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

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

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

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

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

Figure contains an axes object. The axes object with title Opening contains an object of type image.

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

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

Figure contains an axes object. The axes object with title Opening-by-Reconstruction contains an object of type image.

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

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

Figure contains an axes object. The axes object with title Opening-Closing contains an object of type image.

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

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

Figure contains an axes object. The axes object with title Opening-Closing by Reconstruction contains an object of type image.

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

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

Figure contains an axes object. The axes object with title Regional Maxima of Opening-Closing by Reconstruction contains an object of type image.

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

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

Figure contains an axes object. The axes object with title Regional Maxima Superimposed on Original Image contains an object of type 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")

Figure contains an axes object. The axes object with title Modified Regional Maxima Superimposed on Original Image contains an object of type image.

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

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

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

Figure contains an axes object. The axes object with title Thresholded Opening-Closing by Reconstruction contains an object of type image.

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

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

Figure contains an axes object. The axes object with title Watershed Ridge Lines contains an object of type image.

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

Figure contains an axes object. The axes object with title Markers and Object Boundaries Superimposed on Original Image contains an object of type image.

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

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

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

Figure contains an axes object. The axes object with title Colored Watershed Label Matrix contains an object of type image.

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

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

Figure contains an axes object. The axes object with title Colored Labels Superimposed Transparently on Original Image contains 2 objects of type image.

참고 항목

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