Main Content

imfindcircles

원형 허프 변환(Circular Hough Transform)을 사용하여 원 찾기

설명

centers = imfindcircles(A,radius)는 영상 A에서 반지름이 radius와 거의 같은 원을 찾습니다. 출력 인수 centers는 영상 속 원의 중심의 (x,y) 좌표를 포함하는 2열 행렬입니다.

[centers,radii] = imfindcircles(A,radiusRange)radiusRange로 지정된 범위의 반지름을 갖는 원을 찾습니다. 추가 출력 인수 radiicenters의 각 원의 중심에 대응하는 반지름 추정값을 포함합니다.

예제

[centers,radii,metric] = imfindcircles(A,radiusRange)는 각 원의 누산기 배열 피크 크기(내림차순)를 포함하는 열 벡터 metric도 반환합니다. centersradii의 행은 metric의 행에 대응됩니다.

예제

[___] = imfindcircles(___,Name=Value)는 위에 열거된 구문에 이름-값 인수를 하나 이상 추가 옵션으로 지정합니다.

예제

모두 축소

이 예제에서는 영상의 모든 원을 찾는 방법과 가장 강한 원들을 유지하고 표시하는 방법을 보여줍니다.

회색조 영상을 작업 공간으로 읽어 들인 후 이를 표시합니다.

A = imread('coins.png');
imshow(A)

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

반지름 r 픽셀이 [15, 30] 범위에 속하는 원을 모두 찾습니다.

[centers, radii, metric] = imfindcircles(A,[15 30]);

메트릭에 따라 가장 강한 원 5개를 유지합니다.

centersStrong5 = centers(1:5,:); 
radiiStrong5 = radii(1:5);
metricStrong5 = metric(1:5);

원본 영상 위에 가장 강한 원 5개의 둘레를 그립니다.

viscircles(centersStrong5, radiiStrong5,'EdgeColor','b');

Figure contains an axes object. The axes object contains 3 objects of type line, image.

영상을 작업 공간으로 읽어 들인 후 표시합니다.

A = imread('circlesBrightDark.png');
imshow(A)

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

반지름 범위를 정의합니다.

Rmin = 30;
Rmax = 65;

영상에서 반지름 범위 내에 있는 밝은 원을 모두 찾습니다.

[centersBright, radiiBright] = imfindcircles(A,[Rmin Rmax],'ObjectPolarity','bright');

영상에서 반지름 범위 내에 있는 어두운 원을 모두 찾습니다.

[centersDark, radiiDark] = imfindcircles(A,[Rmin Rmax],'ObjectPolarity','dark');

밝은 원의 경계를 따라 푸른 선을 그립니다.

viscircles(centersBright, radiiBright,'Color','b');

Figure contains an axes object. The axes object contains 3 objects of type line, image.

어두운 원의 경계를 따라 빨간 파선을 그립니다.

viscircles(centersDark, radiiDark,'LineStyle','--');

Figure contains an axes object. The axes object contains 5 objects of type line, image.

입력 인수

모두 축소

원형 객체를 검출할 입력 영상으로, 회색조 영상, 트루컬러(RGB) 영상 또는 이진 영상으로 지정됩니다.

데이터형: single | double | int16 | uint8 | uint16 | logical

원 반지름 또는 검출할 원형 객체의 근사 반지름으로, 양수로 지정됩니다.

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

검출할 원형 객체의 반지름 범위로, 형식이 [rmin rmax]인, 양의 정수로 구성된 요소를 2개 가진 벡터로 지정됩니다. 여기서 rminrmax보다 작습니다.

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

이름-값 인수

선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN으로 지정합니다. 여기서 Name은 인수 이름이고 Value는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.

예: centers = imfindcircles(A,radius,ObjectPolarity=bright)는 어두운 배경의 밝은 원형 객체를 지정합니다.

R2021a 이전 릴리스에서는 쉼표를 사용하여 각 이름과 값을 구분하고 Name을 따옴표로 묶으십시오.

예: centers = imfindcircles(A,radius,"ObjectPolarity","bright")는 어두운 배경의 밝은 원형 객체를 지정합니다.

객체 극성으로, 표의 값 중 하나로 지정됩니다.

"bright"원형 객체가 배경보다 더 밝습니다.
"dark"원형 객체가 배경보다 더 어둡습니다.

누산기 배열을 계산하는 데 사용하는 계산 방법으로, 표의 값 중 하나로 지정됩니다.

"PhaseCode"애서턴(Atherton)과 커비슨(Kerbyson)의 [1] 위상 코딩 방법입니다.
"TwoStage"2단계 원형 허프 변환(Circular Hough Transform)에 사용되는 방법입니다 [2], [3].

