Main Content

activecontour

능동 윤곽선(스네이크) 영역 확장 기법을 사용하여 영상을 전경과 배경으로 분할

설명

스네이크라고도 하는 능동 윤곽선 기법은 반복적인 영역 확장을 수행하여 영상을 분할하는 알고리즘입니다. 능동 윤곽선 알고리즘을 사용하면 영상에서 초기 곡선을 지정한 다음 activecontour 함수를 사용하여 곡선을 전개하여 객체 경계선을 찾을 수 있습니다.

예제

BW = activecontour(A,mask)는 능동 윤곽선을 사용하여 영상 A를 전경(객체) 영역과 배경 영역으로 분할합니다.

mask 인수는 능동 윤곽선의 초기 상태를 지정하는 이진 영상입니다. mask의 객체 영역(흰색) 경계선은 영상 분할을 위해 윤곽선 전개에 사용되는 초기 윤곽선 위치를 정의합니다. 출력 영상 BW는 전경은 흰색(논리값 true)이고 배경은 검은색(논리값 false)인 이진 영상입니다.

더 빠르고 정확한 분할 결과를 얻으려면 초기 윤곽선 위치를 원하는 객체 경계선에 가까운 위치로 지정하십시오.

BW = activecontour(A,mask,n)은 최대 n회까지 반복적으로 윤곽선을 전개하여 영상을 분할합니다.

예제

BW = activecontour(A,mask,method)는 분할에 사용할 능동 윤곽선 방법을 'Chan-Vese' 또는 'edge'로 지정합니다. RGB 영상의 경우 이 방법은 'Chan-Vese'여야 합니다.

BW = activecontour(A,mask,n,method)는 지정된 method를 사용하여 최대 n회까지 반복적으로 윤곽선을 전개하여 영상을 분할합니다.

BW = activecontour(___,Name,Value)는 이름-값 쌍 인수를 지정하여 분할의 다양한 특성을 제어합니다.

예제

모두 축소

회색조 영상을 읽어 들이고 표시합니다.

I = imread('coins.png');
imshow(I)
title('Original Image')

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

관심 객체를 둘러싸는 초기 윤곽선을 지정합니다. 윤곽선을 표시합니다.

mask = zeros(size(I));
mask(25:end-25,25:end-25) = 1;
imshow(mask)
title('Initial Contour Location')

Figure contains an axes. The axes with title Initial Contour Location contains an object of type image.

activecontour 함수를 사용하여 영상을 분할합니다. 기본적으로 이 함수는 100회 반복을 통해 분할을 전개합니다.

bw = activecontour(I,mask);

결과를 표시합니다. 100회 반복 후 원래 윤곽선이 객체 경계선에 가깝지 않으며 따라서 객체가 배경으로부터 완전히 분할되지 않습니다.

imshow(bw)
title('Segmented Image, 100 Iterations')

Figure contains an axes. The axes with title Segmented Image, 100 Iterations contains an object of type image.

분할을 계속해서 전개하려면 반복 횟수를 늘리십시오. 300회 후 객체가 배경으로부터 완전히 분할됩니다.

bw = activecontour(I,mask,300);
imshow(bw)
title('Segmented Image, 300 Iterations')

Figure contains an axes. The axes with title Segmented Image, 300 Iterations contains an object of type image.

회색조 영상을 읽어 들이고 표시합니다.

I = imread('toyobjects.png');
imshow(I)

drawrectangle 함수를 사용하여 관심 객체에 가까운 초기 윤곽선을 그립니다. 윤곽선을 그린 후에 createMask 함수를 사용하여 마스크를 만듭니다.

r = drawrectangle;

mask = createMask(r);

'edge' 방법과 200회의 반복을 사용하여 영상을 분할합니다.

bw = activecontour(I,mask,200,'edge');

원본 영상 위에 최종 윤곽선을 빨간색으로 표시합니다.

hold on;
visboundaries(bw,'Color','r'); 

원본 영상 위에 분할의 결과를 표시합니다. 전경의 객체는 파란색으로 표시됩니다.

