주요 콘텐츠

watershed

워터셰드 변환

설명

워터셰드 변환은 영상을 밝은 픽셀은 높은 고도를, 어두운 픽셀은 낮은 고도를 나타내는 곡면으로 처리하여, 영상에서 "집수 구역(catchment basin)" 또는 "워터셰드 능선(watershed ridge line)"을 찾습니다. 워터셰드 변환은 인접 관심 영역을 고유한 개별 객체로 분할하는 데 사용할 수 있습니다.

L = watershed(A)는 입력 행렬 A의 워터셰드 영역을 식별하는 레이블 행렬 L을 반환합니다.

예제

L = watershed(A,conn)은 워터셰드 계산에 사용할 연결성을 지정합니다.

예제

모두 축소

겹쳐진 2개의 원형 객체를 포함하는 이진 영상을 만듭니다. 영상을 표시합니다.

center1 = -40;
center2 = -center1;
dist = sqrt(2*(2*center1)^2);
radius = dist/2 * 1.4;
lims = [floor(center1-1.2*radius) ceil(center2+1.2*radius)];
[x,y] = meshgrid(lims(1):lims(2));
bw1 = sqrt((x-center1).^2 + (y-center1).^2) <= radius;
bw2 = sqrt((x-center2).^2 + (y-center2).^2) <= radius;
bw = bw1 | bw2;
imshow(bw)
title('Binary Image with Overlapping Objects')

Figure contains an axes object. The hidden axes object with title Binary Image with Overlapping Objects contains an object of type image.

이진 영상의 반전 영상에 대한 거리 변환을 계산합니다. 출력 영상에 있는 각 픽셀의 값은 그 픽셀과 bw의 0이 아닌 최근접 픽셀 간의 거리입니다.

D = bwdist(~bw);
imshow(D,[])
title('Distance Transform of Binary Image')

Figure contains an axes object. The hidden axes object with title Distance Transform of Binary Image contains an object of type image.

거리 변환 영상을 반전하여 워터셰드 변환을 위해 밝은 픽셀은 높은 고도를, 어두운 픽셀은 낮은 고도를 나타내게 합니다.

D = -D;
imshow(D,[])
title('Complement of Distance Transform')

Figure contains an axes object. The hidden axes object with title Complement of Distance Transform contains an object of type image.

워터셰드 변환을 계산합니다. ROI의 바깥에 있는 픽셀을 0으로 설정합니다.

L = watershed(D);
L(~bw) = 0;

결과로 나타나는 레이블 행렬을 RGB 영상으로 표시합니다.

rgb = label2rgb(L,'jet',[.5 .5 .5]);
imshow(rgb)
title('Watershed Transform')

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

겹쳐진 2개의 구를 포함하는 3차원 이진 영상을 만듭니다.

center1 = -10;
center2 = -center1;
dist = sqrt(3*(2*center1)^2);
radius = dist/2 * 1.4;
lims = [floor(center1-1.2*radius) ceil(center2+1.2*radius)];
[x,y,z] = meshgrid(lims(1):lims(2));
bw1 = sqrt((x-center1).^2 + (y-center1).^2 + ...
           (z-center1).^2) <= radius;
bw2 = sqrt((x-center2).^2 + (y-center2).^2 + ...
           (z-center2).^2) <= radius;
bw = bw1 | bw2;
figure, isosurface(x,y,z,bw,0.5), axis equal, title('BW')
xlabel x, ylabel y, zlabel z
xlim(lims), ylim(lims), zlim(lims)
view(3), camlight, lighting gouraud

Figure contains an axes object. The axes object with title BW, xlabel x, ylabel y contains an object of type patch.

거리 변환을 계산합니다.

D = bwdist(~bw);
figure, isosurface(x,y,z,D,radius/2), axis equal
title('Isosurface of distance transform')
xlabel x, ylabel y, zlabel z
xlim(lims), ylim(lims), zlim(lims)
view(3), camlight, lighting gouraud

Figure contains an axes object. The axes object with title Isosurface of distance transform, xlabel x, ylabel y contains an object of type patch.

