Python과 OpenCV – 27 : 이미지에서 원형 도형 검출(Hough Circle Transform)

이 글의 원문은 https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_houghcircles/py_houghcircles.html#hough-circles 입니다.

앞서 이미지에서 선형 도형을 검출하는데, Hough Transform 알고리즘을 사용했습니다. 이 알고리즘은 수학적 모델링이 가능한 모든 도형을 이미지에서 검출할 수 있는 방법입니다. 그렇다면 원형에 대한 수학적 모델식을 이용해 Hought Transform을 적용할 수 있는데, 문제는 원에 대한 수학식이 중심점 (x, y)와 반지름(r)이라는 3개의 매개변수로 구성되어 있고, 결국 3차원 배열이라는 저장소를 요구한다는 점. 그럼으로 인해 연산이 매우 비효율적이라는 점입니다. 이에 대한 개선으로 Gradient(가장자리에서의 기울기값)을 이용하여 Hought Transform을 적용할 수 있고, 이에 대한 구현으로 OpenCV에서는 cv2.HoughCircles 함수를 제공합니다. 이 함수의 예는 다음과 같습니다.

import cv2
import numpy as np

img = cv2.imread('./data/opencv_logo.png',0)
img = cv2.medianBlur(img,5)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)

circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,20,
                            param1=50,param2=30,minRadius=0,maxRadius=0)

circles = np.uint16(np.around(circles))
for i in circles[0,:]:
    cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)

cv2.imshow('detected circles',cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.HoughCircles는 제법 많은 인자를 받는데요. 위의 예제를 통해 보면, 첫번째는 입력 이미지로써 8비트 단일 채널인 Grayscale 이미지, 두번째는 방식으로써 현재는 cv2.HOUGH_GRADIENT만을 지원합니다. 세번째는 대부분 1을 지정하는데, 이 경우 입력 이미지와 동일한 해상도가 사용됩니다. 네번째는 검출한 원의 중심과의 최소거리값으로 이 최소값보다 작으면 원으로 판별되지 않습니다. 그리고 param1은 Canny Edge에 전달되는 인자값, param2는 검출 결과를 보면서 적당이 조정해야 하는 값으로 작으면 오류가 높고 크면 검출률이 낮아진다고 합니다. minRadius와 masRadius는 각각 원의 최소, 최대 반지름이고 0으로 지정하면 사용되지 않습니다. 결과는 다음과 같습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다