예: "Method","PhaseCode"는 애서턴과 커비슨의 위상 코딩 방법을 지정합니다.

원형 허프 변환 누산기 배열의 감도 인자로, [0, 1] 범위의 숫자로 지정됩니다. 감도 인자를 높이면, imfindcircles는 강도가 약한 원과 부분적으로 불명확한 원 등의 원형 객체를 더 많이 검출합니다. 감도 값을 높일수록 잘못 검출할 위험도 높아집니다.

영상의 경계 픽셀을 확인하기 위한 경계 기울기 임계값으로, [0, 1] 범위의 숫자로 지정됩니다. 임계값을 기울기 크기 0으로 설정하려면 0을 지정하십시오. 임계값을 최대 기울기 크기로 설정하려면 1을 지정하십시오. 임계값을 더 낮은 값으로 설정하면 imfindcircles는 경계 강도가 강한 것뿐만 아니라 약한 것까지 포함해 더 많은 원형 객체를 검출합니다. 임계값을 높이면 경계 강도가 약한 원을 덜 검출합니다. 기본적으로 imfindcircles는 함수 graythresh를 사용하여 경계 기울기 임계값을 자동으로 선택합니다.

예: "EdgeThreshold",0.5

출력 인수

모두 축소

원의 중심의 좌표로, 첫 번째 열에 원의 중심의 x 좌표를 포함하고 두 번째 열에 y 좌표를 포함하는 P×2 행렬로 반환됩니다. 행 개수 P는 검출된 원 개수입니다. centers는 원의 강도에 따라 가장 강한 원부터 가장 약한 원 순으로 정렬됩니다.

데이터형: double

원의 중심에 대한 반지름 추정값으로, 열 벡터로 반환됩니다. radii(j)의 반지름 값은 중심이 centers(j,:)인 원에 대응됩니다.

데이터형: double

원의 중심에 대한 상대적인 강도를 제공하는 원 강도로, 열 벡터로 반환됩니다. metric(j)의 값은 반지름이 radii(j)이고 중심이 centers(j,:)인 원에 대응됩니다.

데이터형: double

  • radius(또는 rmin) 값이 5보다 작거나 같으면, imfindcircles의 정확도가 제한됩니다.

  • "TwoStage" 대신 "PhaseCode" 방법(디폴트 값)을 사용하면, 일반적으로 반지름 추정 단계가 더 빠릅니다.

  • 두 계산 방법 "PhaseCode""TwoStage"는 동심원 검출 성능이 그리 우수하지는 않습니다. 동심원 검출 결과는 입력 영상에 따라 다를 수 있습니다.

  • imfindcircles는 중심이 영상 영역 밖에 있는 원은 찾지 않습니다.

  • imfindcircles는 영상을 처리하기 전에 함수 rgb2gray를 사용하여 트루컬러 영상을 회색조 영상으로 변환합니다. 이진(logical형) 영상과 정수형 영상은 처리 전에 im2single 함수를 사용하여 single형으로 변환됩니다. 이진 영상 결과의 정확성을 높이기 위해 imfindcircles는 전처리 단계로 imfilter를 사용하여 가우스 평활화도 적용합니다.

알고리즘

imfindcircles는 영상의 원을 찾을 때 원형 허프 변환(CHT) 기반의 알고리즘을 사용합니다. 이 방식을 사용하는 까닭은 잡음과 가림 현상, 다양한 조명에서도 성능이 견고하기 때문입니다.

CHT는 엄격하게 지정된 알고리즘이 아닙니다. 오히려 구현 단계에서 다양한 방법을 선택할 수 있습니다. 그러나 모든 방법에는 세 가지 중요 단계가 공통됩니다.

  1. 누산기 배열 계산

    큰 기울기의 전경 픽셀이 후보 픽셀이 되도록 지정되며, 이러한 픽셀은 누산기 배열에서 '투표'하는 것이 허용됩니다. 기본적인 CHT 구현에서 후보 픽셀은 자신을 중심으로 고정 반지름의 완전한 원을 형성하는 패턴으로 투표합니다. 그림 1a는 실제 원(실선 원)에 놓인 후보 픽셀과 그 후보 픽셀의 기본적인 CHT 투표 패턴(파선 원)의 예를 보여줍니다.

    기본적인 CHT 투표 패턴

    Accumulator array voting patterns for candidate points lying on the edge of a circle

  2. 중심 추정

    영상의 원에 속하는 후보 픽셀의 투표는 그 원의 중심에 해당하는 누산기 배열 Bin에 누적되는 경향이 있습니다. 따라서 누산기 배열에서 피크를 검출하면 원의 중심이 추정됩니다. 그림 1b는 실제 원(실선 원)에 놓인 후보 픽셀(실점)과 실제 원의 중심에서 일치하게 되는 투표 패턴들(파선 원)의 예를 보여줍니다.

  3. 반지름 추정

    CHT 알고리즘에서 흔히 그러하듯 같은 누산기 배열이 두 개 이상의 반지름 값에 사용될 경우, 검출된 원의 반지름은 별도의 단계로 추정해야 합니다.

