ImageProcess

YUV 데이터 포맷의 이해

Lohen 2016. 2. 5. 00:10

YUV 데이터 포맷의 이해



YUV 컬러모델 란?

YUV는 밝기값과 색을 분리하여 표현하는 컬러모델 입니다. 여기서 Y는 밝기(luma) 값을 나타내며, UV는 색(chroma) 값을 나타냅니다.



위의 이미지와 같은 U-V 색평면에서 U,V 좌표에 의해 색(chroma)을 표현 할 수 있습니다. 여기에 Y 값이 더해 모든 색의 표현이 가능합니다.



PGR 카메라가 지원하는 YUV 포맷


PGR 컬러 카메라 대부분은 YUV 컬러 인코딩된 이미지를 전송할 수 있는 기능을 제공합니다. Y,U,V 각각의 값은 이미지 데이터에서 1byte(8 bit)로 구성되어 있습니다. PGR 카메라는 픽셀당 24, 16, 12 bit 포맷으로 YUV 데이터 전송이 가능합니다. 여기서 16, 12 bpp(bit per pixel) 포맷은 여러 픽셀간에 U와 V 컬러 값을 공유하여 사용합니다. U,V 컬러 값을 공유하여 데이터 양이 줄고 프레임 레이트를 증가 시킬 수 있습니다. “Chroma subsampling”으로 알려진 이 기술은 사람의 눈이 색보다 명암에 더 잘 반응하는 원리를 이용한 기술입니다. 
PGR 카메라는 YUV444(24 bpp), YUV422(16 bpp), YUV411(12 bpp) 데이터 포맷을 지원합니다.



YUV444 데이터 포맷


YUV444 데이터 포맷은 픽셀당 24 bit의 데이터를 전송합니다. 각 픽셀은 개별적인 Y,U,V 값을 가집니다.

이미지 버퍼 내용

 U0

Y0 

V0

U1

Y1 

V1 

 U2

 Y2

 V2

 ... ...


각 픽셀의 데이터 구조

 픽셀 번호

 픽셀 값

 0

 U0 Y0 V0

 1

 U1 Y1 V1

 2

 U2 Y2 V2

... ...

 ... ...


 

YUV422 데이터 포맷
YUV422은 두 픽셀간의 U,V 값을 공유하는 데이터 포맷입니다. 
데이터 구조는 U, Y0, V, Y1 와 같이 두개의 Y 값과 공유하는 U,V 값으로 되어 있습니다. 두 픽셀을 표현하는데 4바이트가 사용되므로, 결과적으로 16bit per pixel로 데이터 전송이 가능합니다.

 

이미지 버퍼 내용

 U0

Y0 

V0

Y1

U2 

Y2 

V2

Y3

...

 ...


각 픽셀의 데이터 구조

 픽셀 번호

 픽셀 값

 0

 U0 Y0 V0

 1

 U0 Y1 V0

 2

 U2 Y2 V2

3

 U2 Y3 V2

 ... ...

 ... ...


 

YUV411 데이터 포맷
YUV422은 네 픽셀간의 U,V 값을 공유하는 데이터 포맷입니다. 
데이터 구조는 U, Y0, V, Y1, Y2, Y3 와 같이 네개의 Y 값과 공유하는 U,V 값으로 되어 있습니다. 네 픽셀을 표현하는데 6바이트가 사용되므로, 결과적으로 12bit per pixel로 데이터 전송이 가능합니다.

이미지 버퍼 내용

 U0

Y0 

V0

Y1

Y2 

Y3 

 U4

 Y4

 V4

 ... ...


각 픽셀의 데이터 구조

 픽셀 번호

 픽셀 값

 0

 U0 Y0 V0

 1

 U0 Y1 V0

 2

 U0 Y2 V0

 3

 U0 Y3 V0

 4

 U4 Y4 V4

 ... ...

 ... ...



 

YUV를 RGB로 변환

PGR 카메라에서 획득된 YUV 데이터는 다음과 같은 수식을 통해 RGB로 변환 가능합니다.

R = Y + 1.4075(V-128)
G = Y - 0.3455(U-128) - 0.7169(V-128)
B = Y + 1.7790(U-128)


YUV422 -> RGB 변환 예제

 

void ConvertYUV422toRGB(unsigned char** pSrc, unsigned char** pDst,int width,int height)
{

                  int i,j;

                  unsigned char* dst=*pDst;

                  unsigned char* src=*pSrc;

                  int Y1,Y2,U,V;

                  int R,G,B;

 

                  for(i=0;i<width*height;i=i+2)

                  {

                                   Y1=src[i*2+1];

                                   Y2=src[i*2+3];

                                   U=src[i*2];

                                   V=src[i*2+2];

 

                                   dst[i*3+2]=(unsigned char)((float)Y1+(1.4075f*(float)(V-128)));

                                   dst[i*3+1]=(unsigned char)((float)Y1+(0.3455f*(float)(U-128)-(0.7169f*(float)(V-128))));

                                   dst[i*3]=(unsigned char)((float)Y1+(1.7790f*(float)(U-128)));

                                   dst[i*3+5]=(unsigned char)((float)Y2+(1.4075f*(float)(V-128)));

                                   dst[i*3+4]=(unsigned char)((float)Y2+(0.3455f*(float)(U-128)-(0.7169f*(float)(V-128))));

                                   dst[i*3+3]=(unsigned char)((float)Y2+(1.7790f*(float)(U-128)));

                  }

}

참고

http://en.wikipedia.org/wiki/YUV
http://en.wikipedia.org/wiki/Chroma_subsampling