Hough Transform
허프 변환은 이미지 가장자리의 간격이나 노이즈가 있어도 선, 원, 도형을 감지하는 투표 기반 컴퓨터 비전 기법입니다.
허프 변환은 이미지의 점들이 가능한 도형에 투표하도록 하여 선, 원 및 기타 매개변수화된 도형을 감지하는 기하학적 특징 추출 기법입니다. 같은 구조에 속하는 점들은 서로의 결과를 강화하여 투표 테이블에서 뚜렷한 피크를 만듭니다. 컴퓨터 비전에서 이 기법을 사용하면 간격이 있거나 경계에 노이즈가 있는 도형도 복원할 수 있습니다.
Paul V. C. Hough는 물리학 사진에서 입자 궤적을 다루기 위해 1959년 기포 상자 사진의 기계적 분석에서 이 기법을 소개했습니다. Richard Duda와 Peter Hart는 1972년 선 및 곡선 감지 논문에서 널리 사용되는 각도-거리 표현을 소개했습니다.
허프 투표의 작동 방식#
일반적인 워크플로는 데이터 전처리와 에지 감지로 시작합니다. 에지 검출기는 국소적인 밝기 변화를 식별하고, 허프 변환은 에지 픽셀을 기하학적 구조로 그룹화합니다. 소벨 연산자는 밝기 기울기를 추정하며, 캐니는 선 투표에 적합한 얇은 에지 맵을 생성합니다.
각 후보 선은 이미지 원점에서 선까지의 부호 있는 수직 거리인 rho와, x축을 기준으로 해당 수직선이 이루는 각도인 theta로 표현됩니다. 이 방식은 기울기가 무한대인 수직선도 처리할 수 있습니다. 모든 에지 픽셀은 누산기의 호환되는 rho–theta 쌍에 투표합니다. 누산기는 매개변수 공간을 이산 구간으로 나눈 테이블입니다. 이미지에서 서로 떨어져 있더라도 동일 선상에 있는 픽셀은 같은 구간에 기여합니다. 피크는 지지를 받는 선을 나타냅니다.
기하 구조와 투표 규칙에 따라 출력이 결정됩니다. 딥러닝 검출기는 학습 데이터에서 시각적 패턴을 학습하지만, 허프 감지는 학습된 모델 가중치 대신 선택한 도형 모델과 수치 임계값을 사용합니다.
선, 확률적 선 및 원 변환#
일반적인 구현 세 가지는 탐색 방식과 출력이 서로 다릅니다.
- 표준 선 변환:
cv2.HoughLines()은 무한선을 나타내는 rho–theta 쌍을 반환합니다. 선분의 끝점을 구하려면 추가 처리가 필요합니다. - 확률적 선 변환:
cv2.HoughLinesP()은 점 샘플링으로 투표 작업량을 줄이고 선분의 끝점을 바로 반환합니다.minLineLength은 짧은 선분을 제외하고,maxLineGap는 정렬된 조각을 연결할 때 허용되는 간격을 제어합니다. - 원 변환: 원 후보를 구하려면 중심과 반지름이 필요합니다.
cv2.HoughCircles()은 기울기 기반 접근 방식을 사용하며, 반지름 범위를 지정해 탐색 범위를 좁힙니다. 입력은 그레이스케일 이미지인 반면, 선 변환 함수는 이진 이미지를 입력으로 사용합니다.
Python에서 선분 감지하기#
pip install opencv-python numpy으로 종속 항목을 설치합니다. 이 예제에서는 OpenCV를 사용해 버스 샘플 이미지에서 선분을 감지하고 그립니다.
from urllib.request import urlopen
import cv2
import numpy as np
with urlopen("https://ultralytics.com/images/bus.jpg") as response:
encoded = np.frombuffer(response.read(), dtype=np.uint8)
image = cv2.imdecode(encoded, cv2.IMREAD_COLOR)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 투표에 사용할 에지를 추출합니다.
edges = cv2.Canny(gray, 50, 150)
# 누산기 투표로 지지되는 유한한 선분을 감지합니다.
lines = cv2.HoughLinesP(
edges,
1,
np.pi / 180,
threshold=80,
minLineLength=80,
maxLineGap=10,
)
if lines is not None:
for x1, y1, x2, y2 in lines[:, 0]:
cv2.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
cv2.imwrite("hough_segments.jpg", image)저장된 이미지에는 반환된 선분이 빨간색으로 오버레이되어 있습니다. rho 구간의 너비는 1픽셀이고 theta 구간은 1도이며, threshold=80은 누산기 투표 임계값을 설정합니다. 선분 길이 및 간격 설정의 단위는 픽셀입니다.
응용 분야와 실제적인 한계#
문서 처리에서 격자선을 추출하면 구조 분석에 도움이 됩니다. OpenCV는 스도쿠 이미지에서 허프 감지를 보여 줍니다. 원형 투표는 scikit-image의 원 및 타원 예제에서 동전의 중심과 반지름을 찾습니다. 이러한 결과는 기하 구조를 나타내며, 객체 감지는 의미 범주를 추가하고 인스턴스 분할은 픽셀을 개별 객체에 할당합니다.
강철 빔 측정 프로토타입은 YOLOv8 마스크, 캐니 에지, 확률적 허프 선을 결합해 모서리 추출을 지원합니다. Ultralytics YOLO26 분할은 객체 분리를 위한 마스크를 제공하므로, 별도의 기하학적 처리를 수행하기 전에 동일한 마스크 입력 방식을 적용할 수 있습니다.
누산기 구간을 세분화하면 메모리 사용량이 늘어나고, 구간을 넓게 설정하면 서로 가까운 후보들이 하나로 합쳐집니다. 테이블 경계 추출에서는 테두리가 불완전하면 감지 가능한 경계가 줄어들고, 관련 없는 선이 경계를 잘못 보정할 수 있습니다. maxLineGap을 높이면 정렬된 조각 사이의 더 큰 간격을 연결하고, minLineLength를 높이면 더 짧은 선분을 제거합니다.