figure
imshow(labeloverlay(I,bw));

3차원 볼륨 영상 데이터를 불러오고 한원소 차원을 제거합니다.

D = load('mri.mat');
A  = squeeze(D.D);

초기 시드 점에 사용할 2차원 마스크를 만듭니다.

seedLevel = 10;
seed = A(:,:,seedLevel) > 75;
figure
imshow(seed)

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

3차원의 빈 시드 마스크를 생성하고 그 마스크에 시드 점을 넣습니다.

mask = zeros(size(A));
mask(:,:,seedLevel) = seed;

시드 마스크를 지정하고 능동 윤곽선을 사용하여 분할을 수행합니다.

bw = activecontour(A,mask,300);

분할된 3차원 영상을 표시합니다.

figure;
p = patch(isosurface(double(bw)));
p.FaceColor = 'red';
p.EdgeColor = 'none';
daspect([1 1 27/128]);
camlight; 
lighting phong

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

입력 인수

모두 축소

분할할 영상으로, 2차원 숫자형 행렬 또는 3차원 숫자형 배열로 지정됩니다.

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

분할 전개가 시작되는 초기 윤곽선으로, A와 크기가 같은 이진 영상으로 지정됩니다. 2차원과 3차원 회색조 영상의 경우 mask의 크기는 영상 A의 크기와 일치해야 합니다. 컬러 영상과 다중채널 영상의 경우 mask는 처음 두 개 차원이 영상 A의 처음 두 개 차원과 일치하는 2차원 논리형 배열이어야 합니다.

ROI 객체를 사용하여 대화형 방식으로 마스크를 만들 수 있습니다. 예를 들어, drawpolygon 함수를 사용하여 다각형 ROI를 그린 다음 createMask 함수를 사용하여 ROI에서 마스크를 만듭니다.

데이터형: logical

분할 전개 시 수행할 최대 반복 횟수로, 양의 정수로 지정됩니다. activecontour는 최대 반복 횟수에 도달하면 능동 윤곽선 전개를 중지합니다. activecontour는 현재 반복에서의 윤곽선 위치가 최근 5회 반복에서의 윤곽선 위치와 동일한 경우에도 전개를 중지합니다.

초기 윤곽선 위치(mask로 지정됨)가 객체 경계선에서 멀리 떨어진 경우, 원하는 분할 결과를 얻도록 n의 값을 더 크게 지정하십시오.

데이터형: double

분할에 사용할 능동 윤곽선 방법으로, 'Chan-Vese' 또는 'edge'로 지정됩니다. Chan-Vese 영역 기반 에너지 모델에 대해서는 [1]에 설명되어 있습니다. 측지선 능동 윤곽선과 유사한 경계 기반 모델에 대해서는 [2]에 설명되어 있습니다.

RGB 영상의 경우 이 방법은 'Chan-Vese'여야 합니다.

데이터형: char | string

이름-값 쌍의 인수

선택적으로 Name,Value 인수가 쉼표로 구분되어 지정됩니다. 여기서 Name은 인수 이름이고 Value는 대응값입니다. Name은 따옴표 안에 표시해야 합니다. Name1,Value1,...,NameN,ValueN과 같이 여러 개의 이름-값 쌍의 인수를 어떤 순서로든 지정할 수 있습니다.

예: 'SmoothFactor',1.5

분할되는 영역 경계선의 매끄러움 또는 고름의 정도로, 'SmoothFactor'와 함께 양수가 쉼표로 구분되어 지정됩니다. 값이 높을수록 영역 경계선이 더 매끄러워지지만 세부적인 특징 역시 제거될 수도 있습니다. 값이 낮을수록 영역 경계선이 덜 고르게 되지만(즉, 덜 매끄러워짐), 세부적인 특징을 살릴 수 있습니다. 디폴트 매끄러움 값은 'Chan-Vese' 방법의 경우 0이고 'edge' 방법의 경우 1입니다.

예: 'SmoothFactor',1.5

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

