색상모델색상모델
Posted at 2008/05/13 04:35 | Posted in Team Project1. RGB (Red Green Blue)
RGB 가산혼합은 빛의 삼원색을 이용하여 색을 표현하는 방식이다. RED, GREEN, BLUE 세종류의 광원(光源, 영어: light source)을 이용하여 색을 혼합하며 색을 섞을수록 밝아지기 때문에 '가산혼합'이라고 한다. 디지털 이미지에서 사용되는 RGB 가산혼합의 종류로는 sRGB, 어도비 RGB등이 있다.
- 알기 쉬운 실험
- 세개의 손전등에 각각 빨강, 녹색, 파랑의 셀로판지를 겹쳐놓고 불을 비추면 오른쪽의 그림 '가산혼합의 원리'와 비슷한 결과를 얻을 수 있다.
- RGB 큐브 모델과 표현 원리
- 오른쪽의 그림 'RGB의 큐브 모델'과 같이 하나의 색은 삼원색을 기준선으로 하는 삼차원 직교 좌표계의 한 점으로 나타낼 수 있다.
- 예를 들어 검정은 세 광원 모두 빛이 없는 상태이며 좌표(0,0,0)으로 표현할 수 있다.
| 체널별 값 | 혼합결과와 좌표 | |||
| RED | GREEN | BLUE | 혼합색 | 좌표 |
| 0 | 0 | 0 | 검정 | (0,0,0) |
- 각 광원의 최대값을 255라고 한다면 빨강은 좌표(255,0,0)과 같이 표현되며 RED 광원만이 최대값을 갖고 GREEN 광원과 BLUE광원은 빛이 없는 상태를 의미한다.
| 체널별 값 | 혼합결과와 좌표 | |||
| RED | GREEN | BLUE | 혼합색 | 좌표 |
| 255 | 0 | 0 | 빨강 | (255,0,0) |
- 좌표(80,0,0)과 같이 GREEN 광원과 BLUE 광원이 여전히 빛이 없는 상태에서 RED 광원이 약하게 비춰진다면 고동색이 될것이다.
| 체널별 값 | 혼합결과와 좌표 | |||
| RED | GREEN | BLUE | 혼합색 | 좌표 |
| 80 | 0 | 0 | 고동색 | (80,0,0) |
- 주황색은 좌표(255,127,0)으로 나타낼 수 있으며 RED 광원이 최대값을 갖는 상태에서 GREEN 광원이 중간 정도로 섞인 상태라고 할 수 있다.
| 체널별 값 | 혼합결과와 좌표 | |||
| RED | GREEN | BLUE | 혼합색 | 좌표 |
| 255 | 127 | 0 | 주황색 | (255,127,0) |
- 세 광원이 모두 같은 값을 갖으면 무채색이 된다.
| 체널별 값 | 혼합결과와 좌표 | |||
| RED | GREEN | BLUE | 혼합색 | 좌표 |
| 192 | 192 | 192 | 은색 | (192,192,192) |
- 감산혼합과의 관계
- RGB 가산혼합과 달리 CMYK 감산혼합은 물감이나 잉크같은 안료가 서로 섞일 때 일어나는 색의 혼합을 표현하는 방식으로 색을 섞을수록 어두어 지기 때문에 '감산혼합'이라 한다. 가산혼합과 감산혼합은 서로 반대되는 개념으로 보색 관계에 있다.
2. CMYK (Cyan Magenta Yellow blacK)
3. HSI (Hue Saturation Intensity)
색상(Hue), 채도(Saturation), 명도(Intensity)라는 세 가지 특성들이 컬러를 설명하는 데 사용되기 때문에,
이와 대응되는 컬러 모델을 HSI라고 한다.
HSI 컬러 공간을 사용할 때, 어떤 컬러를 만들어 내기 위해서 몇 퍼센트의 파랑색이나 녹색이 필요한지 알 필요가 없다. 진한 빨강색을 분홍색으로 바꾸기 위해 단순히 채도를 조절한다. 어두운 것을 밝게 하려면 명도를 변경한다.
*채도가 1일때 , 그 컬러는 원뿔기반의 모형의 꼭대기 가장자리에 위치한다. 채도가 강할수록 그 컬러는 명도에 따라서 흰색/회색/검정색이 된다.
*색상의 조절은 각도에 따라 0도에서는 빨강색, 120도에서는 녹색 , 240도에서는 파랑색, 그리고 360도에서는 다시 빨강색으로 변한다.
*명도가 0이면 컬러는 검정색이어서 색상은 정의 되지 않는다.
*채도가 0이면 컬러는 명암도 등급이 된다. 색상은 이러한 경우에도 정의되지 않는다.
*명도를 조절함으로써, 컬러는 어둡게 또는 밝게 될 수 있다.
*채도를 1로 유지하고 명암도를 저절하면, 그 컬러의 농도를 변화 시킬 수 있다.
<RGB 에서 HSI로의 변환>
|
|
RGB |
CMY |
HSI |
|
Red(빨강) |
1,0,0 |
0,1,1 |
0°,1,0.33 |
|
Green(초록) |
0,1,0 |
1,0,1 |
120°,1,0.33 |
|
Blue(파랑) |
0,0,1 |
1,1,0 |
240°,1,0.33 |
|
Cyan(청록) |
0,1,1 |
1,0,0 |
180°,1,0.66 |
|
Magenta |
1,0,1 |
0,1,0 |
300°,1,0.66 |
|
Yellow(노랑) |
1,1,0 |
0,0,1 |
60°,1,0.66 |
void CHsiView::rgbToHsi(unsigned char R[][320],unsigned char G[][320],unsigned char B[][320],float H[][320],float S[][320],float I[][320], unsigned char outH[][320],unsigned char outS[][320], unsigned char outI[][320])
{
float min;
float angle;
float r,g,b;
r=g=b=0;
for(int y=0; y<240; y++)
{
for(int x=0; x<320; x++)
{
r=R[y][x]/255.0f; //RGB색상의 정규화
g=G[y][x]/255.0f;
b=B[y][x]/255.0f;
if((r<=g) && (r<=b)) //S의 연산을 위한 최소값을 구함
min=r;
else if((g<=r) && (g<=b))
min=g;
else
min=b;
I[y][x]=(r+g+b)/3.0f;
if((r==g) && (g==b)) //흑백일 경우 H와 S의 값 설정
{
S[y][x]=0.0f;
H[y][x]=0.0f;
continue;
}
else
{
S[y][x]=1.0f-(3.0f/(r+g+b))*min; //S의 계산
angle=(0.5f*((r-g)+(r-b))) /
sqrt((r-g)*(r-g)+(r-b)*(g-b));
H[y][x]=acos(angle); //H의 계산
H[y][x]*=57.29577951f; //Radian 으로 변환
}
if(b>g)
H[y][x]=360.0f-H[y][x];
}
}
int ih=0;
for(int y=0; y<240; y++)
{
for(int x=0; x<320; x++)
{
ih=(int)(H[y][x]*255.0f/360.0f);
//0~255사이에 올수 있도록 정규화
outH[y][x]=(unsigned char)ih;
outS[y][x]=(unsigned char)(S[y][x]*255.0f);
outI[y][x]=(unsigned char)(I[y][x]*255.0f);
}
}
}
작성한 프로그램은 두 장의 영상을 웹캠으로 캡쳐하여 각각 HSI컬러 모델로 변환한다.
H는 6가지의 색상, S는 2종류로 양자화 하여 해당 색상에 대한 히스토그램을 구한 후 유클리디언 거리 차를 이용한 벡터를 구한다.
구해진 벡터를 이용하여 영상의 오차 정도를 판단하게 된다.
