허프 변환 직선 검출과 원 검출

BERT·2023년 4월 26일
0

Computer Vision

목록 보기
35/56

허프 변환 직선 검출

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

y=ax+bb=xa+yy=ax+b\Leftrightarrow b=-xa+y

축적 배열

직선 성분과 관련된 원소 값을 1씩 증가시키는 배열

직선의 방정식 y=ax+b 사용 시 문제점

y축과 평행한 수직선 표현 못함 \rarr 극좌표계 직선의 방정식 사용
xcosθ+ysinθ=ρxcos\theta+y\sin\theta=\rho 방정식에 의한 파라미터 공간으로 변환

허프 변환 직선 검출 함수

images : grayscale 엣지 영상
lines : 직선의 파라미터(rho, theta) 저장할 출력 벡터
rho : 축적 배열에서 rho 값의 간격
theta : 축적 배열에서 theta 값의 간격
threshold :축적 배열에서 직선으로 판단할 임계값
srn : 멀티스케일 허프 변환에서 rho 해상도를 나누는 값
stn : 멀티스케일 허프 변환에서 theta 해상도를 나누는 값
min_theta : 검출할 직선의 최소 theta 값
max_theta : 검출할 직선의 최대 theta 값

void HoughLines(InputArray image, 
				OutputArray lines, 
                double rho, 
                double theta, 
                int threshold, 
                double srn = 0, 
                double stn = 0, 
                double min_theta = 0, 
                double max_theta = CV_PI);

houghline

images : grayscale 엣지 영상
lines : 선분의 시작, 끝 좌표(x1, y1, x2, y2) 저장할 출력 벡터
rho : 축적 배열에서 rho 값의 해상도
theta : 축적 배열에서 theta 값의 간격
threshold : 축적 배열에서 직선으로 판단할 임계값
minLineLength : 검출할 선분의 최소 길이
maxLineGap : 직선으로 간주할 최대 엣지 점 간격

void HoughLineP(InputArray image,
				OutputArray lines,
                double rho,
                double theta,
                int threshold,
                double minLineLength = 0,
                double maxLineGap = 0);

houghline

HoughLines()와 HoughLineP()의 속도 비교

허프 변환 원 검출

허프 변환을 응용하여 원을 검출

원 방정식 : (xa)2+(yb)2=c2(x-a)^2+(y-b)^2=c^2

속도 향상을 위해 Hough gradient method 사용

입력 영상과 동일한 2차원 평면 공간에서 축적 영상을 생성
엣지 픽셀에서 그래디언트 계산
그래디언트 방향에 따라 직선을 그리면서 값을 누적
원의 중심을 먼저 찾고 적절한 반지름을 검출
단점 : 여러 개의 동심원 검출 불가

허프 변환 원 검출 함수

image : 입력 영상
circles : (cx, cy, r) 정보
method : HOUGH_GRADIENT 또는 HOUGH_GRADIENT_ALT 지정
dp : 입력 영상과 축적 배열의 크기 비율
minDist : 검출된 원 중심점들의 최소 거리
param1 : Canny edge 검출기의 높은 임계값
param2 : HOUGH_GRADIENT 방법에서는 축적 배열 임계값
minRadius : 검출할 원의 최소 반지름
maxRadius : 검출할 원의 최대 반지름

void HoughCircles(InputArray image,
				  OutputArray circles,
                  int method,
                  double dp,
                  double minDist,
                  double param1 = 100,
                  double param2 = 100,
                  int minRadius = 0,
                  int maxRadius = 0);

HOUGH_GRADIENT

houghcircle

HOUGH_GRADIENT_ALT

houghcircle

HOUGH_GRADIENT와 HOUGH_GRADIENT_ALT의 속도 비교

HOUGH_GRADIENT

houghcircle

HOUGH_GRADIENT_ALT

houghcircle

HOUGH_GRADIENT와 HOUGH_GRADIENT_ALT의 속도 비교

0개의 댓글