OpenCV(Open Source Computer Vision)은 이미지 처리 및 컴퓨터 비전 작업을 위한 라이브러리입니다. OpenCV를 사용하면 이미지에서 직선이나 원과 같은 기하학적 모양을 검출할 수 있습니다. 이번 블로그 포스트에서는 OpenCV-Python을 사용하여 Hough 변환 기법을 이용한 직선 및 원 검출을 다루어 보겠습니다.
Hough 변환 개요
Hough 변환은 이미지에서 기하학적 모양을 검출하기 위한 알고리즘입니다. 직선, 원, 타원 등의 모양을 검출할 수 있으며, 특히 노이즈에 강한 특징을 가지고 있습니다.
Hough 변환의 주요 아이디어는 다음과 같습니다.
- 직선: x-y 공간에서의 한 점을 극 좌표계에서 변환합니다. 극 좌표계에서는 점을 (ρ, θ)의 형태로 나타냅니다. 이때, ρ는 점에서 원점까지의 거리, θ는 점과 x축 사이의 각도입니다. 이 극 좌표계에서의 점들을 모두 모아 직선인 부분을 찾을 수 있습니다.
- 원: 반지름과 중심 좌표를 변수로 하는 극 좌표계로 변환합니다. 그 다음, 이 극 좌표계에서 하나의 원점을 따라 원의 특징을 나타내는 곡선을 찾습니다.
Hough 변환은 매우 강력한 기술이며, 다양한 응용 분야에서 사용됩니다. 이제 OpenCV-Python을 사용하여 직선과 원을 검출하는 방법을 살펴보겠습니다.
직선 검출하기
직선을 검출하기 위해 Hough 변환 함수(cv2.HoughLines
)를 사용할 수 있습니다. 아래는 OpenCV-Python을 사용하여 직선을 검출하는 예제 코드입니다.
import cv2
import numpy as np
def detect_lines(image_path):
# 이미지 불러오기
image = cv2.imread(image_path)
# 이미지를 그레이스케일로 변환
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 가장자리 검출
edges = cv2.Canny(gray_image, 50, 150)
# 허프 변환을 사용하여 직선 검출
lines = cv2.HoughLines(edges, 1, np.pi/180, threshold=100)
# 검출된 직선을 그리기 위한 반복문
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("Lines Detected", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
이 예제 코드에서는 detect_lines
함수를 정의합니다. detect_lines
함수는 이미지 경로를 매개변수로 받으며, 해당 이미지에서 직선을 검출하고 시각화한 결과를 출력합니다.
원 검출하기
원을 검출하기 위해서는 Hough 원 변환 함수(cv2.HoughCircles
)를 사용할 수 있습니다. 아래는 OpenCV-Python을 사용하여 원을 검출하는 예제 코드입니다.
import cv2
import numpy as np
def detect_circles(image_path):
# 이미지 불러오기
image = cv2.imread(image_path)
# 이미지를 그레이스케일로 변환
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 가장자리 검출
edges = cv2.Canny(gray_image, 50, 150)
# 허프 변환을 사용하여 원 검출
circles = cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, dp=1, minDist=20, 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("Circles Detected", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
이 예제 코드에서도 detect_circles
함수를 정의합니다. detect_circles
함수는 이미지 경로를 매개변수로 받으며, 해당 이미지에서 원을 검출하고 시각화한 결과를 출력합니다.
마치며
이번 블로그 포스트에서는 OpenCV-Python을 사용하여 Hough 변환을 이용한 직선과 원의 검출에 대해 알아보았습니다. Hough 변환은 강력한 기술이며, 영상 처리 및 컴퓨터 비전 분야에서 다양한 응용 가능성을 가지고 있습니다. 이를 통해 이미지 처리 알고리즘의 효율성을 향상시킬 수 있습니다.
더 많은 정보와 예제 코드는 OpenCV-Python 공식 문서에서 확인할 수 있습니다.
Happy coding!