美图秀秀专利---偏色检测算法研究

本文将实现美图秀秀于2015年公布的一篇图像处理专利:一种基于颜色空间的偏色检测 方法。
这个专利的下载地址: http://pan.baidu.com/s/1eQIuPgQ 专利公布号为 CN104766348 A
专利中算法部分介绍的非常详细,主要过程如下:

美图秀秀专利---偏色检测算法研究_第1张图片

美图秀秀专利---偏色检测算法研究_第2张图片

美图秀秀专利---偏色检测算法研究_第3张图片美图秀秀专利---偏色检测算法研究_第4张图片

整个过程非常简单,这里直接给出完整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;

}

对于这个算法的好坏,我们做了如下实验:

美图秀秀专利---偏色检测算法研究_第5张图片

结果:偏紫黄色

美图秀秀专利---偏色检测算法研究_第6张图片

结果:偏紫黄色

美图秀秀专利---偏色检测算法研究_第7张图片

结果:偏紫黄色

美图秀秀专利---偏色检测算法研究_第8张图片

结果:偏紫黄色

在看两张正常图像的结果:

美图秀秀专利---偏色检测算法研究_第9张图片

结果:不偏色

美图秀秀专利---偏色检测算法研究_第10张图片

结果:偏紫黄色

以上代码如有问题,希望大家纠正,但是针对以上简单测试,发现这个专利算法并不准确,明明不是紫黄色,却得出了偏紫黄色的结论!

最后放上一个DEMO,给大家 分享一下:点击打开链接


你可能感兴趣的:(专利,美图秀秀,CC#代码实现,偏色检测)