Hough 변환(Hough Transform)을 활용한 직선(Line) 및 원(Circle) 검출 방법은
이미지에서 형태가 명확한 도형을 수학적으로 찾는 데
매우 강력하고, 특히 차선 인식, 원형 객체 탐지, 부품 검사 등에 자주 활용됩니다.
Hough 변환이란?
Hough 변환은 이미지에서 직선, 원, 타원처럼 수학적으로 정의된 형태를 검출하는 알고리즘이에요.
이진 엣지 이미지에서 특정 형태의 도형을 찾기 위해,
픽셀의 조합을 누적 공간(accumulator)에 매핑해 패턴을 찾아냅니다.
직선의 경우 y = ax + b 형태보다는 극좌표(ρ, θ) 기반의 표현을 사용하고,
원은 중심 좌표와 반지름(r)을 찾는 구조예요.
OpenCV는 이 알고리즘을 최적화해서
HoughLines()와 HoughCircles() 함수로 간단히 제공하고 있어요.
엣지 검출(Canny)과 함께 사용하는 것이 일반적인 전처리 흐름이에요.
직선 검출: HoughLines() 예제
cv::Mat img = cv::imread("lines.jpg"); cv::Mat gray, edges; cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY); cv::Canny(gray, edges, 50, 150); std::vector<cv::Vec2f> lines; cv::HoughLines(edges, lines, 1, CV_PI/180, 100); for (auto& line : lines) { float rho = line[0], theta = line[1]; double a = cos(theta), b = sin(theta); cv::Point pt1(cvRound(rho*a - 1000*b), cvRound(rho*b + 1000*a)); cv::Point pt2(cvRound(rho*a + 1000*b), cvRound(rho*b - 1000*a)); cv::line(img, pt1, pt2, cv::Scalar(0, 0, 255), 2); } |
위 예제는 이미지에서 Canny 엣지를 검출한 후, 직선을 찾아 빨간 선으로 그려줘요.
직선은 극좌표 형식 (ρ, θ)으로 반환됩니다.
원 검출: HoughCircles() 예제
cv::Mat img = cv::imread("circles.jpg"); cv::Mat gray; cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY); cv::medianBlur(gray, gray, 5); std::vector<cv::Vec3f> circles; cv::HoughCircles(gray, circles, cv::HOUGH_GRADIENT, 1, 30, 100, 30, 10, 100); for (auto& c : circles) { cv::Point center(cvRound(c[0]), cvRound(c[1])); int radius = cvRound(c[2]); cv::circle(img, center, radius, cv::Scalar(0, 255, 0), 2); cv::circle(img, center, 2, cv::Scalar(0, 0, 255), 3); } |
이 코드는 이미지에서 원을 검출하고, 초록색 테두리와 빨간 중심점을 표시해줍니다.
HoughCircles()는 밝기 변화 기반으로 동작하기 때문에 GaussianBlur나 MedianBlur 전처리가 중요해요.
파라미터 조정과 성능 팁
Hough 변환은 정확한 검출을 위해 파라미터 튜닝이 필수예요.
HoughLines()에서는 누적 공간의 임계값(threshold)이 크면 적은 직선만 검출되고,
작으면 잡음까지 검출될 수 있어요.
HoughCircles()에서는 거리 파라미터(minDist), 내부 Canny 임계값,
그리고 원의 반지름 범위(minRadius, maxRadius) 설정이 중요해요.
또한, 너무 큰 해상도의 이미지에서는 성능 저하가 발생할 수 있으므로,
이미지를 리사이징해서 처리하거나 ROI를 사용하는 것이 효율적입니다.
디버깅을 위해 원본 이미지와 엣지 이미지를 함께 출력해보는 것도 좋은 전략이에요.
실전 응용: 차선 인식, 동전 분류 등
Hough 변환은 실전에서 매우 다양하게 활용돼요.
예를 들어, 차선 인식에서는 HoughLines()로 차선 직선을 추출한 후,
경사도(θ)를 기준으로 왼쪽/오른쪽 차선을 분류해요.
또, 동전 분류기나 캔 검사기에서는 HoughCircles()로 원을 검출하고,
반지름을 기준으로 크기 분류를 할 수 있죠.
OCR 전처리에서 문서 가장자리 라인 검출에도 사용돼요.
이처럼 형태가 명확한 구조물의 검출에는 Hough 변환이 매우 효과적이며,
다른 검출 알고리즘과 조합하면 더욱 강력한 영상 분석 도구로 발전시킬 수 있어요.
이 블로그의 내용을 대화 형식인 음성으로 들으면서 정리하면, 보다 쉽게 이해할 수 있을 거예요.
다운받아 들어보세요~
'IT' 카테고리의 다른 글
OpenCV에서 히스토그램 역투영 기법 사용하기 (0) | 2025.06.27 |
---|---|
OpenCV를 활용한 템플릿 매칭 방법 (0) | 2025.06.27 |
OpenCV에서 윤곽선(contour) 검출과 그리기 (0) | 2025.06.26 |
OpenCV로 엣지 검출: Canny 알고리즘 설명과 활용 (0) | 2025.06.26 |
OpenCV로 밝기 및 대비 조절하기 (0) | 2025.06.26 |