영상인식과 색상모델(Gray,RGB,HSV,YCbCr)

영상처리 2013. 5. 17. 16:27

어떤 색상 모델을 선택하는 것이 좋을까?


어떤 색상 모델을 사용해야 영상인식 알고리즘의 성능을 극대화할 수 있을까?


영상인식 알고리즘을 개발하는 사람이라면 한 번쯤은 고민해 봤을 문제입니다.


이 글에서는 색상모델을 선택하는데 도움이 될 수 있도록 색상모델에 대한 전반적인 내용을 영상처리 관점에서 정리해 보겠습니다.



1. 기본적인 색상 모델 알아보기


색상모델하면 Gray 모델, RGB 모델, HSV 모델, YCbCr 모델 등이 떠오를 것이다.




Gray 모델은 색(color) 정보를 사용하지 않고 밝기 정보만으로 영상을 표현하는 것이다. 검정색 0부터 흰색 255까지 총 256단계의 밝기값(intensity)으로 영상 픽셀값을 표현한다.


RGB 모델은 가장 기보적인 색상모델로서 색(color)을 Red, Green, Blue의 3가지 성분의 조합으로 생각하는 것이다. RGB 모델에서 검은색은 R=G=B=0, 흰색은 R=G=B=255, 빨강색은 R=255, G=B=0, 노란색은 R=G=255, B=0로 표현된다. R=G=B인 경우는 무채색인 Gray 색상이 된다. R, G, B 각각은 0 ~ 255 사이의 값을 가질 수 있기 때문에 RGB 색상 모델을 사용하면 총 256*256*256 = 16,777,216가지의 색을 표현할 수 있다.


HSV 모델은 Hue(색조), Saturation(채도), Value(명도)의 3가지 성분으로 색을 표현한다. Hue는 색조(예: 붉은색 계열인지 푸른색 계열인지, ...)를, Saturation은 그 색이 얼마나 선명한(순수한) 색인지를, Value는 밝기(intensity)를 나타낸다. HSV 모델은 우리가 색을 가장 직관적으로 표현할 수 있는 모델이며 또한 머리속에서 상상하는 색을 가장 쉽게 만들어낼 수 있는 모델이다. 영상처리/영상인식에서 HSV 모델을 사용할 때, H, S, V 각각은 0 ~ 255 사이의 값으로 표현된다. H 값은 색의 종류를 나타내기 때문에 크기는 의미가 없으며 단순한 인덱스(index)를 나타낸다. S 값은 0이면 무채색(gray 색), 255면 가장 선명한(순수한) 색임을 나타낸다. V 값은 작을수록 어둡고 클수록 밝은 색임을 나타낸다. HSV 색상 모델은 그림과 같이 원뿔(conic) 형태, 원기둥(cylindric) 형태가 있다. 둘의 차이는 색의 차이(difference)를 정량적으로 수치화하는 파트에서 설명하겠다.


YCbCr 모델은 RGB 색에서 밝기성분(Y)과 색차정보(Cb, Cr)를 분리하여 표현하는 색상모델이다. 위 5번째 그림은 위키페디아에 있는 그림으로  Y=128일 때의 CbCr 색상평면이다. 디지털 영상에서 Y, Cb, Cr은 각각 0 ~ 255 사이의 값을 가지며 Y가 커지면 위 그림이 전체적으로 밝아지고 Y가 작아지면 전체적으로 어두워진다. YCbCr 모델은 mpeg에서 사용되는 색상모델로서 인간의 눈이 밝기차에는 민감하지만 색차에는 상대적으로 둔감하다는 점을 이용해서 Y에는 많은 비트수(해상도)를 할당하고 Cb, Cr에는 낮은 비트수를 할당하는 방식으로 비디오를 압축한다. 따라서 비디오 데이터를 처리할 경우에 YCbCr 모델을 사용하면 별도의 색상변환을 하지 않아도 되는 장점을 갖는다. YCbCr 모델은 YUV 모델로도 불린다.



2. 두 색이 얼마나 다른(or 비슷한) 색인가?


영상인식에서 색상 정보를 이용하는 이유는 자신이 알고 있는 색과 비슷한 색을 찾기 위함이기 때문에 임의의 두 색 사이의 차이를 수치적으로 표현할 수 있어야 한다. 그러면 각 색상모델별로 두 색의 차이를 어떻게 정량적으로 표현할 수 있는지 살펴보자.


Gray 모델의 경우 두 색의 gray 값을 각각 g1, g2라 하면 색상차는 d = |g1 - g2|이다.


RGB 모델은 두 색 (r1,g1,b1), (r2,g2, b2) 사이의 차이를 유클리디언(Euclidean) 거리를 이용해서 d = sqrt{(r1-r2)^2 + (g1-g2)^2 + (b1-b2)^2}와 같이 계산할 수 있다.


