watershed
워터셰드 변환
설명
워터셰드 변환은 영상을 밝은 픽셀은 높은 고도를, 어두운 픽셀은 낮은 고도를 나타내는 곡면으로 처리하여, 영상에서 "집수 구역(catchment basin)" 또는 "워터셰드 능선(watershed ridge line)"을 찾습니다. 워터셰드 변환은 인접 관심 영역을 고유한 개별 객체로 분할하는 데 사용할 수 있습니다.
예제
워터셰드 변환을 계산한 후 결과로 나타나는 레이블 행렬 표시하기
겹쳐진 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')
이진 영상의 반전 영상에 대한 거리 변환을 계산합니다. 출력 영상에 있는 각 픽셀의 값은 그 픽셀과 bw
의 0이 아닌 최근접 픽셀 간의 거리입니다.
D = bwdist(~bw);
imshow(D,[])
title('Distance Transform of Binary Image')
거리 변환 영상을 반전하여 워터셰드 변환을 위해 밝은 픽셀은 높은 고도를, 어두운 픽셀은 낮은 고도를 나타내게 합니다.
D = -D;
imshow(D,[])
title('Complement of Distance Transform')
워터셰드 변환을 계산합니다. ROI의 바깥에 있는 픽셀을 0
으로 설정합니다.
L = watershed(D); L(~bw) = 0;
결과로 나타나는 레이블 행렬을 RGB 영상으로 표시합니다.
rgb = label2rgb(L,'jet',[.5 .5 .5]); imshow(rgb) title('Watershed Transform')
3차원 이진 영상의 워터셰드 변환 계산하기
겹쳐진 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
거리 변환을 계산합니다.
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
거리 변환의 보수를 계산하고 객체가 아닌 픽셀을 강제로 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
입력 인수
A
— 입력 영상
숫자형 배열 | 논리형 배열
입력 영상으로, 임의 차원의 숫자형 배열 또는 논리형 배열로 지정됩니다.
데이터형: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| logical
conn
— 픽셀 연결성
4
| 8
| 6
| 18
| 26
| 0
과 1
로 구성된 3×3×...×3 행렬
픽셀 연결성으로, 다음 표에 있는 값 중 하나로 지정됩니다. 디폴트 연결성은 2차원 영상의 경우 8
, 3차원 영상의 경우 26
입니다.
값 | 의미 | |
---|---|---|
2차원 연결성 | ||
| 경계가 서로 닿으면 픽셀이 연결됩니다. 픽셀의 이웃은 가로 또는 세로 방향으로 인접한 픽셀입니다. |
현재 픽셀은 회색으로 표시됩니다. |
| 경계 또는 코너가 서로 닿으면 픽셀이 연결됩니다. 픽셀의 이웃은 가로, 세로 또는 대각선 방향으로 인접한 픽셀입니다. |
현재 픽셀은 회색으로 표시됩니다. |
3차원 연결성 | ||
| 면이 서로 닿으면 픽셀이 연결됩니다. 픽셀의 이웃은 다음 방향으로 인접한 픽셀입니다.
|
현재 픽셀은 회색으로 표시됩니다. |
| 면 또는 경계가 서로 닿으면 픽셀이 연결됩니다. 픽셀의 이웃은 다음 방향으로 인접한 픽셀입니다.
|
현재 픽셀은 큐브의 중앙입니다. |
| 면, 경계 또는 코너가 서로 닿으면 픽셀이 연결됩니다. 픽셀의 이웃은 다음 방향으로 인접한 픽셀입니다.
|
현재 픽셀은 큐브의 중앙입니다. |
더 높은 차원의 경우, watershed
는 디폴트 값
을 사용합니다.conndef
(ndims(A),'maximal')
0
과 1
로 구성된 3×3×...×3 행렬을 지정하여 모든 차원에 대해 더 일반적인 방식으로 연결성을 정의할 수도 있습니다. 값이 1
인 요소는 conn
의 중앙 요소를 기준으로 하여 이웃 픽셀의 위치를 정의합니다. conn
은 그 중앙 요소를 기준으로 대칭이어야 합니다. 자세한 내용은 Specifying Custom Connectivities 항목을 참조하십시오.
참고
디폴트 값이 아닌 연결성을 지정할 경우, 영상 경계에 있는 픽셀은 테두리 픽셀로 간주되지 않을 수 있습니다. 예를 들어, conn = [0 0 0; 1 1 1; 0 0 0]
이면 이 연결성 정의에 따라 첫 번째 행과 마지막 행의 요소들은 영상 범위를 벗어난 영역과 연결되지 않기 때문에 테두리 픽셀로 간주되지 않습니다.
데이터형: double
| logical
출력 인수
L
— 레이블 행렬
음이 아닌 정수로 구성된 숫자형 배열
레이블 행렬로, 음이 아닌 정수로 구성된 숫자형 배열로 지정됩니다. 레이블이 0
으로 지정된 요소는 고유한 워터셰드 영역에 속하지 않습니다. 레이블이 1
로 지정된 요소는 첫 번째 워터셰드 영역에, 레이블이 2로 지정된 요소는 두 번째 워터셰드 영역에 속하는 식입니다.
팁
이 함수에서 사용되는 워터셰드 변환 알고리즘은 Image Processing Toolbox™의 버전 5.4(R2007a)에서 변경되었습니다. 이전 알고리즘은 서로 인접하지 않은 워터셰드 구역에 레이블을 지정하는 경우가 있었습니다. 이전 알고리즘과 동일한 결과를 얻어야 하는 경우에는 함수
watershed_old
를 사용하십시오.과다분할을 방지하려면
imhmin
함수를 사용하여 영상에서 얕은 최솟값을 제거한 후에watershed
함수를 사용하십시오.
알고리즘
watershed
는 페르난드 메이어(Fernand Meyer) 알고리즘([1])을 사용합니다.
참고 문헌
[1] Meyer, Fernand, "Topographic distance and watershed lines,” Signal Processing , Vol. 38, July 1994, pp. 113-125.
확장 기능
C/C++ 코드 생성
MATLAB® Coder™를 사용하여 C 코드나 C++ 코드를 생성할 수 있습니다.
사용법 관련 참고 및 제한 사항:
watershed
함수는 C 코드 생성을 지원합니다(MATLAB® Coder™가 필요함). 일반적인MATLAB Host Computer
타깃 플랫폼을 선택할 경우watershed
함수는 미리 컴파일된 플랫폼별 공유 라이브러리를 사용하는 코드를 생성합니다. 공유 라이브러리를 사용하면 성능 최적화가 유지되지만 코드를 생성할 수 있는 타깃 플랫폼이 제한됩니다. 자세한 내용은 Types of Code Generation Support in Image Processing Toolbox 항목을 참조하십시오.2차원 영상만 지원됩니다.
4
연결성 또는8
연결성만 지원됩니다.최대 65,535개 영역을 포함하는 영상이 지원됩니다.
출력 유형은 항상
uint16
형입니다.
GPU 코드 생성
GPU Coder™를 사용하여 NVIDIA® GPU용 CUDA® 코드를 생성할 수 있습니다.
사용법 관련 참고 및 제한 사항:
2차원 영상만 지원됩니다.
4
연결성 또는8
연결성만 지원됩니다.최대 65,535개 영역을 포함하는 영상이 지원됩니다.
출력 유형은 항상
uint16
형입니다.
스레드 기반 환경
MATLAB®의 backgroundPool
을 사용해 백그라운드에서 코드를 실행하거나 Parallel Computing Toolbox™의 ThreadPool
을 사용해 코드 실행 속도를 높일 수 있습니다.
이 함수는 스레드 기반 환경을 완전히 지원합니다. 자세한 내용은 스레드 기반 환경에서 MATLAB 함수 실행하기 항목을 참조하십시오.
버전 내역
R2006a 이전에 개발됨R2022b: 스레드 기반 환경 지원
watershed
함수는 이제 스레드 기반 환경을 지원합니다.
참고 항목
bwlabel
| bwlabeln
| bwdist
| regionprops
| imhmin
MATLAB 명령
다음 MATLAB 명령에 해당하는 링크를 클릭했습니다.
명령을 실행하려면 MATLAB 명령 창에 입력하십시오. 웹 브라우저는 MATLAB 명령을 지원하지 않습니다.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)