티스토리 뷰

OpenCV

[OpenCV] Scharr filter

생각많은 소심남 2012. 8. 23. 16:58

Learning OpenCV에 보면 sobel 미분에 세부 내용으로 scharr 필터에 대한 내용이 들어가 있습니다. 지난 포스트에서 언급하기로는 소벨 미분은 각 축에 대한 미분을 실시해서 다항식을 근사화시킨 결과라고 했습니다. 물론 기존의 복잡한 다항식에서 근사화시킨 결과이기 때문에 연산속도의 측면에서 빠를 수 있겠지만 문제는 근사화 과정에서 손실되는 표본의 정보가 많을 수도 있다는 겁니다. 이 때 인자로 사용되는 aperture_size를 크게 하면 커널의 크기가 커져서 이런 문제를 해결할 수 있습니다.


 그 와중에 aperture_size에 집어넣을 수 있는 값 중 하나가 바로 Scharr filter, 즉 CV_SCHARR 라는 값입니다. 기존의 3x3 sobel operator가 

<출처: 위키피디아>

라고 정의된다면 scharr operator는

와 같이 정의됩니다.이를 사용하면 기존 소벨을 사용했을 때의 에러를 보정하는 효과가 나타난다고 합니다. 한번 적용결과를 보도록 하지요.


<xorder = 1 yorder = 0>


왼쪽이 단순히 aperture_size를 3으로 둔 결과이며, 오른쪽이 CV_SCHARR를 집어넣은 결과입니다. 딱 봐도 왼쪽의 결과가 조금더 정밀하게 표현되고 있는 걸 볼 수 있습니다. 그럼 과연 이렇게 Scharr를 적용할 결과와 aperture_size를 키운 값의 차이도 궁금해질텐데요.



왼쪽의 경우가 aperture_size를 5로 키웠을 때의 결과입니다. 무언가 명확하게 구분은 되지만 너무 구분이 된다는 점, 그리고 그 deriavative를 묘사하면서 같이 depth가 묻혀버리는 경우가 등장합니다. 


Scharr 필터를 적용하는데 있어서 유의할 점이라면 어느 한축으로 미분된 케이스에만 적용이 가능하다는 겁니다. opencv폴더에 있는 deriv.cpp 파일을 보면 scharr 필터를 적용한 결과값에 대한 식이 도출되어 있습니다.



여기서 조건 검출을 하는 CV_Assert 부분을 보면,


이 조건이 만족되어야 scharr kernel을 얻을 수 있다는 것이지요. 즉 어느 한축으로든 1차미분이 된 상태여야 된다는 겁니다. 

댓글