imfindcircles는 영상에서 원을 찾을 수 있는 두 가지 알고리즘, 즉 위상 코딩 방법(디폴트 값)과 2단계 방법을 제공합니다. 두 알고리즘은 공통된 계산 단계가 있기도 하지만, 고유한 특성도 있습니다.

두 알고리즘의 공통된 계산 특징은 다음과 같습니다.

  • 2차원 누산기 배열 사용

    기본적인 허프 변환은 여러 반지름에 대한 투표를 저장하는 데 3차원 배열을 필요로 합니다. 따라서 저장 공간이 많이 필요하고 처리 시간이 오래 걸립니다. 위상 코딩 방법과 2단계 방법은 모든 반지름에 대해 2차원의 단일 누산기 배열을 사용하기 때문에 이 같은 문제가 없습니다. 이 방법은 반지름 추정을 위한 추가 단계가 필요하지만, 전체적인 계산 부하가 대체로 낮고, 특히 반지름 범위가 큰 경우에 계산 부하가 낮습니다. 최신 CHT 구현에 아주 널리 채택되는 방법입니다.

  • 경계 픽셀 사용

    전체적인 메모리 요구 사항과 속도는 후보 픽셀 수에 큰 영향을 받습니다. 후보 픽셀 수를 제한하기 위해, 입력 영상의 기울기 크기에 임계값이 적용됩니다. 따라서 집계된 투표에는 기울기가 큰 픽셀만 포함됩니다.

  • 경계 방향 정보 사용

    또한 후보 픽셀에 사용 가능한 Bin 개수를 제한하여 성능이 최적화됩니다. 이렇게 하려면 국소적으로 사용 가능한 경계 정보를 활용하여, 기울기 방향에 따라 제한된 간격으로만 투표를 허용하면 됩니다(그림 2). Figure에서 점 cmin과 점 cmax 간의 투표 간격 너비는 rmin과 rmax에 의해 정의된 반지름 범위로 결정됩니다.

    투표 모드: 기울기 방향에 따른 여러 반지름

    Graphical representation of the permitted voting interval for a candidate pixel. The direction of the voting interval is perpendicular to the edge of the circle at the candidate point.

rmin최소 탐색 반경
rmax최대 탐색 반경
ractual후보 픽셀이 속한 원의 반지름
cmin반지름 rmin인 원의 중심
cmax반지름 rmax인 원의 중심
cactual반지름 ractual인 원의 중심

함수 imfindcircles에서 채택하는 두 CHT 방법은 원 반지름 계산 방식이 근본적으로 다릅니다.

  • 2단계

    반지름은 영상 정보에 따라 추정된 원의 중심을 기준으로 명시적으로 추정됩니다. 이 기법은 방사형 히스토그램 계산에 기반합니다 [3].

  • 위상 코딩

    반지름은 누산기 배열의 복소수 값을 배열 요소의 위상에 인코딩된 반지름 정보와 함께 사용하여 추정됩니다 [1]. 경계 픽셀의 투표 결과에는 가능한 중심 위치의 정보뿐만 아니라, 그 중심 위치와 관련한 원의 반지름 정보도 들어 있습니다. 반지름 히스토그램을 사용하여 반지름을 명시적으로 추정해야 하는 2단계 방법과 달리, 위상 코딩에서는 누산기 배열에서 추정된 중심 위치의 위상 정보를 디코딩하기만 하면 반지름을 추정할 수 있습니다.

참고 문헌

[1] T.J Atherton, D.J. Kerbyson. "Size invariant circle detection." Image and Vision Computing. Volume 17, Number 11, 1999, pp. 795-803.

[2] H.K Yuen, .J. Princen, J. Illingworth, and J. Kittler. "Comparative study of Hough transform methods for circle finding." Image and Vision Computing. Volume 8, Number 1, 1990, pp. 71–77.

[3] E.R. Davies, Machine Vision: Theory, Algorithms, Practicalities. Chapter 10. 3rd Edition. Morgan Kauffman Publishers, 2005.

확장 기능

버전 내역

R2012a에 개발됨

모두 확장