엣지(edge)와 미분

영상처리에서 엣지란 이미지에서 픽셀의 밝기가 급격하게 변하는 부분을 말한다. 일반적으로 배경과 객체 또는 객체와 객체의 경계를 의미 한다.

객체 경계부분의 픽셀값이 급격하게 변하는 것을 가정으로 하기 때문에 실제로 객체의 경계와 배경의 값이 크게 차이가 없다면 엣지를 구분하기 어렵다.

이미지를 (x,y)변수의 함수로 나타내고 (x,y) 좌표의 픽셀 값을 x로  나타낼 때 다음과 같은 그래프로 표현할 수 있다.

계단함수 성격을 띄는 엣지

그래프에서 볼 수 있듯이 픽셀값이 급격하게 변하는 부분을 엣지라고 볼 수 있다. 이렇게 급격하게 수직형태로 바뀌는 것을 계단함수(step function)라고도 한다. 하지만 사진(이미지)에서 실제로 계단함수 형태로 급격한 변화를 보여주는 경우는 드물고, 보통은 다음과 같이 스무스하게 바뀐다.

완만한 형태의 엣지

하지만 일반적인 이미지는 노이즈가 들어간 형태를 띌 수 있는데, 이런 경우는 가우시안 블러와 같은 필터를 적용하여 그래프를 완만하게 만들어 엣지를 검출한다.

노이즈가 들어간 형태

노이즈가 들어간 이미지에 가우시안 블러를 적용한 형태

기본적으로 엣지를 검출 하는 방법은 위 그래프(함수)의 값이 급격하게 변하는 부분을 찾는 것인데, 함수의 1차 미분(1st derivative) 값이 크게 나타나는 부분을 엣지로 간주한다.

값이 튀는 a 부분을 어디까지 엣지로 간주할 것인지를 결정해야하기 때문에 적절한 threshold(한계점)을 다음과 같이 결정해야 한다.

원래 미분(=순간변화율)이라는 것은 수학적으로 limit라는 기호를쓰고 어떤 변화량 x가 0에 가까워 질 때함수값이 현재위치 x에서 변화량 x를 더하고 자기자신의 함수값을 뺀것에 변화량 x를 나눈 것으로 표현한다.

영상에서 미분은 변화량이라는 것의 최소단위가 픽셀이기 때문에 변화량(△x)을 1로 가정한다. 

미분을 통해 변화량을 계산하는 방법은 3가지 방법이 존재한다.

  • 전진 차분(Forward difference)
  • 후진 차분(Backward difference)
  • 중앙 차분(Centered difference)

 

변화량x가 1이라고 했기 때문에 h를 1로 간주하면 된다.

세가지 방법중에서 어떤것을 사용해도 관계 없으나 보통 중앙차분을 사용하는게 좀 더 정확하다. 전진차분과 후진차분을 사용하는것도 경우에 따라 있으나 보통은 중앙차분으로 계산한다.

그래서 중앙차분으로 계산하는 마스크를 하나 정의 하면 다음과 같다.

위에서 중앙차분의 수식을 이러한 마스크 형태로 표현했다고 생각하면 된다.  가로로 (-1,0,1) 형태로 되어있는것은 x방향으로 미분을 진행하고 세로로 (-1,0,1) 형태로 되어있는것은 y방향으로 미분을 진행한다고 보면된다. 그래서 이 마스크와 함께 OpenCV의 filter2D 함수를 호출하면 x방향의 미분성분과 y방향으로 미분성분을 각각 구할 수 있게 된다.

그렇지만 보통은 1*3 또는 3*1 형태의 마스크보다는 3*3형태의 마스크를 사용하게 된다.

마스크의 형태에 따라 Prewitt, Sobel, 또는 Scharr라고 불린다. Prewitt는 1:1:1의 형태를 띄고, 70년대에 나온 Sobel(소벨)은 1:2:1의 형태를 띈다.  Scharr(샤르)는 2000년대에 나왔으며 3:10:3의 형태를 띄고 있다. 좀 더 가우시안을 잘 표현하고 그래서 미분을 좀 더 정확하게 계산한다고 알려져 있지만 일반적으로는 70년대에 나온 Sobel(소벨) 마스크를 많이 사용한다.

OpenCV에서는 소벨과 샤르 모두 지원하고 있다.

OpenCV소벨 필터를 이용한 미분

Sobel(Mat src, Mat dst, int ddepth, int dx, int dy, int ksize)
src : 원본 영상
dst : 출력 영상
ddepth : 데이터 타입. -1이면 입력 영상과 같은 데이터 타입 사용.
dx : x방향 미분 차수
dy : y방향 미분 차수
ksize : 커널크기

일반적으로 (dx=1, dy=0, ksize=3) 또는 (dx=0, dy=1, ksize=3)으로 지정하여 사용한다. 

소벨필터를 적용한 결과를 확인하자.

x방향 또는 y방향에 따라 엣지가 검출되는 형태가 다른 것을 확인 할 수 있다. 위에서 언급했듯이 단순히 3*3형태의 소벨마스크를 임의로 정의하여 filter2D 함수를 호출해도 동일한 결과를 얻을 수 있다. 이 부분은 생략한다.

OpenCV에서는 샤르 또한 제공한다.

Scharr(Mat src, Mat dst, int ddepth, int dx, int dy)

매개변수는 소벨필터와 동일하다.

샤르필터를 적용한 결과를 확인하자.

Buy me a coffeeBuy me a coffee
카테고리: AndroidOpenCV

0개의 댓글

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.