컬러 영상 처리 DarkKaiser, 2007년 7월 17일2023년 9월 6일 1. 색상모델적색, 녹색, 청색 세가지 기본컬러를 어떻게 혼합하면 우리가 원하는 색을 만들 수 있을까? 컬러에 대한 표현을 표준화하기 위해 색상모델이라는 것이 사용된다. 색발모델의 좌표는 3원색의 각가이 하나의 축을 이루고 있으며 구체적인 하나의 색은 이 좌표계 내에서 하나의 점을 나타낸다. 이러한 좌표계는 하나만 존재하는 것이 아니라 용도에 따라 많은 종류의 좌표계가 존재한다. 예를들면, RGB 모델은 컬러 CRT 모니터나 컴퓨터 그래픽스분야에서 사용하는 모델이고, YIQ는 TV 방송을 위한 색상 모델, CMY는 컬러 영상의 출력을 위해 프린터에서 사용하는 색상모델이다. 사람이 색을 인지하는 모델과 가까운 직관적인 모델로 색상(hue), 채도(saturation), 명도(brightness)를 다루는 시스템은 HSI 색상모델을 사용한다. RGB 모델RGB 모델은 개인용 PC 앞에 놓여있는 컬러 CRT 모니터와 컴퓨터의 그래픽스에서 사용하는 직각 좌표계이다. RGB는 ‘빛’의 삼원색이며 각각을 적당히 더하여 원하는 컬러를 만들어 낸다. RGB를 더하기 3원색이라고 하는것은 R, G, B를 적당히 첨가하여 원하는 색을 만들어 내기 때문이다.RGB 컬러 모델을 보면, 각각의 좌표축은 R, G, B축을 나타낸다. 좌표점 (0, 0, 0)은 검은색이며 (1, 1, 1)은 흰색을 나타낸다. (0, 0, 0)과 (1, 1, 1)을 연결하는 대각선상에 존재하는 모든 점들은 R, G, B 각각의 비율이 동일한 회색 등급을 나타낸다. 이것은 삼원색이 같은 비율로 혼합되었을 경우 회색이 된다는 것을 나타낸다. 실제로 영상 처리를 수행할 때 흑백영상 처리가 많으므로 RGB 컬러 값을 흑백명암도의 밝기 값으로 바꾸는 것이 필요하다. 간단하게 다음의 수식을 사용한다. 명암도 = 0.299R + 0.587G + 0.114B 명암도 = 0.333R + 0.333G + 0.333B TV나 모니터에서 사용하는 경우 첫 번째 수식을, 나머지 대부분의 경우는 두 번째 수식을 사용하면 된다. YIQ 모델이 색상모델은 TV 방송국에서 사용하는 컬러모델이다. 만일 RGB 컬러로 TV 영상전파를 쏘아보낸다면 가정에서 이를 받아서 흑백 TV로 시청한다고 할 경우 다시 밝기를 나타내는 명암도 값을 계산해야 할 것이다. 이것은 귀찮은 일이고 하드웨어나 소프트웨어적인 추가 계산을 필요로 할 것이다. 방송국에서는 수신기가 흑백 TV인지 컬러 TV인지 관계없이 YIQ 신호로 쏘아보내고 가정에서 수신기가 흑백 TV라면 Y신호만 취하면 될 것이고 컬러 TV라면 YIQ를 모두 취하면 될 것이다. 방송국은 호환성을 높이기 위해 YIQ 모형을 사용한다.YIQ에서 Y는 명암도(luminance), I, Q는 색에 관련된 정보인 색상과 채도 정보를 나타낸다. 흑백 TV인 경우 영상신호에서 Y만을 취해서 흑백화면을 만들고, 컬러 TV인 경우 세 신호 모두를 이용하여 R, G, B 컬러 값을 만들어 낼 수 있다.YIQ 모델의 장점 밝기를 나타내는 명암도 값을 바로 취해서 사용할 수 있다. 히스토그램 평활화와 같은 영상처리라든지, 컬러 영상의 유화처리 등에 색상모델의 변환없이 직접 사용 가능하다. 사람의 눈은 컬러값보다 밝기값에 더 민감하다. 따라서, 영상신호 전송시, 민감한 Y 값은 덜 압축하여 보내고, 둔감한 I, Q 값은 많이 압축하여 보낼수 있어 신호 전송의 효율을 높이는 것이 가능하다. Lookup Table를 사용한 고속 변환RGB 모형과 YIQ 모형의 변환 행렬식은 실수의 곱연산을 포함하고 있으므로 연산시간이 많이 걸린다. 따라서 포함된 관련식을 미리 계산하여 Lookup 테이블에 저장하여 놓고, 실제 계산시에는 이 테이블을 참조하여 사용한다면 고속 변환이 가능하다. 아래 리스트는 LUT를 사용한 RGB 모형에서 YIQ 모형으로의 색변환을 보여준다. CMY 모델CMY는 ‘색’의 3원색이며 청록(Cyan), 자홍(Magenta), 노랑(Yellow)으로 구성된다. 이것은 RGB 모형과 반대의 공간이며, C,M,Y는 각각 R,G,B의 보색이다. RGB는 더하기 3원색이었는데 반해 CMY는 빼기 3원색이라고 한다. 이는 백색광에서 특정색을 뺌에 의해 원하는 색깔을 만들기 때문이다. 예를들면, 청록(Cyan)으로 칠해진 표면에 백색광을 비추면 흡수된다. 즉, Magenta는 백색광에서 녹색광을 뺀 것이다. 이 색상모델은 컬러 복사기나 프린트와 같은 종이 출력 장치에 사용되며 종이에 색깔을 나타내는 안료를 칠하기 위해 필요하다. C = 1 - R M = 1 - G Y = 1 - G 프린트없체에서는 CMY에 검정색을 더하여 CMYK 모델을 만들었다. K는 검정색을 나타내며 검정색을 만들기 위해 C, M, Y를 조합하여 사용하는 것보다는 아예 검정색 잉크를 사용하는 것이 비용이나 검정색의 질적 수준에서 더 효과적이기 때문에 실용적으로 사용되는 모델이다. C = 1 - R M = 1 - G Y = 1 - B K = min(C, M, Y) 아래 리스트는 RGB 모델에서의 화소값을 CMY 모델의 화소값으로 변환하는 함수의 구현을 보여준다. ‘F’는 단정도 실수를 나타낸다. 변수값들은 0과 1 사이값으로 만들어 사용한다. void RGB_To_CMY(float r, float g, float b, float *c, float *m, float *y) { *c = 1.0f - r; *m = 1.0f - g; *y = 1.0f - b; } HSI 모델RGB, YIQ, CMY, CMYK 등의 색상모델은 시스템이나 하드웨어에서의 사용을 위해 만들어진 색상모형이다. 이에반해 HSI 모델은 인간의 색인지에 기반을 둔 사용자 지향성의 색상모형이다. H는 색상(Hue), S는 체도(Saturation), I는 명도(Intensity)를 각각 나타내며 이 모형을 사용하면, 어떤 구체적인 컬러를 만들기 위해 색을 조합할 필요가 없다. 바로 좌표축 H 자체가 색상을 나타낸다. 진한 빨간색을 엷은 빨강색으로 만들기 위해서는 또 다른 좌표축 중의 하나인 S를 조절하면 된다. 밝기를 바꾸기 위해서는 I 축을 조절한다. 사용자가 원하는 색을 만들거나 재생하기 위한 색 표현이 쉽지 않은가? 색상(H)은 빨강, 파랑, 노랑 등의 색을 구별하기 위해 사용되는 축으로 0~360도의 범위를 가진 각도 값으로 나타낸다. 채노(S)는 순색에 첨가된 백색광의 비율을 나타내며 0~1의 범위를 가진 반지름에 해당한다. 파란색의 벽면에 백색광을 비추면 파란색이 희미해 지면서 백색에 가까워진다. S 값이 0으로 떨어지게 되는 것이다. 빨강은 높은 채도의 색이고 분홍은 낮은 채도의 색이다. 빨강이 분홍보다 순색에 더 가깝다. 중심 축에서 멀어지면 채도는 높아진다. 명도는 빛의 세기를 나타낸다. I 축에 해당하며 0~1 사이의 범위를 가진다. 0은 검정, 1은 흰색을 나타낸다.위의 그림은 HSI 좌표의 모형을 RGB 축과 비교하여 보여주고 있다. HSI 모형은 실린더 모양으로 생긴 좌표로 RGB 모형의 대각선인 회색 라인을 중심축으로 한다. 위의 그림에서는 I로 표시되어 있다. 따라서, 허용되는 채도영역의 범위는 밝기가 밝거나 어두운 영역에서는 정육각형에 내접하는 타원의 크기가 작아지므로 이에 대응하여 작게 된다. 또한, 중심축인 회색라인(I축)에서 외각으로 멀어질수록 순색에 가까워지면서 채도가 증가하게 되고 중심축에서 가까우면 회색에 가까우므로 채도가 떨어지게 된다.위의 그림은 HSI 영상분리의 예를 보여주고 있다. H 성분은 수직방향으로만 값이 변한다. 원본영상의 수평방향으로는 밝기나 채도가 바뀌지만 일정한 H 값을 나타낸다. 이러한 특성은 컬러영상의 영역분리를 시도할 때 h를 사용하면 조명의 영향을 받지 않고 동일색 영역을 분리할 수 있음을 시사해 주고 있다. S 값은 양 옆은 작고 가운데 부분은 큰데 이것은 원본의 가운데 영역이 순색에 가깝기 때문이다. I값은 이에 대응하여 오른쪽이 커지게 된다. 아래 리스트는 RGB 모형에서 HSI 모델로 컬러좌표를 변경하는 함수를 구현한 코드를 보여준다. 함수의 인자인 r, g, b의 값 범위는 [0, 1] 사이의 값으로 넘어간다. 입력 영상의 데이터 R, G, B 값에다가 255를 나누어서 만들어 주면 된다. 함수 호출 후 결과 값의 범위는 H가 0~360도 범위이고 S, V 값은 각각 [0, 1] 범위를 갖게 된다. void RGB_To_HSI(float r, float g, float b, float *h, float *s, float *i) { float minc; float angle; minc = MIN(r, g); minc = MIN(min,c b); /* 밝기값의 계산 */ *i = (r + g + b) / 3.0f; /* 색상과 채도 값의 계산 */ if ((r == g) && (g == b)) /* gray-scale */ { *s = 0.0f; /* 채도 */ *h = 0.0f; /* 색상 */ return; } else { *s = 1.0f - (3.0f / (r + g + b)) * minc; angle = (r - 0.5f * g - 0.5f * b) / (float)sqrt((r - g) * (r - g) + (r - b) * (g - b)); *h = (float)acos(angle); *h *= 57.29577951f; /* 각도값으로 전환 */ } if (b > g *h = 360.0f - *h; } 디지털 이미지 프로세싱