'색상모델'에 해당되는 글 1건

  1. 색상모델 (2) 2008.05.13

색상모델색상모델

Posted at 2008. 5. 13. 04:35 | Posted in Team Project

1. 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)



C는 Cyan(시안)、M은 Magenta(마젠타)、Y는 Yellow(노란색)、K는 Black(검은색)을 말한다. 컬러 팜플렛이나 잡지의 컬러 페이지는 통상 이 4색으로 인쇄된다.

시안을 흔히 녹청색이라 하는데 실제로는 하늘색에 가깝다. 마젠타는 밝은 자홍색. 그리고 일본 국기처럼 붉은 적색은 노랑과 마젠타를 겹인쇄(double printing)하여 만든다. 파랑(감색)은 시안과 마젠타를 더블프린팅한다. 3색을 겹치면 이론상으로는 검정이 되긴 하나 그렇게 하면 색감이 다소 떨어지기 때문에 검정 잉크를 추가한다.

그런데 컴퓨터와 관련하여 이 용어가 등장하는 것은 다음과 같은 두가지의 경우다.
먼저 잉크젯프린터나 컬러레이저프린트에서 컬러 인쇄를 할 경우 역시 이 4색을 사용한다.화질을 중시한 최근의 잉크젯프린트는 시안과 마젠타 잉크를 짙고 엷은 2색씩으로 하여 6색이나 7색의 잉크를 사용하는 기종이 많다. 그러나 인쇄 속도나 비용을 우선하는 기종이라면 CMYK 4색을 사용하는 기종이 많다. 컬러레이저프린트의 경우는 CMYK의 4색 토너(toner)를 사용한다.

화질을 중시한 최근의 잉크젯프린트는 시안과 마젠타 잉크를 짙고 엷은 2색씩으로 하여 6색이나 7색의 잉크를 사용하는 기종이 많다. 그러나 인쇄 속도나 비용을 우선하는 기종이라면 CMYK 4색을 사용하는 기종이 많다. 컬러레이저프린트의 경우는 CMYK의 4색 토너(toner)를 사용한다.

다른 하나는 DTP(desktop publishing) 작업을 할 경우이다. DTP란 컴퓨터를 사용하여 인쇄물을 만드는 것. 예를 들자면 컴퓨터 화면상으로 조정한 사진을 인쇄소로 넘길 때 CMYK 데이터로 변환시키곤 하는 게 그것이다.

컴퓨터 화면은 RGB 3색의 빛으로 이루어져 있다. R은 레드(적), G는 그린(녹), B는 블루(청)를 말한다. 스캐너로 스캔한 사진이나 디지털카메라로 찍은 사진도 이 3색으로 되어 있다. 이것을 어떤 경로든 CMYK의 조합으로 변환시키지 않으면 인쇄가 불가능하다.

그렇기 때문에 어도비포토샵 같은 프로용 그래픽소프트웨어에는 화상을 CMYK 데이터로 변환시키거나 CMYK컬러로 표시하는 기능이 갖추어져 있다.


3. HSI (Hue Saturation Intensity)

색상(Hue), 채도(Saturation), 명도(Intensity)라는 세 가지 특성들이 컬러를 설명하는 데 사용되기 때문에,
이와 대응되는 컬러 모델을 HSI라고 한다.
HSI 컬러 공간을 사용할 때, 어떤 컬러를 만들어 내기 위해서 몇 퍼센트의 파랑색이나 녹색이 필요한지 알 필요가 없다. 진한 빨강색을 분홍색으로 바꾸기 위해 단순히 채도를 조절한다. 어두운 것을 밝게 하려면 명도를 변경한다.
 
색상 : 0도 에서 360도의 범위를 가진 각도로 표현한다.
채도 : 0에서 1까지의 범위를 가지는 반지름에 해당한다.
명도 : z축에 해당하는데 0일 때는 검정색을, 1일때는 흰색을 나타낸다.

사용자 삽입 이미지


*채도가 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종류로 양자화 하여 해당 색상에 대한 히스토그램을 구한 후 유클리디언 거리 차를 이용한 벡터를 구한다.
구해진 벡터를 이용하여 영상의 오차 정도를 판단하게 된다.


Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기