반응형
template<typename T>
inline T Limit(const T& value)
{
return ( (value > 255) ? 255 : ((value < 0) ? 0 : value) );
}
void ColorSpiltAndMerge::ConvertIplImageToRGBData(IplImage *colorSrcImage, unsigned char *colorRawData)
{
int imageWidth = colorSrcImage->width;
int imageHeight = colorSrcImage->height;
int channelNum = colorSrcImage->nChannels;
register int x, y;
for(y=0; y<imageHeight; y++)
{
for(x=0; x<imageWidth*channelNum; x += channelNum)
{
colorRawData[y*imageWidth*channelNum+x+2] = (unsigned char)colorSrcImage->imageData[y*colorSrcImage->widthStep+x+2]; ///< red
colorRawData[y*imageWidth*channelNum+x+1] = (unsigned char)colorSrcImage->imageData[y*colorSrcImage->widthStep+x+1]; /// green
colorRawData[y*imageWidth*channelNum+x] = (unsigned char)colorSrcImage->imageData[y*colorSrcImage->widthStep+x]; /// blue
}
}
}
void ColorSpiltAndMerge::ConvertRGBDataToLUVData(IplImage *colorSrcImage, unsigned char *colorRawData, unsigned char *LImage, unsigned char *UImage, unsigned char *VImage)
{
ConvertIplImageToRGBData(colorSrcImage, colorRawData);
int imageWidth = colorSrcImage->width;
int imageHeight = colorSrcImage->height;
register int i, j;
double x = 0;
double y = 0;
double z = 0;
double x0 = 0.98072;
double y0 = 1.00000;
double z0 = 1.18225;
double u0 = 0;
double v0 = 0;
double l = 0;
double u = 0;
double v = 0;
for(i=0; i<imageHeight; i++)
{
for (j=0; j<imageWidth; j++)
{
///< 1. RGB -> XYZ 컬러 공간으로 변환
double r = colorRawData[i*imageWidth*3+2+j*3];
double g = colorRawData[i*imageWidth*3+1+j*3];
double b = colorRawData[i*imageWidth*3+j*3];
double X = 0.607*r + 0.174*g + 0.201*b;
double Y = 0.299*r + 0.587*g + 0.144*b;
double Z = 0.000*r + 0.066*g + 1.117*b;
///< 2. XYZ -> LUV 컬러 공간으로 변환
if ((Y / y0) > 0.008856)
{
y = pow ((Y / y0), (1.0 / 3.0));
}
else
{
y = (7.787 * (Y / y0)) + (16.0 / 116.0);
}
l = (116.0 * y) - 16.0;
if ((X + (15.0 * Y) + (3.0 * Z)) == 0.0)
{
u = 0.0;
v = 0.0;
}
else
{
u0 = (4.0 * x0) / (x0 + (15.0 * y0) + (3.0 * z0));
v0 = (9.0 * y0) / (x0 + (15.0 * y0) + (3.0 * z0));
u = (4.0 * X) / (X + (15.0 * Y) + (3.0 * Z));
v = (9.0 * Y) / (X + (15.0 * Y) + (3.0 * Z));
u = 13.0 * l * (u - u0);
v = 13.0 * l * (v - v0);
}
LImage[i*imageWidth+j] = (unsigned char)Limit(l);
UImage[i*imageWidth+j] = (unsigned char)Limit(u);
VImage[i*imageWidth+j] = (unsigned char)Limit(v);
}
}
}
반응형
'Algorithm > Vision Sample Code' 카테고리의 다른 글
| Face Alignment, Warping, Tracking (0) | 2016.07.14 |
|---|---|
| CVPR2015 Code & Paper Link (0) | 2015.06.17 |
| Active Contour Model (0) | 2015.05.08 |
| Face Alignment 관련 기술 (0) | 2015.04.07 |
| Vision Datasets (0) | 2015.03.31 |