[비전4] Edge
◆1. Filters for features
이전에 필터링을 노이즈를 없애거나 줄이는 데에 사용한다고 했었다.
이제 어떻게 필터를 higher-level feature, 즉 의미있는 데이터를 뽑아내는 데에 사용할까에 대해 알아보자.
여기서 의미 있는 데이터란 edge, corner 와 같은 데이터를 의미한다.
◆2. templates matching
: 입력 이미지에서 템플릿 이미지의 위치를 찾는 방법이다.
template matching 은 template image 와 같은 사이즈의 window 를 가지고 source image의 모든 subimage 들과 비교하면서 유사도가 가장 높은 부분을 찾게 되는데, 크기가 같은 두 이미지 유사도를 구하는 방법 중 하나가 바로 NCC가 되는 것이다. (Normalized Cross Correlation)
NCC
: 각 픽셀들을 벡터라고 생각하자, (r,g,b) 이런식으로...
그리고 벡터를 정규화(normalize) 한다. 이 후 이 벡터들을 서로 내적했을 때 나올 수 있는 가장 큰 값은 얼마일까?
바로 1이다. 같은 두 벡터를 내적하는 경우이다. 반대로 가장 작은 값을 -1로 방향이 전혀 반대인 경우이다. 하지만 r,g,b 값은 음수가 없으므로 0이 최소이기도 하다.
다음은 NCC 를 구하는 식이다.
→ n : 픽셀의 개수
여튼 이런 식으로 template image 와 유사도
가 가장 높은 subimage 를 찾아서 그 부분을 template 과 매칭시키면 물체 인식이 되는 것이다.
물론 이미지상에 물체가 존재하지 않을 경우를 생각해서 유사도가 threshold을 넘어가는 경우에만 인식하도록 하는 것이 좋다.
◆3. Edge detection
Edge 란?
1) Edge pixels
영상 내 특정한 픽셀 주변의 밝기 값이 급격하게 변하는 픽셀. 즉, pixel 의 불연속성을 통해 찾아낼 수 있다.
2) Edges
엣지 픽셀들의 연속된 집합. 어떤 것들이 이 Edge 를 발생시키나? 다음 그림을 보자.
적혀있는 대로 depth 의 차이 때문에 생기기도 하고,
3) 1차원에서 edge 감지하는 방법
: 1차 미분(변화량)을 구한다 ⇒
주변 값과의 차이즉, 미분을 수행했을 때 크기가 0이 아닌 특정한 값을 가지는 부분을 활용해 edge를 검출할 수 있다.
4) 2차원에서 edge 감지하는 방법
: image gradient
를 활용한다.
Gradient vector는 해당 픽셀의 변화량이 가장 급격한 방향(rapid change
)을 가리킨다. Gradient vector와 Edge direction 은 수직관계에 있다.
여기서 알아두고 갈 것!
ⓐ Orientation
; 기울기 방향
ⓑ Magnitude
; edge 의 세기
5) Gradient의 방향을 구하면 Edge의 방향을 구할 수 있게 된다.
Derivatives
with convolution 이 때 x축 기반의 경사와 y축 기반의 경사 각각으로 edge 를 감지할 수 있다.
- Edge detection filter 의 종류
Prewitt
Sobel
Roberts
My = fspecial('sobel'); outim = imfilter(double(im), My); imagesc(outim); colormap gray;
◆4. Noise Image's Edge
이미지에 다음과 같이 노이즈가 껴있는 경우 Gradient 를 통한 edge 검출이 힘들 수 있다.
이러한 경우 어떻게 edge 를 찾아야 할까? 여러가지 방법이 있다.
ⓐ Smooth first
gaussian filter 를 통한 blur 처리로 노이즈를 잠재운 다음에 기울기를 찾을 수 있다.
ⓑ Derivative theorem of convolution
위의 방법에서 약간 순서만 바꾼 듯한 방식이다. step은 다음과 같다.
이게 왜 될까? 오른쪽의 공식이 성립하기 때문이다. 도함수를 따로 빼낸 다음에 계산을 해도 똑같다는 것을 알 수 있다.
두 방법 중에 Gaussian filter(low-pass filter의 일종) 의 미분을 구한 다음 기존의 이미지에 계산해주어 한번에 edge 를 찾는 것이 더 편해보인다. 이 때 Gaussian filter 의 미분 형태는 다음 두가지로 이루어져 있다.
어? 왜 갑자기 두 가지지? 이 질문에 대한 답은 이전 포스트에서 알 수 있다.
이전 포스트에서 Gaussian filter 의 분리가능성에 대해 잠깐 봤었다.
즉 이 성질에 의해 Gaussian 의 기울기 역시 각각 separate 된 놈의 기울기 곱으로 쪼개지기 때문에 위처럼 x축 방향, y축 방향 두 가지로 이루어져 있다고 봐도 무방하다.
여튼 이런식의 방법으로 noise 를 제거하면서 edge 를 찾을 수 있다. 하지만 이 때 사용되는 Gaussian filter 의 크기가 클 수록 blur 처리되어 edge 가 검출이 되니 이점만 주의하자. 다만 어느게 정답인 거인지는 그때그때 다르다.
Laplacian
of Gaussian
도함수의 도함수를 통해 noise 를 감안한 edge 도출 역시 가능하다. 이 때는 다만 급격한 변화가 아닌 0을 통과하는, 즉 부호가 바뀌는 부분이 edge 이다.
또한 라플라시안 역시 x, y 축 기준으로 쪼갤 수 있다. (separate 가능!)
◆5. Edge Dectector
Thresholding
어떻게 pixel 을 솎아내어 최적화 할까? 에 대한 하이퍼파라미터 설정이 필요하다. 이 역시 비전 공학의 특성에 맞게끔 그때그때 융통성 있게 처리해야 한다고 한다.
위의 그림을 예시로 들었을 때, higher threshold 에 의해 뽑아내진 edge 가 더 인식하기 좋다는 것을 알 수 있다.
ⓐ Canny edge detector
Gaussian 으로 noise를 다룬 후 edge 를 뽑아내는 방법이다. 특이한 점은 Non-maximum suppression
으로 여러개의 edge 가 도출 된 경우 가장 선명한 edge 를 뽑아내는 방식을 사용한다는 점이다.
이 NMS 는 edge 뿐 아니라 detection 할 때에도 사용하니 알아두자.
다음 그림들이 Canny edge detector 를 사용한 예시이다. canny는 threshold 를 주어 edge 를 적절히 솎아낼 수 있으며 가우시안 필터를 통해 노이즈 처리 후 edge 를 검출한다는 거 알아두자.
Non-maximum suppression
위에서 말했듯이 기울기가 여러 개 있을 때 가장 큰 값을 선택한다는 방식을 이야기한다.
여튼 이 NMS 와 Thresholding 방식으로 edge 를 찾게 되었을 때 분명히 edge 인데 threshold 보다 작아 살아지는 문제가 생길 수 있다. 보통 곡선에서 이 문제가 많이 일어난다.
이 문제를 해결하기 위해 Hysteresis thresholding
방식을 사용한다.
오류를 최소화하기 위해 자신의 값 뿐만 아니라 주변의(공간적 또는 시간적으로) 값을 같이 참조하는 것이 효과적이다.
Hysteresis thresholding은 주변의 분류 결과에 따라서 자신의 분류 결과가 달라질 수 있는 thresholding 기법으로서 Canny edge detector에 사용된 이진화 기법이 가장 대표적인 예이다.
Hysteresis thresholding
방식의 과정은 다음과 같다.
- high threshold와 low threshold의 두 개의 threshold 값이 존재하며 high threshold 이상의 edginess 를 갖는 픽셀들은 무조건 edge 픽셀로 분류한다.
- low와 high 사이에 있으면서 이미 edge로 분류된 픽셀들과 연결되어(인접해) 있으면 edge 픽셀로 분류한다.
- 나머지 픽셀들(low threshold 이하이거나 high threshold 이하이면서 edge 픽셀과 연결되어 있지 않은 경우)은 모두 non edge 픽셀로 분류한다.
참조링크