HSV 모델을 사용할 경우에는 여러 가지 방식으로 색상 차이를 계산할 수 있다. 두 색을 (h1,s1,v1), (h2,s2,v2)라 하자. Hue 채널만을 사용할 경우에는 d = |h1 - h2|, 모든 채널을 사용하되 Euclidean 거리를 이용하면 d = sqrt{(h1-h2)^2 + (s1-s2)^2 + (v1-v2)^2}가 된다. 만일 위 3번째 그림과 같은 HSV conic 모델을 사용한다면, 먼저 다음 수식을 이용하여 (h, s, v)에 대응하는 공간좌표를 구한 후에 변환된 공간좌표들 사이의 Euclidean 거리를 이용한다 (원뿔 꼭지점을 원점, 세로축을 z축이라 가정).


HSV cylindric 모델을 사용할 경우에도 마찬가지로 (h,s,v)에 대응되는 공간좌표를 다음과 같이 구한 후 Euclidean 거리를 이용한다.

참고로, HSV conic 모델을 사용한다는 의미는 V가 작은, 즉 검은색에 가까운 경우에는 H, S 값에 관계없이 모두 유사한 색으로 간주하겠다는 의미가 된다. 하지만 HSV cylindric 모델을 사용하면 V값에 관계없이 H, S의 차이가 크면 색차값도 커지게 된다. 어떤 방식을 선택할지는 응용에 따라 다르겠지만 HSV conic 모델이 인간이 느끼는 색의 차이와 가장 유사하지 않나 싶다.


마지막으로 YCbCr 모델을 사용할 경우에는 (Y, Cb, Cr) 사이의 Euclidean 거리를 이용하거나, 혹은 Y 성분은 무시하고 (Cb, Cr) 사이의 Euclidean 거리만을 이용할 수도 있다.


요약하면 색상 모델에 따라 다양한 방식의 색상차 계산 방식이 존재할 수 있으며 응용에 따라 적합한 모델 및 색상 차 계산 방식을 선택해야 한다는 것이다. 참고로, 여기 적은 방식들은 가장 기본적인 방법들이며 필요하다면 얼마든지 변형이 가능할 것이다. 예를 들어, 가중치를 조절하는 방식도 생각할 수 있을 것이다. 어떻게 색상차를 계산하는 것이 가장 효율적인지, 즉 동일 물체에 대한 색상변화는 최소화하면서 다른 물체(배경)와의 색상차는 최대화할 수 있는 방법이 무엇인지도 훌륭한 연구주제가 될 것으로 생각한다.



3. 순수한 색차만을 이용한 방법


컴퓨터 비전 응용에 따라서는, 밝기값은 무시하고 순수한 색상 정보만을 이용하여 영상인식 작업을 수행하는 경우가 많다.


영상인식에 있어서 가장 큰 문제점 중의 하나는 동일한 사물이라 할지라도, 영상 촬영 환경 및 조건에 따라서 이것이 실제 이미지로 나타날 때에는 매우 다양한 형상(색상)이 나올 수 있다는 점이다. 예를 들어, 맑은 날, 흐린날, 비오는 날, 그늘에 가렸을 때, 그늘이 없을 때, 조명, 역광, 한낮, 해질무렵에 따라 영상이 모두 달라지고, 동일한 카메라라 할지라도 화이트 밸런스로 인해 색이 변할 수도 있다. 이렇게 다양한 변화요인들 속에서 영상에서의 동일한 색상을 인지한다는 것은 지극히 어려운 어쩌면 불가능한 일일지도 모른다.


이렇게 복잡한 색상 변화요인에 대처하는 방법은 크게 2가지로 나뉠 수 있다. 하나는, 색은 믿을 수 없으니 아예 색을 사용하지 않고 밝기정보(gray값)만을 사용하는 방법이다. 그런데 이와는 완전이 반대로  밝기 정보는 무시하고 순수한 색상 정보만을 이용하는 방법이 있다. 그 근거는 그늘에 가려졌을 때나 밖에 나왔을 때, 밝은 곳이나 어두운 곳, 맑은 날이나 흐린 날 등 이러한 환경 변화에 따라 변하는 것은 영상의 밝기값이지 색 자체는 변함이 없다는 것이다. 따라서 밝기값을 제거한 순수한 색상 정보만을 이용하면 이러한 환경변화에 관계없이 동일한 물체의 색을 효과적으로 인지할 수 있다는 것이다.


A. 피부색 검출


