영상을 분석하는데 있어서 매우 중요한 정보가 되는 keypoint (영상 특징점)와 descriptor(영상 기술자)! 오늘은 이것들을 정리해볼까 합니다.

- Scale Space Representation of Image

- Keypoint Detection

- HOG Descriptor: SIFT, SURF

- Binary Descriptor: BRIEF, BRISK, FREAK

정도의 내용을 담고자 하는데, 분량이 어마하네요 -_-;;; 아무튼 목표는 크게!

들어갑니다!

 

1. Scale Space Representation for Keypoint Detection


1.1. Keypoint (특징점, 관심점) 란?

descriptor(기술자)를 알아보려면 먼저 keypoint (특징점, 관심점) 부터 알아야 합니다. image에서 keypoint란 그 image의 특징을 잘 나타내줄 수 있는 부분을 의미합니다. 다음 그림 1을 살펴봅시다. 빨간 색 점으로 표시된 부분이 해당 image의 keypoint입니다. 잘 보시면, '다각형의 꼭지점(corner)'이나 '선분의 끝점' 이 주로 keypoint가 되는 것을 알 수 있습니다.

그림 1. keypoint 의 예 [1]

1.2. scale 처리가 왜 필요할까?

그럼 corner detector를 한 번 생각해볼까요?

일반적으로 corner를 detect하는데는 Gaussian filter 와 미분값이 사용됩니다 (왜 Gaussian과 미분값이 사용되는지는 모르셔도 넘어가도 됩니다.). Gaussian filter와 미분은 image processing에서는 일반적으로 정사각형의 filter로 구현됩니다.

그럼 다음 그림 2를 살펴보도록 하죠.

그림 2-(a)는 detect할 corner가 작은 경우를 보여줍니다. 이 때는 작은 크기(scale)의 filter만으로도 corner부분을 모두 포함시켜서 처리할 수 있습니다. 따라서 작은 크기의 filter만으로도 충분히 해당 부분이 corner인지 아닌지 알 수 있습니다. 하지만 그림 2-(b)와 같이 corner가 큰 경우에는 작은 크기의 filter는 corner 영역을 충분히 포함할 수 없습니다. 따라서 corner를 찾는데 실패할 것입니다. 이 경우, 그림 2-(c)와 같이 큰 크기의 filter를 사용해야 합니다.

그림 2. Corner Detection 과 Scale

 

1.3. Scale을 바꾸어 가면서 처리하는 두 가지 방법


1.3.1. filter scale을 바꾸기.

위 그림 2의 예에서 서로 다른 크기의 corner를 detect하기 위해서 서로 다른 크기의 filter 를 사용했었습니다. 이와 같이 작은 크기의 filter부터 큰 크기의 filter까지 적용해가면서 image내의 모든 크기의 keypoint를 찾을 수 있습니다. 이것을 그림으로 표현해보면 다음 그림 3과 같습니다. filter 크기가 역피라미드 형태로 변하는 것을 알 수 있습니다. 즉, filter size가 커질수록 scale이 큰 keypoint를 찾을 수 있습니다. SURF(Speed-Up Robust Feature) descriptor가 이와 같은 방식을 사용합니다.

 

그림 3. Filter Scale을 변화시켜가면서 Keypoint를 Detect하는 방법[2].

1.3.2. image scale을 바꾸기.

<image의 크기를 고정시키고 filter 크기를 키워가면서 keypoint를 찾는 것>이 가능하다면, 당연히 <filter 크기를 고정시키고 image의 크기를 줄여가면서 keypoint를 찾는 것>도 가능할 것입니다. 그림 4는 image scale을 바꾸어가면서 keypoint를 찾는 방식을 보여줍니다. image 크기는 1.3.1.과는 달리 피라미드 형태로 변하는 것을 알 수 있습니다. 즉, image가 작아질수록 큰 scale의 keypoint를 찾을 수 있음을 의미합니다. <image가 작은 게 큰 scale을 표현한다>는 것에 유의해야 합니다. 얼핏 생각해보면 image가 커지는 게 큰 scale을 나타내는 거 아니냐!! 라고 생각하실 수 있는데 그러시면 안됩니다. SIFT(Scale-Invariant Feature Transform)가 이와 같은 방식을 사용합니다.

