이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

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의 행에 대응됩니다.

예제

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

예제

모두 축소

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

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

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

반지름 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');

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

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

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

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');

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

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

입력 인수

모두 축소

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

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

원 반지름은 검출할 원형 객체의 근사 반지름으로, 모든 숫자형의 스칼라로 지정됩니다.

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

검출할 원형 객체의 반지름 범위로, 임의의 숫자형 정수로 구성되고 요소를 2개 가진 벡터 [rmin rmax]로 지정됩니다.

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

이름-값 쌍의 인수

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

예: 'ObjectPolarity','bright'는 어두운 배경의 밝은 원형 객체를 지정합니다.

객체 극성은 원형 객체가 배경보다 더 밝은지 아니면 더 어두운지를 나타내고, 'ObjectPolarity'와 함께 다음 표의 값 중 하나가 쉼표로 구분되어 지정됩니다.

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

계산 방법은 누산기 배열을 계산하는 데 사용하는 기법으로, 'Method'와 함께 다음 표의 값 중 하나가 쉼표로 구분되어 지정됩니다.

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

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

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

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

예: 'EdgeThreshold',0.5는 경계 기울기 임계값을 0.5로 설정합니다.

출력 인수

모두 축소

원 중심의 좌표로, 첫 번째 열에 원 중심의 x 좌표를 포함하고 두 번째 열에 y 좌표를 포함하는 Px2 행렬로 반환됩니다. 행 개수 P는 검출된 원 개수입니다centers는 원의 강도에 따라 정렬됩니다.

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

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

  • 정확도를 높이기 위해 비교적 작은 radiusRange를 지정하십시오. 경험적으로, rmax < 3*rmin(rmax-rmin) < 100이 되도록 radiusRange를 선택하는 것이 좋습니다.

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

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

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

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

  • imfindcircles는 결과의 정확도 향상을 위해 이진(논리형) 영상을 전처리합니다. 그리고 영상을 처리하기 전에 함수 rgb2gray를 사용하여 트루컬러 영상을 회색조 영상으로 변환합니다.

알고리즘

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

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

  1. 누산기 배열 계산.

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

    그림 1: 기본적인 CHT 투표 패턴

  2. 중심 추정

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

  3. 반지름 추정

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

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

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

  • 2차원 누산기 배열 사용:

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

  • 경계 픽셀 사용

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

  • 경계 방향 정보 사용:

    성능을 최적화하기 위한 또 다른 방법은 후보 픽셀에 사용 가능한 Bin 개수를 제한하는 것입니다. 이렇게 하려면 국소적으로 사용 가능한 경계 정보를 활용하여, 기울기 방향에 따라 제한된 간격으로만 투표를 허용하면 됩니다(그림 2).

    그림 2: 투표 모드: 기울기 방향에 따른 여러 개의 반지름

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

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

  • 2단계

    반지름은 영상 정보에 따라 추정된 원의 중심을 기준으로 명시적으로 추정됩니다. 이 기법은 방사형 히스토그램 계산에 기반합니다. 세부적인 설명은 참고 문헌 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에 개발됨