예를 들어, 영상에서 사람의 피부색을 검출하는 프로그램을 개발한다고 하자. 사람에 따라서는 피부색이 어두운 사람도 있고 밝은 사람도 있으며 인종에 따라서도 피부색에 많은 편차가 존재한다. 한지만 모든 인간은 공통적으로 붉은 색의 피가 흐르기 때문에 피부 밝기에 관계없이 붉은색 계열의 색을 포함하게 된다. 따라서, 피부색 검출을 위해서는 밝기 정보를 제거하고 순수 색상정보만을 이용하는 것이 훨씬 효과적임을 알 수 있다.




RGB 모델을 제외한 대부분의 색상 모델은 이미 밝기 성분(HSV의 V, YCbCr의 Y)과 색상 성분이 분리되어 있기 때문에 손쉽게 색 정보만을 활용할 수 있다. 또한 RGB 모델의 경우도 normalized rg를 이용하면 밝기 정보를 제거할 수 있다(r = R/(R+G+B), g = G/(R+G+B)).


그런데, 이러한 순수 색 정보만을 활용할 경우에 주의해야 할 사항이 있다. 순수 색 정보는 밝기값이 어두운 경우에는 매우 불안정해질 수 있다. 예를 들어, R=0, G=1, B=0인 경우와 R=1, G=0, B=0인 경우를 생각해 보자. 두 색 모두 우리 눈으로 보기에는 검은색이지만 색 정보로만 보면 완전히 다른 색이 된다. 예를 들어, normalized rg 모델에서는 첫번째 색은 r=0, g=1, 두번째 색은 r=1,g=0으로 극과 극의 색이 된다. 또한 HSV 모델에서도 H는 255/3만큼 차이가 나고 두 색 모두 S=255, V=0가 된다. 즉, 검은색 근처에서는 거의 노이즈(noise)로 생각해도 될 작은 차이가 엄청난 색 차이로 나타나기 때문에 단순한 색 차이만 가지고 차이를 계산할 경우 응용에 따라서는 심각한 문제를 발생시킬 수 있다. 따라서, 밝기만 사용할 것인지, 밝기와 색을 모두 사용할 것인지, 색만 사용할 것인지, 색만 사용하되 밝기 정보를 부분적으로 활용할 것인지 등은 응용과 상황에 따라서 잘 선택되어야 할 것이다. 중요한 점은 이러한 특성을 사전에 잘 파악하고 설계에 고려했는지 여부일 것이다.


B. 차선 인식


또 다른 예로 차선 인식 문제를 살펴보자. 차선은 크게 흰샌 차선과 노란색 차선이 존재한다. 흰색 차선의 경우에는 밝기 정보를 이용하는 것이 효과적이겠지만 흰색이 무채색이라는 것도 중요한 정보가 될 것이다. 가령, HSV 모델을 사용한다고 했을 때, 흰색 차선은 V>t1 이면서 S<t2인 조건을 만족시키도록 찾을 수 있을 것이다. 노란 차선의 경우에는 밝기정보를 제거하고 순수 색 정보를 이용하는 것이 좋을 것이다. 하지만 밝기가 어두우면 색 정보가 불안해지기 때문에 밝기가 일정한 값 이상이면서 순수 색 값이 노란색과 유사한 색을 찾으면 될 것이다 (HSV 모델의 경우, V>t1 이고 S>t2 이면서 H는 노란색의 H와 유사한 색).



※ 물론 여기에 적은 방법이 차선의 색을 찾는 가장 좋은 방법은 아닐 수 있습니다. 그냥 기본적인 참고용 정도로 생각하시기 바랍니다.



4. 색상 모델 사이의 변환 (참고용)


참고 목적으로 몇몇 색상 모델 사이의 변환 관계를 정리해 보았습니다.


RGB<->Gray

gray = (299*R + 587*G + 114*B)/1000    (R,G,B 별로 밝기가 다름을 반영한 것임)

R = G = B = gray


YCbCr<->RGB

Y = (299*R + 587*G + 114*B)/1000

Cb = 0.5643*(B - Y) + 128

Cr = 0.7132*(R - Y) + 128

R = (1000*Y + 1402*(Cr-128))/1000

G = (1000*Y - 714*(Cr-128) - 334(Cb-128))/1000

B = (1000*Y + 1772*(Cb-128))/1000


HSV<->RGB

RGB2HSV.cpp


☞ 이상으로 색상 모델에 대한 글을 마칩니다. 어떤 색상 모델을 선택할지는 제게도 상당히 어려운 문제입니다. 어떻게 보면 큰 차이가 없는 것 같기도 하고.. 영상 인식 목적에 가장 좋은 색 표현 방법은 무엇일까요?


by 다크 프로그래머

'영상처리' 카테고리의 다른 글

OpenCV Haar/cascade training 튜토리얼  (210) 2013.05.31
[영상추적#2] TLD - 추적하면서 학습한다  (14) 2013.05.16
[영상추적#1] Mean Shift 추적  (69) 2013.05.13