Program/OPEN_CV

[Open CV] 영상의 특징 추출 _ 허프변환 _ 직선 검출

사막여유 2022. 6. 1. 20:06
728x90

 

허프 변환 ( Hough Transform ) 직선 검출이란?

 -  2차원 영상 좌표에서의 직선의 방정식을 파라미터 ( parameter ) 공간으로 변환하여 직선을 찾는 알고리즘

 

에지 추출 결과는 보통 검은배경에 흰 라인형태로 에지가 나타나게 된다. 즉, 입력영상에서 에지가 있는 좌표를 모두 

추출할 수 있다는 의미이다.

그럼 그 좌표를 이용하여 직선 또는 곡선의 정보를 추출해내고자 하는 시도들이 많이 있는데

그 중 가장 대표적인게 허프변환 ( 직선검출 ) 이다.

 

그렇지만 직선의 정보를 추출하기 위한 알고리즘이라고 생각하기보다는 위 설명처럼

직선의 방정식을 파라미터 공간으로 변환하여 누적행렬을 이용해서 원하는 파라메타를 찾는

방정식 ( 알고리즘 ) 이라고 생각하는 것이 맞다.

 

위처럼 y = ax + b 를  b = -xa + y로 변환하는 과정에서,

좌측 빨간 점을 b = -xa + y의 식에 대입해보면 우측 좌표의 빨간 직선으로 표현이 되고

좌측 주황 점을 b = -xa + y의 식에 대입해보면 우측 좌표의 주황 직선으로 표현된다.

그렇게 좌측 파란 직선의 점들을 우측 식에 대입하게되면 ( a' , b' ) 의 좌표를 지나는 직선으로 표현된다.

즉, 좌측 공간에서의 점들은 우측공간에서 직선으로 표현된다는 아이디어를 사용하여 직선 정보를 판단하는 것이다.

 

 

다시 정리해보자면 좌측 좌표평면상에서 나온 엣지들의 정보를 우측의 행렬에 직선으로 그려 지나는 점들을 +1씩

증가시킨 뒤 공통적으로 지나는 점 ( 가장 큰값의 원소 ) 의 행렬값을 좌측 좌표평면에 직선방정식에 대입하여

직선을 만들어 표현할 수 있다.

 

하지만 직선의 방정식 y = ax + b 를 사용할 때의 문제점이 존재한다.

y 축과 평행한 수직선을 표현하지 못한다는 문제이다

따라서 이 부분은 극좌표계 직선의 방정식을 사용하여 해결한다.

 

 

위 극좌표계의 직선 방정식을 사용하게되면 위에서 설명했던 직선의 방정식과 같은 방식으로 직선을 구할 수 있다.

 

 

 

 

cv2.HoughLines ( image, rho, theta, threshold, lines, srn, stn, min_theta, max_theta ) - lines

허프 변환에 의한 선분 검출

image : 입력 에지 영상 ( ex. Canny Edge 검출 영상 )

rho : 축적 배열에서 rho 값의 간격 ( 1.0 ->1픽셀 간격 ) 

theta : 축적 배열에서 theta 값의 간격 ( np.pi / 180 -> 1' 간격 )

  * rho theta 값을 작게 줄 경우 축적배열이 커짐 - Hough Transform시 시간이 더 많이 걸림 ( 정교함 )
     rho theta 값을 크게 줄 경우 축적배열이 작아짐 - Hough Transform시 시간이 더 적게 걸림

threshold : 축적 배열에서 직선으로 판단할 임계값

lines : 직선 파라미터 ( rho, theta ) 정보를 담고 있는 numpy.ndarray.
           shape = ( N,1,2 ) , dtype = numpy.float32

srn, stn : 멀티 스케일 허프 변환에서 rho 해상도,  theta 해상도를 나누는 기본값은 0이고, 이경우 일반 허프 변환 수행

min_theta , max_theta : 검출할 선분의 최소, 최대 theta 값

 

cv2.HoughLinesP ( image, rho, theta, threshold, lines, minLineLength, maxLineGap ) - lines

확률적 허프 변환에 의한 선분 검출

image : 입력 에지 영상 ( ex. Canny Edge 검출 영상 )

rho : 축적 배열에서 rho 값의 간격 ( 1.0 ->1픽셀 간격 ) 

theta : 축적 배열에서 theta 값의 간격 ( np.pi / 180 -> 1' 간격 )

  * rho theta 값을 작게 줄 경우 축적배열이 커짐 - Hough Transform시 시간이 더 많이 걸림 ( 정교함 )
     rho theta 값을 크게 줄 경우 축적배열이 작아짐 - Hough Transform시 시간이 더 적게 걸림

threshold : 축적 배열에서 직선으로 판단할 임계값

lines : 선분의 시작과 끝 좌표 ( x1, y1, x2, y2 ) 정보를 담고있는 numpy.ndarray. 
           shape = ( N, 1, 4 ), dtype = numpy.int32

minLineLength : 검출할 선분의 최소길이

maxLineLength : 직선으로 간주할 최대 에지 점 간격
                            * 0보다 큰값이 좋은 결과가 나올 확률이 있다.

 

 

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

https://bit.ly/3L3avNW

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

728x90