[파이썬] 허프 변환을 활용한 직선 및 원 검출

개요

허프 변환(Hough Transform)은 이미지에서 직선이나 원 같은 형태를 검출하는 알고리즘입니다. 주로 컴퓨터 비전 분야에서 사용되며, 이미지 처리 작업에서 유용합니다. 이번 포스트에서는 파이썬을 이용하여 허프 변환을 활용하여 직선 및 원을 검출하는 방법에 대해 알아보겠습니다.

직선 검출

필요한 패키지 설치

pip install opencv-python

코드 예시

import cv2
import numpy as np

# 이미지 읽기
image = cv2.imread('lines.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 이미지 전처리
edges = cv2.Canny(gray, 50, 150, apertureSize=3)

# 허프 변환을 이용하여 직선 검출
lines = cv2.HoughLines(edges, 1, np.pi/180, 200)

# 검출된 직선 그리기
for line in lines:
    rho, theta = line[0]
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a * rho
    y0 = b * rho
    x1 = int(x0 + 1000 * (-b))
    y1 = int(y0 + 1000 * (a))
    x2 = int(x0 - 1000 * (-b))
    y2 = int(y0 - 1000 * (a))
    cv2.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)

# 결과 이미지 출력
cv2.imshow("Detected Lines", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

위의 코드는 lines.png 이미지에서 허프 변환을 이용하여 직선을 검출하는 예시입니다. 코드를 실행시키면 검출된 직선이 빨간색으로 표시된 결과 이미지가 출력됩니다.

원 검출

코드 예시

import cv2
import numpy as np

# 이미지 읽기
image = cv2.imread('circles.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 이미지 전처리
gray_blurred = cv2.blur(gray, (3, 3))
edges = cv2.Canny(gray_blurred, 30, 100)

# 허프 변환을 이용하여 원 검출
circles = cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, dp=1, minDist=30, param1=50, param2=30, minRadius=0, maxRadius=0)

# 검출된 원 그리기
if circles is not None:
    circles = np.round(circles[0, :]).astype('int')
    for (x, y, r) in circles:
        cv2.circle(image, (x, y), r, (0, 255, 0), 2)

# 결과 이미지 출력
cv2.imshow('Detected Circles', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

위의 코드는 circles.png 이미지에서 허프 변환을 이용하여 원을 검출하는 예시입니다. 코드를 실행시키면 검출된 원이 초록색으로 표시된 결과 이미지가 출력됩니다.

마무리

허프 변환은 영상 처리에서 많이 사용되는 알고리즘으로, 직선이나 원과 같은 형태를 검출하는 데에 유용합니다. 이번 포스트에서는 허프 변환을 통해 직선 및 원을 검출하는 방법에 대해 알아보았습니다. 파이썬의 OpenCV 라이브러리를 사용하면 간단하게 구현할 수 있으니, 관심 있는 분야에서 활용해보시길 권장합니다.