Point, Line, Edge Detection

1. Simple Detectors

1-1. Edge Detection

Edge를 검출하기 위한 아이디어는 다음과 같다.

(1) Image smoothing for noise reduction

당연하게도 real world에서 노이즈가 없는 것을 불가능 할 것이다. 그러므로 정확한 edge 검출을 위해 smoothing을 해준다.

(2) Detection of edge points

Roberts, Prewitt, Sobel, Scharr filter를 사용한다.

예를 들어 Sobel을 사용한다면

다음과 같은 식으로 edge를 검출한다. 아래는 최종 결과다.

 mask_x = np.array([[-3, 0, 3], [-10, 0, 10], [-3, 0, 3]])
 mask_y = np.array([[-3, -10, -3], [0, 0, 0], [3, 10, 3]]) 
 Gradient_x = cv2.filter2D(image, cv2.CV_32F,mask_x,borderType=cv2.BORDER_CONSTANT)
 Gradient_y = cv2.filter2D(image, cv2.CV_32F,mask_y,borderType=cv2.BORDER_CONSTANT)
 Gradient_magnitude=cv2.magnitude(Gradient_x, Gradient_y)

(3) Edge localization (for better results)

더 좋은 결과를 도출하기 위해 gradient 결과에 threshold를 적용하는 것이다.

1.2 Point, Line Detection

주로 point와 line을 검출하기 위해 2차 미분을 사용한다. 특히, Laplacian 방법을 가장 많이 사용한다.

Laplacian Filter와 Thresholding을 사용하여 간단하게 point, line을 검출할 수 있다.

2. Edge Detection by Marr-Hildreth & Canny

2-1. Marr-Hildreth

Laplacian filter와 Zero crossing을 합친 알고리즘이다.

• Laplacian filter : 상하, 좌우가 대칭이므로 원영상이 회전하더라도 적용이 가능한 이점이 있다. 그러나 2차 도함수를 적용하였기에 2중의 에지가 발생하며, 잡음에 매우 민감하다.
• Zero crossing : 2차미분을 적용한 라플라시안 필터의 문제점인 잡음에 민감한 점과, 2중 에지의 문제점을 해결하기 위한 것이다. 2차 미분 후 화소의 직각으로 이웃한 두 화소가 서로 다른 부호를 가지고 있으면 에지로 구분한다.

다음과 같은 알고리즘으로 처리가 된다.
(1) Log (Laplacian of Gaussian) 필터를 사용한다.

Gaussian으로 noise제거 후 Laplacian을 적용하는 것이다.

(2) Find the zero crossing and thresholding

zero crossing을 찾고, threshold를 사용하여 더 좋은 결과를 도출한다.

2-2. Canny

가장 인기있는 edge dectector 중 하나로 다음과 같은 알고리즘으로 구현된다.

  1. Gradient of Gaussian
  2. non-maximum supperssion
  3. double thresholding
  4. Edge Linking by Hysteresis

1) Gradient of Gaussian
가우시안의 미분한 것을 에지 디텍터로 사용한다는 것이다. 이를 사용하게 되면 에러를 줄일 수 있다는 것을 발견했다.

2) Non-maximum supperssion
gradient의 방향을 파악하고 하나를 고르게 된다. 그리고 내 위치에서 인접 픽셀과 비교한다. 만약 인접 픽셀 중 나보다 큰 것이 있다면 0으로 처리하는 방법이다.

3) Double thresholding
non-maximum을 수행하고 노이즈가 남아있을 수 있다. 그래서 threshold를 두 개를 사용하여 high와 low edge를 검출한다.

4) Edge Linking by Hysteresis
발견한 strong edge의 주변의 week edge를 찾아 제거하는 것이다.

3. Hough Transform

3-1. Line Detection

Line을 검출하기 위해 직선의 방정식 y=ax+b를 구하는 것이 목표이다. 그러나 기울기 a와 y 절편 b에 따라 무수히 많은 직선들을 존재한다. 그래서 이를 a,b 평면 즉, 오른쪽 그림과 같이 파라미터 space에서 생각해본다. 당연히 a,b 값이 고정되면 오른쪽 그림은 한 점으로 찍힐 것이지만 고정이 안되어 있기 때문에 직선으로 표현된다. (b=-ax+y)

이렇게 많은 점들에 대해 파라미터 sapce에서 직선을 그려본다. 그 후 가장 많이 겹치는 부분이 존재할 것이다. 이 부분에 해당하는 a', b'값을 a,b의 값으로 결정하는 것이다. 이렇게 직선의 방정식을 구하여 Line을 검출하는 방식이다.

lines = cv2.HoughLines(edge,1, np.pi/180, 100, None ,0 ,0)

3-2. Circle Detection

첫 번째로 영상에 존재하는 모든 원의 중심 좌표를 찾는다.
원주상의 모든 점에 대해 gradient 방향의 직선을 그린다.
두 번째로 각 워느이 중심에 대해 원주상에 충분히 많은 에지 픽셀이 존재하는 반지름을 찾는다.

circles = cv2.HoughCircles(blurred_img2, cv2.HOUGH_GRADIENT, 1, rows/8, param1=100, param2=30, minRadius=30, maxRadius=60)

좋은 웹페이지 즐겨찾기