OpenCV는 파이썬에서 사용할 수 있는 cv2 라이브러리를 제공합니다. 이 라이브러리는 컴퓨터 비전 분야에서 유용하게 활용되는 다양한 형태(shape) 분석 기능을 지원합니다. 이번 글에서는 OpenCV를 이용해 이미지 속에서 원(circle)의 형태를 식별하는 방법을 살펴보겠습니다.
원을 검출하기 위해서는 cv2.HoughCircles() 함수를 사용합니다. 이 함수는 허프 변환(Hough Transform) 알고리즘을 기반으로 그레이스케일 이미지에서 원을 찾아냅니다. 아래 예제에서는 이미지를 입력으로 받은 뒤, 복사본을 만들어 변환 함수를 적용하고 출력 결과에서 원을 확인하는 과정을 다룹니다.
HoughCircles 함수 문법
cv2.HoughCircles(image, method, dp, minDist)
각 매개변수의 의미는 다음과 같습니다.
- image: 그레이스케일로 변환된 이미지 파일입니다.
- method: 원을 검출하는 데 사용되는 알고리즘입니다. 일반적으로
cv2.HOUGH_GRADIENT가 사용됩니다. - dp: 누산기(accumulator) 해상도와 이미지 해상도 간의 역비율(inverse ratio)입니다.
- minDist: 검출된 원들의 중심 좌표 사이의 최소 거리입니다.
예제 코드
아래 프로그램은 이미지 파일 안에 원이 존재하는지 검출하고, 원이 발견되면 해당 위치를 초록색 테두리로 강조하여 표시합니다.
import cv2
import numpy as np
image = cv2.imread('circle_ellipse_2.JPG')
output = image.copy()
img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 원 검출
circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1.3, 100)
# 원이 발견된 경우
if circles is not None:
# (x, y, r) 좌표를 정수형으로 변환
circles = np.round(circles[0, :]).astype("int")
print(circles)
# 검출된 원들을 순회하며 그리기
for (x, y, r) in circles:
cv2.circle(output, (x, y), r, (0, 255, 0), 2)
# 결과 이미지 출력
cv2.imshow("circle", output)
cv2.waitKey(0)코드 설명
cv2.imread()로 이미지를 불러온 후,copy()를 사용해 원본을 보존한 채 결과를 그릴 복사본을 생성합니다.cv2.cvtColor()를 통해 BGR 이미지를 그레이스케일로 변환합니다. 허프 변환은 그레이스케일 이미지에서 동작하기 때문입니다.cv2.HoughCircles()로 원을 검출하고, 검출 결과가 있으면 좌표와 반지름을 정수형으로 반올림합니다.cv2.circle()함수로 검출된 원의 위치에 초록색((0, 255, 0)) 원을 두께 2로 그려 시각화합니다.
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
[[93 98 84]]
출력된 값은 각각 원의 중심 x좌표(93), y좌표(98), 반지름(84)을 의미합니다. 최종적으로 아래와 같이 이미지에서 원이 초록색 선으로 강조된 결과 화면을 확인할 수 있습니다.

마무리
이처럼 OpenCV의 cv2.HoughCircles() 함수를 활용하면 몇 줄의 코드만으로 이미지 내부의 원을 손쉽게 검출할 수 있습니다. 다만 dp, minDist 등의 매개변수 값을 조정해야 노이즈나 잘못된 검출을 줄일 수 있으므로, 대상 이미지의 특성에 맞게 파라미터를 실험하며 튜닝하는 것이 중요합니다.