Python

[Python] openCV : Hough Transformation

SangRok Jung 2022. 11. 17. 12:15
반응형

Hough Transformation(허프 변환) 직선 검출


2차원 영상 좌표에서 직선의 방정식을 parameter 공간으로 직선을 찾는 알고리즘

 

 

 

허프 변환으로 직선의 방정식을 찾으려면 xy공간에서 에지로 판별된 모든 점을 이용하여 AB 파라미터 공간에 직선을 표현.

직선이 많이 교차되는 좌표를 모두 찾아야 함.

이떄 직선이 많이 교차하는 점을 찾기 위해서 보통 축적 배열(ACCUMULATION ARRAY)을 사용.

축적 배열은 0으로 초기화된 2차원 바열에서 직선이 지나가는 위치의 배열 원소 값을 1씩 증가시켜 생성.

  • Y = AX + B 직선의 방정식을 사용할 경우 모든 형태의 직선을 표현하기 어려움
    • y축과 평행한 수직선을 표현할 수 없음.
    • 수직선을 표현하려면 기울기 A 값이 무한대가 되어야 하기 때문.
  • 허프 변환 구현시 다음과 같이 극 좌표계 형식의 직선의 방정식 사용.

  •  P는 원점에서 직선까지의 수직 거리를 나타냄.
  • Theta는 원점에서 직선에 수직선을 내렸을 때 x축과 이루는 각도를 의미
  • XY 공간에서 한 점은 PTehta공간에서 삼각 함수 그래프 형태의 곡선으로 표현됨.
  • PTheta공간에서 한 점은 XY공간에서 직선으로 나타나게 됨.
  • 극좌표계 형식의 직선의 방정식을 사용하여 허프 변환을 수행할 경우에도 축적 배열을 사용함.
  • 축적 배열에서 국지적 최댓값이 발생하는 위치에서의 P와 Theta값을 찾아 직선의 방정식을 구할 수 있음.

 

 

 

 

 

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

  • img : input(canny edge 선 적용 후)
  • rho : R 값의 범위 (0~1 실수)
  • theta : theta값의 범위(0~180 정수)
  • threshold : 만나는 점의 기준, 숫자가 적으면 많은 선이 검출되지만 정확도가 떨어지고, 숫자가 크면 정확도가 올라감

▶ cv.HoughLinesP(img, rho, theta, threshold,m minLineLength, maxLineGap)

  • cv2.HoughLines는 모든 점에 대해서 계산하므로 시간이 오래 걸린다.
  • 따라서 모든 점을 대상으로 하는 것이 아니라 임의의 점을 이용하여 직선을 찾는 방법.
  • 단 임계값을 작게 설정.
  • 선의 시작점과 끝점을 Return해 주기 때문에 쉽게 화면에 표현.

 

 

 

 

 

 

 

 

Hough Transformation(허프 변환) 원 검출


  • 원의 중심 좌표를 찾는 과정에서 축적 배열 사용.
  • 허프 그라디언트 방법에서 사용하는 축적 배열은 파라미터 공간에서 만드는 것이 아니라 입력 영상과 동일한 XY 좌표 공간에서 2차원 배열로 만듦.
  • 원의 중심을 찾기 위해 허프 그라디언트 방법은 입력 영상의 모든 에지 픽셀에서 그라디언트를 구함.
  • 그라디언트 방향을 다르는 직선상의 축적 배열 값을 1씩 증가시킴.
  • 원주상의 모든 점에 대해 그라디언트 방향의 직선을 그림.
  • 직선상의 축적 배열 값을 증가시키면 결과적으로 원의 중심 위치에서 축적 배열 값이 크게 나타나게됨.
  • 일단 원의 중심을 찾은 후에는 다양한 반지름의 원에 대해 우너주상의 충분히 많은 에지 픽셀이 존재하는지 확인하여 적절한 반지름을 선택함.

▶ cv2.HoughCircles(IMG, method, DP, minDistm, circles, param1, param2, minRadius, maxRadius)

  • 3개의 변수에 대해 계산하는 것은 비효율적이므로 가장자리에서 기울기를 측정하여 원을 그리는데 관련이 있는 점인지를 확인할 수 있는 Hough Gradient Method를 사용.
  • img : input(canny edge 선 적용 후)
  • method : 검출 방법. 
    • ex) HOUGH_GRADIENT
  • dp : 해상도
  • minDist : 검출한 우너의 중심과의 최소거리, 값이 작으면 원이 아닌 것들도 검출이 되고, 너무 크면 원을 놓칠 수 있다.
  • param1 : 내부적으로 사용하는 canny edge 검출기에 전달되는 파라미터.
  • param2 : 이 값이 작을 수 록 오류가 높아짐. 크면 검출률이 낮아짐
  • minRadius : 원의 최소 반지름
  • maxRadius : 원의 최대 반지름

 

▶ 모폴로지 연산 및 레이블링

  • 모폴로지의 기본적인 연산은 침식과 팽창으로 침식은 영상의 영역을 깎아내리고 팽창은 덧 붙인다.
  • 열림 연산은 침식과 팽창을 차례로 적용한 것이고 닫힘 연산은 팽창과 침식을 차례로 적용한 것이다.
  • 레이블링은 임계값이 적용된 이진 영상에 모폴로지 연산을 적용 한 후 각 객체 별로 레이블링을 지정하는 알고리즘이다.
  • 레이블링의 대표적인 방법은 연결 구성 요소 레이블링으로 연결된 구성 요소에 같은 레이블을 지정한다.

 

 

 

▶ 에지 추출 및 허프 변환

  • 기본적인 에지 추출은 미분 필터링으로 가능하고 정확한 에지 추출을 위해 가장 많이 사용되는 방법이 케니 에지 검출기이다.
  • 허프 변환은 함수의 파라미터를 구하기 위해 원 함수를 파라미터 공간으로 변환하여 구하는 방법으로 직선 검출과 원 검출에 적용 할 수 있다.

 

 

 

 

 

 

 

 

 

 

반응형

'Python' 카테고리의 다른 글

[Python] openCV : Matching  (0) 2022.11.17
[Python] openCV : Moments  (0) 2022.11.17
[Python] openCV : Corner Detect  (0) 2022.11.17
[Python] openCV : Canny Edge Detection  (0) 2022.11.17
[Python] openCV : Labeling  (0) 2022.11.17