컴퓨터 비전에 사용되는 Canny Edge에 설명해 보겠다. Canny Edge란 사진에서 물체와 물체의 경계가 되는 선을 찾는 것이다. 막상 생각해보면 어렵겠지만 한번 이해 한다면 그렇게 어렵게 느껴지지 않을 것이다. (흑백 사진을 기준으로 한다.)
첫번째로 사진의 x축 gradient(경사도, 가중치)와 y축 gradient를 구한다. 구하는 방법은 gradient를 구할 필터를 하나 만들고 그것을 한픽셀 한픽셀씩 convolution하면 되는 것이다. 다시 말해 필터를 만들어 반복문을 통하여 한픽셀 한픽셀씩 픽셀의 gradient를 구하면 되는 것이다. 예를 들어 설명하자면 [-2 -1 0 1 2] 라는 1*5행렬의 필터를 만든다. 그리고 어떤 x,y의 픽셀에 저 필터를 대입하면 x,y의 값에는 0이 곱해지고 주위의 한픽셀씩에는 -1과 1이 2픽셀 옆에는 -2와 2의 값이 곱해진다음 0을 곱한 x,y를 포함한 5개의 숫자를 더한 값이 새로운 배열의 값이 된다. 이 방식을 이용해 원래 사진과 같은 크기의 배열을 만들어 낼 수 있다. y축은 저것을 5*1배열의 필터를 만들어 반복하면 된다. (저 필터의 크기나 값은 이 방식을 이해한다면 원하는 대로 바꿀 수 있다.)
처음에는 이게 어떤 의미인지 헷갈릴 수 있다. 만약 사진의 평평한 부분 흰도화지에 저 필터를 적용 한다고 생각해보자. 자신의 좌우나 세로의 주변 값은 모두 동일할 것이다. 그럼 동일한 값에 -2와 -1을 곱하고 1과 2를 곱해서 다 더한 값은 0이나 0에 가까운 숫자가 나올 것이다. 필터를 사용하다가 흰색부분을 지나서 검은색지역으로 넘어 간다고 생각해보자. 그러면 그 경계가 되는 부분에서 [흰색] [검출 대상 픽셀] [검정] 처럼 흰색과 검정 중간 경계에서 저 gradient 필터를 적용한다면 [-2*255] [-1*255] [0] [1*0] [2*0]라는 값을 얻을 수있다. 저것을 다 더한다면 -765라는 큰 값을 얻을 수 있게 된다. (gradient에서 +와 -는 중요하지 않다. 나중에 검출할 때 부호에 상관없이 값의 크기만 얻기 위해서 한번 제곱을 해 준다.)
그리고 다시 검은색 지점을 지나칠때는 흰색과 동일하게 0에 가까운 값만을 얻을 것이다.
그럼 이제 전체적으로 gradient를 구한 값을 생각해보자. 밝기나 색이 바뀌는 부분(우리가 생각하는 Edge)에서는 +나 -로 큰 값이 저장 되어있고 나머지는 0에 가까운 수가 되어 있을 것이다. 이것은 x축필터로 한번 y축 필터로 한번씩 해서 x의 gradient와 y의 gradient를 구할 수 있다. 여기까지 이해가 안된다면 과정을 다시 생각해 보는 것도 좋은 것이다. 지금의 gradient의 개념이 앞으로 나올 개념들의 기초가 될 것이다.
위에서 구한 x축과 y축의 gradient 값을 각각 제곱해서 더 해준 값에 루트를 씌운다. 그렇게 해서 전체적인 gradient값을 구한 후 또 하나 필요한 건 각 픽셀의 기울기이다. 각 픽셀에 gradient가 존재 한다면 필요한 것이 기울기이다. 값이 존재한다면 선이 존재한다는 말이 되는 것이고 그렇다면 세로로 이어진 선인지 가로로 이어진 선인지 대각선인지를 판단할 수 있어야 한다. x축 gradient는 가로축방향만 가지는 값이고 y축 gradient값은 세로축 방향만을 가지는 값이다. 기울기를 구하는 것은 atan(y/x)이다. 이것으로 구한 값을 이용해 방향성을 알 수 있다.
-0.4142< atan(y/x) <= 0.4142 가로방향
0.4142< atan(y/x) < 2.4142 2시와 7시방향을 가로지르는 직선 방향의 대각
|atan(y/x)| >= 2.4142 는 세로방향
-2.4142 < atan(y/x) <= -0.4142 10시와 5시 방향의 대각
이것으로 각 픽셀의 방향성을 알 수 있다. 이제 각 픽셀의 방향성을 검토하면서 그 방향성 둘중 한군데에서 자기 자신보다 큰 값을 가지는 픽셀이 있다면 자기 자신을 0으로 만든다.
이렇게 전체적으로 반복해 나간다면 남아 있는것은 그 방향에서 제일 큰 값을 가지는 픽셀만 남아있을 수 있게 되는 것이다.
댓글 없음:
댓글 쓰기