윤곽선이 바깥쪽 방향으로 커지거나 안쪽 방향으로 작아지는 경향으로, 'ContractionBias'와 함께 숫자형 스칼라가 쉼표로 구분되어 지정됩니다. 양수 값은 윤곽선이 안쪽 방향으로 작아지는(수축) 경향을 띠게 만듭니다. 음수 값은 윤곽선을 바깥쪽 방향으로 커지는(확장) 경향을 띠게 만듭니다. 이 파라미터가 윤곽선 수축 또는 확장을 보장하지는 않습니다. 이 파라미터에 양수 값을 지정해도 실제로는 윤곽선이 확장될 수 있습니다. 하지만 편향을 지정하면 편향을 지정하지 않을 때보다 윤곽선 확장 속도가 둔화됩니다. 이 파라미터의 일반적인 값은 -1과 1 사이입니다. 디폴트 수축 편향은 'Chan-Vese' 방법의 경우 0이고 'edge' 방법의 경우 0.3입니다.

예: 'ContractionBias',0.4

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

출력 인수

모두 축소

분할된 영상으로, 입력 영상 A와 같은 크기의 이진 영상으로 반환됩니다. 전경은 흰색(논리값 true)이고 배경은 검은색(논리값 false)입니다.

  • activecontourmask의 영역 경계선을 전개가 시작되는 윤곽선의 초기 상태로 사용합니다. 마스크에 구멍이 있으면 예기치 않은 결과가 발생할 수 있습니다. mask 내 영역의 구멍을 모두 채우려면 imfill을 사용하십시오.

  • 어느 영역이 영상 테두리에 닿게 되는 경우, activecontour는 이 영역이 영상의 테두리에 닿지 않도록 해당 영역에서 한 픽셀 두께만큼의 층을 제거한 후, 추가적인 처리를 수행합니다.

  • 더 빠르고 정확한 분할 결과를 얻으려면 초기 윤곽선 위치를 원하는 객체 경계선에 가까운 위치로 지정하십시오. 특히 'edge' 방법을 사용할 때는 더욱 그렇습니다.

  • 'edge' 방법의 경우, 능동 윤곽선은 자연적으로 안쪽 방향으로 작아지는(수축) 경향을 띠게 됩니다. 영상 기울기가 없는 경우 능동 윤곽선은 자체적으로 작아집니다. 이와 반대로, 윤곽선이 어느 한쪽으로 편향되지 않는 'Chan-Vese' 방법을 사용할 경우 윤곽선은 영상 특징에 따라 자유롭게 수축되거나 확장됩니다.

  • 'edge' 방법을 사용하여 정확한 분할 결과를 얻으려면 객체 경계선 밖에 초기 윤곽선을 지정하십시오. 'edge' 방법을 사용할 경우 능동 윤곽선은 기본적으로 수축되는 경향을 띠게 됩니다.

  • 객체 영역 간에 회색조 명암이 크게 다른 경우에 'Chan-Vese' 방법 [1]을 사용하면 영상에서 일부 객체를 분할하지 못할 수 있습니다. 예를 들어, 영상에 포함된 객체가 일부는 배경보다 밝고 다른 일부는 배경보다 어두운 경우 'Chan-Vese' 방법은 일반적으로 어두운 객체만 분할하거나 밝은 객체만 분할합니다.

알고리즘

activecontour[3]에 설명된 방법과 유사한 Sparse-Field 등위 집합(level-set) 방법을 사용하여 능동 윤곽선 전개를 구현합니다.

참고 문헌

[1] T. F. Chan, L. A. Vese, Active contours without edges. IEEE Transactions on Image Processing, Volume 10, Issue 2, pp. 266-277, 2001.

[2] V. Caselles, R. Kimmel, G. Sapiro, Geodesic active contours. International Journal of Computer Vision, Volume 22, Issue 1, pp. 61-79, 1997.

[3] R. T. Whitaker, A level-set approach to 3d reconstruction from range data. International Journal of Computer Vision, Volume 29, Issue 3, pp. 203-231, 1998.

R2013a에 개발됨