< * 원 검출(Circle Detection) * >
◆ 원 검출 알고리즘도 허프 변환 알고리즘 중 하나인 허프 원 변환(Hough Circle Transform) 알고리즘을
활용해 원을 검출한다.
◆ 허프 원 변환 알고리즘은 앞서 배운 허프 선 변환 알고리즘과 비슷한 방식으로 동작한다.
◆ 허프 원 변환 알고리즘은 2차원이 아닌 3차원 누산 평면으로 검출한다.
◆ 각 차원은 원의 중심점 x, 원의 중심점 y, 원의 반경 r을 활용해 누산 평면을 구성한다.
◆ 누산 평면은 2차원 공간(x, y)에서 3차원 공간(a, b, r)으로 변환된다.
◆ 허프 원 변환의 동작 방식은 이미지에서 가장자리를 검출한다.
◆ 3차원 히스토그램에서 돗수가 높은 (a, b, r)을 선택한다.
-- 이 방법은 이미지에서 가장 긴 변의 길이가 N이라면 바이트의 메모리를 필요로 한다.
-- 이 방식은 필요한 메모리가 너무 많아 비효율적이므로, 메모리 문제와 느린 처리 속도를
해결하기 위해 2차원 방식을 사용한다.
-- 이러한 문제로 인해 2단계로 나눠 계산한다.
-- 먼저 가장자리에 그레이디언트 방법을 이용해 원의 중심점(a, b)에 대한 2차원 히스토그램을 선정한다.
-- 모든 점에 대해 최소 거리에서 최대 거리까지 기울기의 선분을 따라 누산 평면의 모든 점을 증가시킨다.
-- 또한 중심점을 선택하기 위해 중심점 후보군에서 임곗값보다 크고 인접한 점보다 큰 점을 중심점으로 사용한다.
-- 선정된 중심점(a, b)와 가장자리의 좌표를 원의 방정식에 대입해 반지름 r의 1차원 히스토그램으로 판단하게 된다.
-- 히스토그램에 필요한 메모리가 줄어들어 이미지에서 가장 긴 변의 길이가 N이라면
바이트의 메모리를 필요로 한다.
◆ OpenCV 원 검출 함수는 2단계 허프 변환(Two stage Hough Transform) 방법을 활용해 원을 검출한다.
----< 예제 : Circle_Detection.py >-------------------------------------------------------------------
import cv2
src = cv2.imread("colorball.jpg")
dst = src.copy()
gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 100, param1 = 250, param2 = 10, minRadius = 80, maxRadius = 120)
for i in circles[0]:
cv2.circle(dst, (i[0], i[1]), i[2], (255, 255, 255), 5)
cv2.imshow("dst", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
--------------------------------------------------------------------------------------------------------