티스토리 뷰

OpenCV

[OpenCV] Laplacian 함수

생각많은 소심남 2012. 8. 27. 15:44

계속적으로 외곽선에 대한 정리를 해보고 있습니다. 이전에 다뤘던 sobel이나 scharr 필터 같은 경우에는 미분 차수를 어떻게 하느냐에 따라서 결과값의 변화가 나타나는 것을 알 수 있었습니다.

 그런데 Marr 라는 사람이 이런 방법 외에도 영상처리에 Laplacian을 적용할 수 있지 않을까 해서 1982년에 Vision이라는 책에 그 내용을 정리합니다. 보통 함수는 다음과 같이 구성됩니다.

보다시피 2차 미분항들의 합으로 구성되어 있습니다. 이미지의 가로와 세로에 대한 그레디언트를 2차 미분한 값인 거지요. 사실 보면 거의 소벨 함수에서 xorder와 yorder를 2로 한 값과 유사할 거라고 여겨집니다. 실제로 내부를 들여다보면 다음과 같이 구현되어 있습니다.



중간에 Sobel에 관해서 접근하는 항목이 보입니다. 이를 보아 성격은 거의 유사한데 미분의 정도가 더해진 걸로 여기시면 될거 같습니다. 즉 이때는 xorder와 yorder 값이 정해져 있기 때문에 따로 인자로 넣을 필요가 없지요. 그래서 이 함수의 쓰임도 다음과 같이 됩니다. 

void cvLaplace(

const CvArr*  src,                            - 처리할 원 이미지

CvArr*           dst,                            - 처리 후의 이미지

int                aperture_size = 3          - Kernel 사이즈

);


Learning OpenCV 책에 따르면 보통 이 함수는 blob을 검출하는데 많이 사용된다고 합니다. blob이라고 하면 이미지 상에서 주위 픽셀과 확연한 픽셀차이를 나타내는 하나의 덩어리입니다. 그래서 주변 픽셀보다 그 blob의 픽셀값이 크면 음수, 작으면 양수 값을 반환합니다. 

 그러면 이렇게 생각할 수도 있는거지요. 만약 커널을 통과한 후에 주변값과 그 blob의 픽셀 값이 같다면? 누차 말했지만 이 라플라스 함수는 이차 미분 값들의 합입니다. 픽셀값이 급격히 변한다면 그 주변에는 음과 영이 확연하게 갈릴 것이고 그 주위의 값을 1차 미분하면 분명 양수나 음수가 나올 겁니다. 그 와중에 그 포인트에서 멀어지면 다시 그 수에 반하는 값이 나올 것이지요. 다르게 이야기 하면 그런 현상속에서 2차 미분값이 0인 지점을 통과하게 됩니다. 그 점이 바로 엣지가 되는 것이고 이런 특성을 이용해서 엣지 검출하는데 사용할 수 있습니다. 다만 약간 명확하지 않은 부분에 대해서도 엣지라고 판단할 수 있기 때문에 Threashold 값을 주던지의 처리가 필요합니다. 

 그럼 한번 적용한 결과를 보겠습니다.


<원본 이미지>



무언가의 영향으로 손의 일부분이 잘려있습니다. 

size를 증가시킬 때마다 edge가 확연하게 구분되는 것을 볼 수 있습니다. 단 외곽선이 size가 커져가면서 두개로 분리되는 것이 한계인 것이죠. 그러면 일상적으로 정의되어 있는 size에서 sobel과 scharr, laplace를 비교해보겠습니다.



분명 무언가를 필요로 한다면 적당한걸 사용하는게 좋겠지요.

댓글