그림 4. Image Scale을 변화시켜 가면서 Keypoint를 Detect하는 방법[2]

그런데 filter scale을 바꾸는 방식과 달리 image scale을 바꾸는 방식은 다시 두 가지 방법으로 구현됩니다.

Decimation

image scale을 바꾸는 가장 직관적인 방법은 image 크기를 줄이는 것입니다. 이것을 signal processing에서는 Decimation이라고 표현을 하죠. 가령 첫번째 pixel은 그대로 두고 두번째 pixel을 빼서 버리고, 이 과정을 모든 image 내 pixel에 대해 반복하면 original image대비 50% 크기의 image를 얻을 수 있습니다. (pixel버리기 전에 Low-Pass Filtering을 해야만 aliasing이 안생깁니다만 여기서 다룰 이야기는 아니니..) 다시 한 번 위 과정을 반복하면 25% 크기의 image를 얻을 수 있겠지요. 그림 5는 이와 같이 decimation에 의해 image scale을 바꾸는 예를 잘 보여줍니다. 이렇게 피라미드식 스케일링(스케일이 커질수록 작아지는)으로 표현한 것을 피라미드 이미지라고 합니다.

 

그림 5. Decimation에 의한 Multi-Scale 구현 (피라미드 이미지)

 

(Gaussian) Smoothing

Decimation을 해주면 sampling rate를 낮추어준다는 의미가 되며, image 화소수가 줄어든다는 의미도 되며, 이것은 곧 해상도가 줄어든다는 의미이기도 합니다. 그리고, 그것은 high frequency 성분 (작은 corner는 큰 corner에 비해 high frequency입니다.)이 버려진다는 의미가 됩니다. 해상도가 낮은 카메라로 찍은 사진은 detail한 부분을 표현하지 못할 테니 말이지요.

이러한 성질을 이용해서 image 의 scale을 새롭게 표현할 수 있습니다. 즉, detail한 부분을 인위적으로 날려버리는 것이지요. 이것을 signal processing 에서는 Smoothing이라고 표현을 합니다. 따라서 detail한 부분을 많이 없애면 없앨수록 큰 scale을 표현한다고 할 수 있습니다.

image processing에서는 Gaussian Smoothing을 이용합니다. Gaussian filter가 여러 좋은 성질을 지녔기 때문입니다. (가령 Gaussian filter에 다시 Gaussian filter를 convolution해도 또 Gaussian filter가 됩니다.) 이때 Gaussian filter의 variance(분산)을 scale parameter라고 합니다. 그림 6은 Gaussian Smoothing 에 의해 Multi-Scale Image를 구현하여 보여주는 예입니다.

 

그림 6. Gaussian Smoothing에 의해 Multi-Scale을 구현[3]

 

참고문헌

[1] S. Leutenegger et al., "BRISK: Binary Robust Invariant Scalable Keypoints," ICCV 2011.

[2] OpenSURF , Chris Evans Development

[3] Scale Space, Wikipedia


https://www.facebook.com/lab4all 에 오셔서 '좋아요'버튼을 누르시면 페이스북에서도 블로그 내/외의 글들을 쉽게 보실 수 있습니다.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License
  1. 흑흑 5부작 생각했으나 하나쓰고 너무 바빠서 못적었더니..
    뒷부분 다 까먹었네요 -_-;;; 아 민망해라..

    • 염소녀 2017.04.13 16:14 신고

      5부작 부탁해요~~

  2. 염소녀 2017.04.07 15:25 신고

    그림 6이 안나와요 ㅠㅠ~~~

+ Recent posts