[컴퓨터비전] (1) Color, Edge에 대하여
이 글을 보고 있는 당신이라면, 색상과 경계선을 모르지는 않을 것입니다.
화면 상에 쓰여 있는 글자를 보고 읽을 줄 안다는 것이며,
그 글자라는 것은 흰색과 검은색의 대비를 통한 경계선으로 우리에게 인식되기 때문입니다.
오늘은 우리 사람의 관점이 아닌 컴퓨터의 시각으로 보는 Color와 Edge를 알아보겠습니다.
색상(이하 Color) 그리고 경계(이하 Edge)는 컴퓨터비전에서 Basic Image Feature에 속해 있습니다.
이는 컴퓨터가 이미지를 인식하는 가장 낮은 단계 혹은 작은 단위라는 말입니다.
(둘 다 Low-level feature 이지만, Color가 있어야 Edge가 있기에 굳이 따진다면 Color 좀 더 low하다고 할 수 있겠습니다.)
1. Color
우리가 아는 이미지는 특정 값을 가지는 하나의 pixel들의 집합입니다.
그리고 이 pixel이 가지는 특정 값이 바로 Color입니다.
일반적인 Color model로 RGB를 많이 사용하지만,
색채를 정의하는 방법에 따라 CMYK, HSI, YIQ 등의 컬러 모델들도 다양한 용도를 위해 쓰이고 있습니다.
Grayscale Image
예시로 첨부한 위 사진의 8-bit Grayscale의 이미지에서 각 픽셀은 0~255 사이의 값을 가질 수 있으며,
0은 검은색, 255는 하얀색을 나타냅니다. 픽셀의 값이 커질 수록 밝은 색이 됩니다.
RGB Image
그러나 우리의 세상은 흑백이 아니기에 자주 접하는 이미지는 보통 RGB color의 조합인
24-bit True Color 이미지로 표현됩니다. R, G, B 각각 0~255 사이의 값을 가지며 그 셋의 조합으로 한 픽셀이
정의되고, 그 픽셀들이 모여 color image가 됩니다.
그리고 이러한 R,G,B의 조합을 3차원의 좌표공간에서 나타낼 수 있습니다.
그렇게 하면 이런 큐브 형태의 RGB color cube가 나오게 되는데,
이 때 원래 0~255 사이의 값을 가지는 픽셀의 값들을 0~1로 정규화하여 표현합니다.
우리가 보는 RGB color는 380~780nm 가시광선 영역을 나타내는데, 컴퓨터와 같은 기계는 가시광선 영역을 초월하여
전자기파, X선 등도 관찰할 수 있으므로 이를 활용하여 X-ray 등의 기술에도 응용할 수 있습니다.
Color Image에서 유의미한 정보를 얻기 위해 Color Histogram이란 것을 사용하는데, 이건 다음 포스팅에서
상세히 다루도록 하겠습니다.
아닙니다 지금 다루겠습니다.
Color Histogram
Image를 2차원 Matrix라고 하였을 때 해당 Matrix의 도수분포표를 그래프(벡터)로 나타낸 것입니다.
계산이 빠르고 편리하며 vector의 size가 정해져 있기 때문에 Image의 Color를 표현하기 좋지만,
전체 이미지에서 특정 색상의 빈도수만 체크하기 때문에 Image pixel들의 공간적인 특징은 배제합니다.
2. Edge
이러한 Color를 이용하여 Edge를 정의할 수 있는데, 간단하게 생각하면 색이 급작스럽게 변하는 지점이 Edge 입니다.
위의 그림에서 검은색 영역이 계속되다가 갑자기 하얀색 영역으로 바뀝니다. 그 사이에 명확한 경계선이 있죠?
이미지에서 두 개의 서로 다른 영역 사이에서 뚜렷한 강도 차이가 나타나는 지점, 여기가 바로 Edge 입니다.
우리 인간은 관찰과 동시에 "어 뚜렷하네? Edge네?" 라고 생각할 수 있습니다.
하지만 0과 1로 표현되는 세상에서 Edge를 논하려면 "뚜렷하다" 의 기준부터 정의부터 하고 가야합니다. (궤도 아닙니다)
예시로 위의 8-bit 2차원 Image Matrix에서 P(x,y)에 위치한 픽셀의 값을 f(x,y)라고 했을 때,
'인접한 상하 위치관계 2개의 픽셀의 차이가 50보다 크면 뚜렷하다' 라고 우리가 정의를 한다면
뚜렷한 부분, 즉 Edge는 다음의 표시한 빨간 선 부분이 될 겁니다.
위의 조건을 간단한 수식으로 표현하면 " | f(x,y+1) - f(x,y) | > 50 이면 Edge이다" 가 됩니다.
허나 우리가 보는 이미지는 2차원 이미지일 것이기에, 단순히 y축의 차이만 보면 안됩니다.
x축과 y축의 차이를 동시에 보아야 2차원 상의 Edge를 계산할 수 있으며 이 과정에서 gradient를 계산합니다.
그리고 그 gradient는 원본 Image와 특정 mask의 convolution을 통해 각 점마다 계산하는 과정을 거칩니다.
위의 수식처럼 "gradient > thresold 이면 Edge이다" 라는 명확한 논리를 세울 수 있습니다.
위의 Matrix들은 gradient를 구하기 위한 convolution 시에 널리 쓰이는 mask 들입니다.
딱 보니, 가장 기본적인 건 Prewitt mask이고, center에 가중치를 좀 더 둔 Sobel mask가 가장 널리 쓰입니다.
Roberts mask는 2x2의 작은 사이즈를 가져 연산이 빠르며 대각 방향의 difference를 잘 잡겠네요.
이제 원본 Image와 위의 마스크들을 사용하여 gradient들을 구합시다.
위의 과정을 거쳐 Gradient를 구하면 horizontal-difference를 나타내는 Gx와 vertical-difference를 나타내는 Gy를
각각 구할 수 있는데, 이 두 가지 성분을 구했다면 위의 수식을 통해 각 점에서의 gradient의 크기(magnitude)와
방향(direction)을 구할 수 있습니다.
최종적으로 convolution 연산까지 마친 후, gradient를 통해 구한 magnitude >= thresold 이면 우리는
Edge pixel로 인식합니다.
해당 thresold는 automatic하게 결정되며, 더욱 정성적인 엣지 검출을 위해 thresold 값을 2개를 사용하여
애매한 pixel을 case 별로 처리하는 법도 있습니다.
위의 과정 별 사진 보며 글 마치겠습니다.
블로그 첫 글이라 그런 지 어떻게 써야하는 지도 모르겠고,
그래서 최대한 이해하기 쉽게 풀어써보았는데 봐주셨다면 영광입니다.
열심히 해야겠습니다.