openCV: 허프 변환 직선 검출

김태성·2022년 4월 13일
0
  1. 허프 변환 직선 검출

영상에서 직선을 찾는 방법에는 여러가지가 있고 그 방법중 하나로 허프변환을 사용할 수 있습니다.

허프변환은 아래와 같이 xy좌표계를 ab좌표계로 변환하여 직선을 찾는 알고리즘 입니다.

xy공간을 ab공간으로 변환할 경우 xy좌표계의 한 점의 좌표 p(x1,y1)을 정했을 때에,

ab좌표계에서 p를 사용해 b=-x1a+y1이라는 직선을 만들 수 있습니다. 역으로 ab좌표계에서 점 (a,b)는 xy좌표계에서 직선을 만들 수 있습니다.

즉, 한공간의 점이 다른 공간에서는 직선으로 나타나게 됩니다.

이제, 에지를 추출한 영상의 에지들을 이용하여 파라미터 공간에 직선을 만들고 직선이 가장 많이 교차되는 좌표를 찾아 축적배열에 넣음으로써 직선으로 검출할지에 대한 여부를 확인할 수 있습니다.

즉, 에지에서 나올 수 있는 모든 직선을 검출, 모든 점들에 대응시켜 가장 많이 교차되는 좌표를 찾아 축적배열에 넣어 직선으로 검출합니다.

이때, 실제 영상처리에서는 허프 변환으로 극좌표계 형식의 방정식을 사용합니다

x,y좌표계에서의 점은 θ,p좌표계에서는 곡선으로 나타나게 됩니다.

이때, 한 직선에서의 점들에 해당하는 곡선들은 θ,p좌표계에서 모두 한 점에서 교차하게 되며, 이를 축적배열에 넣으면 교차하는 지점에서의 값이 다른지점보다 커지게 됩니다. 이러한 국지적 최대점들을 찾아 임계값보다 큰 경우 직선으로 검출한다면 에지영상에서 직선을 추출할 수 있습니다.

  1. HoughLines함수

OpenCV에서는 허프변환 직선을 검출하는 함수로 HoughLines() 를 사용합니다.

가우시안 필터의 표준편차값, 캐니 에지 검출기의 임계값, 허프변환검출기의 해상도와 임계값을 적절히 설정해 주어야 합니다.

lines = cv2.HoughLines(img, rho, theta, threshold, lines, srn=0, stn=0, min_theta, max_theta)

Parameters:
image – 8bit, single-channel binary image, canny edge를 선 적용.
rho – 거리 측정 해상도(r 값의 범위) (0 ~ 1 실수)
theta – 각도 𝜃 값의 범위(0 ~ 180 정수)
threshold – 만나는 점의 기준, 숫자가 작으면 많은 선이 검출되지만 정확도가 떨어지고, 숫자가 크면 정확도가 올라감.
minLineLength – 선의 최소 길이. 이 값보다 작으면 reject.
maxLineGap – 선과 선사이의 최대 허용간격. 이 값보다 작으면 reject.

profile
@flip_404

0개의 댓글