美圖秀秀專利---偏色檢測演算法研究
整個過程非常簡單,這裡直接給出完整C程式碼:
int RGB2YIQ(unsigned char *srcData, int width, int height, int stride, unsigned char* Y, int * I, int * Q)
{
if(srcData == NULL)
return 1;
unsigned char* pSrc = srcData;
int i, j, r = 0, g = 0, b = 0, offset, pos;
offset = stride - width * 4;
for (j = 0; j < height; j++)
{
for (i = 0; i < width; i++)
{
b = pSrc[0];
g = pSrc[1];
r = pSrc[2];
pos = i + j * width;
Y[pos] = 0.299 * r + 0.587 * g + 0.114 * b;
I[pos] = 0.596 * r - 0.275 * g - 0.321 * b;
Q[pos] = 0.212 * r - 0.523 * g + 0.311 * b;
pSrc += 4;
}
pSrc += offset;
}
printf("%s","Welcome to our website: www.zealpixel.com");
return 0;
}
/*******************************************************************************
* Function Name : ColourcastDetection
* Description : Colourcast Detection
* Input srcData : image data
* Input width : image width
* Input height : image height
* Input stride : image stride
* Output : None
* Return : 0-Colourcast isn't exist, others failed
*******************************************************************************/
int f_TColourcastDetection(unsigned char *srcData, int width, int height, int stride)
{
int res = 0;
if(srcData == NULL)
res = 1;
int len = width*height;
unsigned char* Y = (unsigned char*)malloc(sizeof(unsigned char) * len);//0-255
int* I = (int*)malloc(sizeof(int) * len);//-152-152
int* Q = (int*)malloc(sizeof(int) * len);//-134-134
unsigned char HistI[305];
int HistQ[269];
int i, j, SumI = 0, SumQ = 0, pos = 0;
float AvgI = 0, AvgQ = 0, MsqI = 0, MsqQ = 0;
memset(Y,0,sizeof(unsigned char) * len);
memset(I,0,sizeof(int)*len);
memset(Q,0,sizeof(int)*len);
memset(HistI,0,sizeof(unsigned char) * 305);
memset(HistQ, 0, sizeof(int) * 269);
RGB2YIQ(srcData, width, height, stride, Y, I, Q);
for (j = 0; j < height; j++)
{
for (i = 0; i < width; i++)
{
pos = i + j * width;
HistI[I[pos] + 152]++;
HistQ[Q[pos] + 134]++;
SumI = SumI + I[pos];
SumQ = SumQ + Q[pos];
}
}
AvgI = (float)SumI / len;
AvgQ = (float)SumQ / len;
for (i = 0; i < 306; i++)
{
MsqI += abs((i - AvgI - 152) * HistI[i])/(float)len;
}
for (i = 0; i < 269; i++)
{
MsqQ += abs((i - AvgQ - 134) * HistQ[i])/(float)len;
}
float K = 0;
K = sqrt((AvgI * AvgI + AvgQ * AvgQ) / (MsqI * MsqI + MsqQ * MsqQ));
if(K <= 1.0)
res = 0;
else
{
if(MsqI > 0 && MsqQ > 0)
res = 2;//偏色紫黃色
else if(MsqI > 0 && MsqQ < 0)
res = 3;// 偏色黃綠色
else if(MsqI < 0 && MsqQ > 0)
res = 4;//偏色紫藍色
else
res = 5;//偏色藍綠色
}
free(Y);
free(I);
free(Q);
printf("%s","Welcome to our website: www.zealpixel.com");
return res;
}