[파이썬] opencv-python Hough 변환을 사용한 직선 및 원 검출

OpenCV(Open Source Computer Vision)은 이미지 처리 및 컴퓨터 비전 작업을 위한 라이브러리입니다. OpenCV를 사용하면 이미지에서 직선이나 원과 같은 기하학적 모양을 검출할 수 있습니다. 이번 블로그 포스트에서는 OpenCV-Python을 사용하여 Hough 변환 기법을 이용한 직선 및 원 검출을 다루어 보겠습니다.

Hough 변환 개요

Hough 변환은 이미지에서 기하학적 모양을 검출하기 위한 알고리즘입니다. 직선, 원, 타원 등의 모양을 검출할 수 있으며, 특히 노이즈에 강한 특징을 가지고 있습니다.

Hough 변환의 주요 아이디어는 다음과 같습니다.

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!