거리 변환의 보수를 계산하고 객체가 아닌 픽셀을 강제로 Inf로 설정한 다음, 워터셰드 변환을 계산합니다.

D = -D;
D(~bw) = Inf;
L = watershed(D);
L(~bw) = 0;
figure
isosurface(x,y,z,L==1,0.5)
isosurface(x,y,z,L==2,0.5)
axis equal
title('Segmented objects')
xlabel x, ylabel y, zlabel z
xlim(lims), ylim(lims), zlim(lims)
view(3), camlight, lighting gouraud

Figure contains an axes object. The axes object with title Segmented objects, xlabel x, ylabel y contains 2 objects of type patch.

얕은 국부 최솟값을 억제하면 워터셰드 분할에서 과다분할을 방지할 수 있습니다.

분할을 적용할 RGB 배 영상을 불러옵니다. 영상을 회색조로 변환하고 표시합니다. 각각의 배에서 가운데 부분이 밝으며 이 지점이 국부 최댓값에 해당합니다.

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

Figure contains an axes object. The hidden axes object contains an object of type image.

워터셰드 분할에서는 영상을 워터셰드 선(watershed line)과 집수 구역(catchment basin)으로 이루어진 곡면에 비유할 수 있습니다. 물이 곡면으로 흐르면 집수 구역에 고이게 됩니다. 회색조 영상에서 국소 최솟값이 집수 구역에 해당합니다. 배를 분할하려면 배의 가운데 부분이 국부 최솟값이 되도록 영상을 반전합니다.

Icomp = imcomplement(I);
imshow(Icomp)

Figure contains an axes object. The hidden axes object contains an object of type image.

반전된 영상을 3차원 곡면으로 표시합니다. 여기서 각 픽셀의 3차원이 명암 값을 나타냅니다. 각 배마다 뽀족한 바닥을 가진 깊은 영역이 있으며, 이는 마치 물이 고이는 집수 구역처럼 얕은 국부 최솟값이 많이 있음을 나타냅니다.

surf(Icomp,EdgeColor="none")
colormap(gray)

Figure contains an axes object. The axes object contains an object of type surface.

필터링되지 않은 영상을 분할하고 결과를 레이블 오버레이로 표시합니다. 영상이 과다분할되어, 각 배마다 하나의 마스크 대신에 다수의 작은 마스크가 있습니다.

L = watershed(Icomp);
overlay = labeloverlay(I,L);
imshow(overlay)

Figure contains an axes object. The hidden axes object contains an object of type image.

H-minima 변환을 적용하여 얕은 최솟값을 억제합니다. 아래의 h 값은 시행착오를 거쳐 결정된 것입니다. 값을 변경하면서 h 값이 분할 결과에 어떤 영향을 미치는지 살펴봅니다.

h = 30;
Ifilt = imhmin(Icomp,h);

필터링된 영상을 3차원 곡면으로 표시합니다.

surf(Ifilt,EdgeColor="none")
colormap(gray)

Figure contains an axes object. The axes object contains an object of type surface.

필터링된 영상을 분할하고 결과를 표시합니다. 이 영상에서는 각 배마다 전경에 마스크를 대략 하나씩 가지고 있습니다.

Lfilt = watershed(Ifilt);
overlayfilt = labeloverlay(I,Lfilt);
imshow(overlayfilt)

Figure contains an axes object. The hidden axes object contains an object of type image.

입력 인수

모두 축소

입력 영상으로, 임의 차원의 숫자형 배열 또는 논리형 배열로 지정됩니다.

데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical

픽셀 연결성으로, 다음 표에 있는 값 중 하나로 지정됩니다. 디폴트 연결성은 2차원 영상의 경우 8, 3차원 영상의 경우 26입니다.

의미

2차원 연결성

4

경계가 서로 닿으면 픽셀이 연결됩니다. 픽셀의 이웃은 가로 또는 세로 방향으로 인접한 픽셀입니다.

3-by-3 pixel neighborhood with four pixels connected to the center pixel

현재 픽셀은 회색으로 표시됩니다.

8

