여기서 어려울때 조언받고 많이 배워가니 너무 뭐라하지 않으셨으면 좋겠습니다. ㅠㅠ
RGB이미지를 Y, Cr, Cb로 변환하는 건데요 핵심코드만 긁어왔습니다.
void CConvertColorModel::RGB_TO_YCbCr(IplImage* img_in ,IplImage* img_Y ,IplImage* img_Cb ,IplImage* img_Cr)
{
/*
img_in = cvCreateImage(cvSize(img_in->width,img_in->height),8,3);
img_Y = cvCreateImage(cvSize(img_in->width,img_in->height),8,1);
img_Cb = cvCreateImage(cvSize(img_in->width/2,img_in->height/2),8,1);
img_Cr = cvCreateImage(cvSize(img_in->width/2,img_in->height/2),8,1);
*/ 이러한 이미지 타입을 받아옵니다.
for(int i=0 ; i<img_in->height ; i=i+1)
{
for(int j=0 ; j<img_in->widthStep ;j=j+3)
{
unsigned char R,G,B,Y,Cb,Cr;
B = limit((unsigned char)img_in->imageData[ i*img_in->widthStep + j ]);
G = limit((unsigned char)img_in->imageData[ i*img_in->widthStep + j+1 ]);
R = limit((unsigned char)img_in->imageData[ i*img_in->widthStep + j+2 ]);
//B,G,R 값을 받아왔습니다.(컬러영상)
/*RGB to YCbCr 변환 아래 변환식 사용
┌Y ┐ ┌ 0.299 0.587 0.114 ┐ ┌ R ┐ ┌ 0 ┐
│Cb│ = │ -0.169 -0.331 0.500 │ │ G │ + │ 128 │
└Cr┘ └ 0.500 -0.419 -0.081 ┘ └ B ┘ └ 128 ┘
*/
Y= 0.299*R+0.587*G+0.114*B+0;
Cb= (-0.169)*R+(-0.331)*G+(0.5)*B+128;
Cr= (0.5)*R+(-0.419)*G+(-0.081)*B+128;
/*Y Cb Cr Subsampling 4:2:0 (이미지 사이즈를 고려하여 subsampling이 가능하도록 변경)*/
img_Y->imageData[i*img_Y->widthStep+(j+3)/3+2]=Y; //4:2:0으로 하여 나름 생각하여 해봤는데 맞는지는 모르겠더군요.. ㅠㅠ 확실히Y영상은 뜨긴 뜨더군요. 이 3문장을 해결해야합니다 ㅠㅠ
img_Cb->imageData[] = Cb ; //Cb, Cr영상은 사이즈가 1/4크기로 줄여야 하더군요.. ㅠㅠ
img_Cr->imageData[] = Cr ;
}
}
}
나름 많이 생각해봤는데 너무 생각이 안나서 오유에 여쭙습니다... ㅠㅠ 조그만한 힌트라도 주시면 감사하겠습니다.