허프 변환 ( 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보다 큰값이 좋은 결과가 나올 확률이 있다.
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
'Program > OPEN_CV' 카테고리의 다른 글
[Open CV] 영상의 특징 추출 _ 실전코딩 ( 동전 카운터 ) (0) | 2022.06.03 |
---|---|
[Open CV] 영상의 특징 추출 _ 허프변환 _ 원 검출 (0) | 2022.06.02 |
[Open CV] 영상의 특징 추출 _ 캐니 엣지 검출 (0) | 2022.05.31 |
[Open CV] 영상의 특징 추출 _ 그래디언트와 엣지 검출 (0) | 2022.05.30 |
[Open CV] 영상의 특징 추출 _ 영상의 미분과 소벨 필터 (0) | 2022.05.29 |