경계 또는 코너가 서로 닿으면 픽셀이 연결됩니다. 픽셀의 이웃은 가로, 세로 또는 대각선 방향으로 인접한 픽셀입니다.

3-by-3 pixel neighborhood with 8 pixels connected to the center pixel

현재 픽셀은 회색으로 표시됩니다.

3차원 연결성

6

면이 서로 닿으면 픽셀이 연결됩니다. 픽셀의 이웃은 다음 방향으로 인접한 픽셀입니다.

  • 안쪽, 바깥쪽, 왼쪽, 오른쪽, 위쪽, 아래쪽 방향 중 하나

3-by-3-by-3 pixel neighborhood with 6 pixels connected to the faces of the center pixel

현재 픽셀은 회색으로 표시됩니다.

18

면 또는 경계가 서로 닿으면 픽셀이 연결됩니다. 픽셀의 이웃은 다음 방향으로 인접한 픽셀입니다.

  • 안쪽, 바깥쪽, 왼쪽, 오른쪽, 위쪽, 아래쪽 방향 중 하나

  • 두 방향의 조합(예: 오른쪽-아래쪽 또는 안쪽-위쪽)

3-by-3-by-3 pixel neighborhood with 6 pixels connected to the faces and 12 pixels connected to the edges of the center pixel

현재 픽셀은 큐브의 중앙입니다.

26

면, 경계 또는 코너가 서로 닿으면 픽셀이 연결됩니다. 픽셀의 이웃은 다음 방향으로 인접한 픽셀입니다.

  • 안쪽, 바깥쪽, 왼쪽, 오른쪽, 위쪽, 아래쪽 방향 중 하나

  • 두 방향의 조합(예: 오른쪽-아래쪽 또는 안쪽-위쪽)

  • 세 방향의 조합(예: 안쪽-오른쪽-위쪽 또는 안쪽 -왼쪽-아래쪽)

3-by-3-by-3 pixel neighborhood with 6 pixels connected to the faces, 12 pixels connected to the edges, and 8 pixels connected to the corners of the center pixel

현재 픽셀은 큐브의 중앙입니다.

더 높은 차원의 경우, watershed는 디폴트 값 conndef(ndims(A),"maximal")을 사용합니다.

01로 구성된 3×3×...×3 행렬을 지정하여 모든 차원에 대해 더 일반적인 방식으로 연결성을 정의할 수도 있습니다. 값이 1인 요소는 conn의 중앙 요소를 기준으로 하여 이웃 픽셀의 위치를 정의합니다. conn은 그 중앙 요소를 기준으로 대칭이어야 합니다. 자세한 내용은 사용자 지정된 연결성 지정하기 항목을 참조하십시오.

참고

디폴트가 아닌 연결성을 지정할 경우 영상의 경계에 있는 픽셀이 테두리 픽셀로 간주되지 않을 수 있습니다. 예를 들어, conn = [0 0 0; 1 1 1; 0 0 0]이면 이 연결성 정의에 따라 첫 번째 행과 마지막 행의 요소들은 영상 범위를 벗어난 영역과 연결되지 않기 때문에 테두리 픽셀로 간주되지 않습니다.

데이터형: double | logical

출력 인수

모두 축소

레이블 행렬로, 음이 아닌 정수로 구성된 숫자형 배열로 지정됩니다. 레이블이 0으로 지정된 요소는 고유한 워터셰드 영역에 속하지 않습니다. 레이블이 1로 지정된 요소는 첫 번째 워터셰드 영역에, 레이블이 2로 지정된 요소는 두 번째 워터셰드 영역에 속하는 식입니다.

  • 과다분할을 방지하려면 imhmin 함수를 사용하여 영상에서 얕은 최솟값을 제거한 후에 watershed 함수를 사용하십시오.

알고리즘

watershed는 페르난드 메이어(Fernand Meyer) 알고리즘([1])을 사용합니다.

참고 문헌

[1] Meyer, Fernand, "Topographic distance and watershed lines,” Signal Processing , Vol. 38, July 1994, pp. 113-125.

확장 기능

모두 확장

버전 내역

R2006a 이전에 개발됨

모두 확장