본문 바로가기
Image processing

엣지 검출과 허프 변환

by 권세희 2021. 3. 12.

Edge란 경계선, 윤곽선을 의미하며 영상처리에서는 밝기가 급격하게 변하는 부분을 말한다. 

 

픽셀 값이 급격하게 변하는 지점이 Edge부분이며 Edge를 검출함으로써 물체의 의치, 모양, 크기, 방향성 등에 대한 정보를 쉽게 찾을 수 있다.

 

픽셀은 곡선 그래프처럼 연속 공간에 있는 것이 아니기에 미분 근삿값으로 Edge을 찾을 수 있다. 이 말은 서로 붙어 있는 픽셀 값의 차를 구하면 된다는 것이다.

 

 

💡 Sobel Filter

Sobel이 고안해낸 가장자리 검출 알고리즘으로 3X3 크기의 행렬을 사용하여 연산하였을 때 중심을 기준으로 각 방향 값을 비교하여 픽셀 값의 변화량을 검출한다. 

 

X축 필터세로 성분을 검출하고 Y축 필터가로 성분을 검출한다.

 

대각선을 검출하는 Sobel filter는 다음과 같다.

Sobel Filter는 모든 방향의 Edge 추출이 가능하지만 대각선 방향 Edge에 더욱 민감하게 반응한다. 또한 돌출한 화소 값을 평균화하므로 잡음에 강하다.

 

 

 

원본 영상을 각각 Sobel 필터를 적용해서 Edge을 검출한 것이다. 위에서부터 오른쪽 방향으로 수직을 검출하는 X축 필터, 수평을 검출하는 Y축 필터, 각각 대각선을 검출하는 필터이다.

 

 

💡 Canny Edge

Edge 검출 알고리즘에서 가장 신뢰성이 높고 간편하여 보편화된 알고리즘이다. 도형의 윤곽을 하나의 선으로 얻을 수 있으며 이미지의 특징 추출을 위한 전처리로 많이 활용한다.

 

✌ Canny Edge Detection

1️⃣ 노이즈 제거 : 가우시안 필터 사용

 

2️⃣ Edge Gradient(기울기) 계산하여 Gradient값이 높은 부분을 찾기(=Sobel filter 사용)

함수의 점에서 미분을 하면 접선의 기울기가 나오며 기울기는 연속된 픽셀 값의 차이 즉 Edge가 된다.

따라서 함수의 그래프를 미분하는 방법은 모든 픽셀을 Sobel Filter로 Convolution 연산하는 것이다.

 

3️⃣ 최댓값이 아닌 픽셀의 값을 0으로 만들기

Edge에 기여도가 적은 픽셀을 제거하기 위해 이미지를 전체 스캔합니다. 이미지를 스캔하면서 기울기 방향으로 기울기 값이 최댓값을 가진 픽셀을 찾는다.

A는 수직 방향 위의 에지 위에 있는 픽셀이다. 기울기 방향을 수평이고 B와 C는 기울기 방향에 놓인 픽셀이다. A지점에서 기울기 값이 B, C보다 큰지 확인하며 A값이 크다면 넘어가고 아닐 경우 0으로 만들어 픽셀을 억제한다.

 

4️⃣ Hyteresis Thresholding

기울기 강도가 maxVal보다 크면 Edge, minVal보다 작으면 Edge가 아니라고 판단하여 제거한다.

 

A는 maxVal보다 위에 있으므로 확실한 에지이고 B는 A(확실한 에지)와 연결되어 있지 않으므로 제거한다. C는 A와 연결되어 있기에 A와 C만 남겨두고 B는 제거한다.

 

위의 알고리즘을 구현한 함수가 cv2.Canny() 함수이다.

 

cv2.Canny(img, minimum thresholding value, maximum thresholding value)

 

함수의 인자는 이미지와 minVal, maxVal만 설정하여주면 된다.

 

Sobel filter 적용 후
Canny Edge 적용 후

 

💡 허프변환

연결 관계가 명확하지 않거나 잡음으로 인해 작은 조각으로 끊어져 있는 경우가 많다. 따라서 허프 변환은 전체 공간을 조사해서 연결 과정 없이 바로 직선을 검출한다.

 

한 점이 가질 수 있는 직선은 많기에 기울기와 절편을 고정시킬 수 없다.

따라서 [a-b] 공간으로 바뀐다면 한 점이 가질 수 있는 모든 직선을 하나의 직선으로 표현할 수 있다.

 

그러나 이를 다시 [x-y] 공간으로 바꿀 시 a, b의 범위가 무한대가 될 수 있다. 영상에는 화소가 존재하는 디스플레이의 세로, 가로 범위가 유한하기에 영상에는 범위가 존재하여 무한대가 되면 안 된다. 그래서 범위가 유한한 변수들을 사용하여 공간을 변환해야 한다. 

[x-y] 공간에서 [θ-r] 공간으로 변환하는 것을 허프 공간으로의 변환이라고 한다. 즉 직선 위에 있는 점이 곡선으로 변한다. 

 

허프 변환의 OpenCV함수로는 cv2.HoughLines가 있다.

 

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

 

인수는 아래와 같다.

img: 입력 이미지, 1 채널 바이너리 스케일
rho: 거리 측정 해상도, 0~1
theta: 각도, 라디안 단위 (np.pi/0~180)
threshold: 직선으로 판단할 최소한의 동일 개수 (작은 값: 정확도 감소, 검출 개수 증가 / 큰 값: 정확도 증가, 검출 개수 감소)
lines: 검출 결과, N x 1 x 2 배열 (r, Θ)
srn, stn: 멀티 스케일 허프 변환에 사용, 선 검출에서는 사용 안 함
min_theta, max_theta: 검출을 위해 사용할 최대, 최소 각도