光照补偿算法

一、色彩均衡算法
二、基于参考白的算法

一、色彩均衡算法
1.求出3个通道各个平均值,以及灰度的平均值grayAvg,修改每个原像素值
2.求出像素值最大值maxNum,如果factor=maxNum/255,factor>1,则每个通道像素都除以factor以修改像素值

void Illumination_compensation(V_Image** img)
{
    int col=0,index=0;
    int rows=(*img)->mRow,cols=(*img)->mCol,cns=(*img)->mChannels;
    unsigned char *bArr=(unsigned char *) calloc(rows*cols,sizeof(unsigned char));
    unsigned char *gArr=(unsigned char *) calloc(rows*cols,sizeof(unsigned char));
    unsigned char *rArr=(unsigned char *) calloc(rows*cols,sizeof(unsigned char));
    float bTotal=0,gTotal=0,rTotal=0;
    float bAvg=0.0,gAvg=0.0,rAvg=0.0;
    float bRatio=0,gRatio=0,rRatio=0,grayAvg=0.0;
    //分成三个数组,一个通道一个,并求和
    for(col=0; col<rows*cols*cns; col++)
    {
        bArr[index]=(*img)->mData[col];
        gArr[index]=(*img)->mData[++col];
        rArr[index]=(*img)->mData[++col];
        bTotal+=bArr[index];
        gTotal+=gArr[index];
        rTotal+=rArr[index];
        index++;
    }
    bAvg=bTotal/(rows*cols);
    gAvg=gTotal/(rows*cols);
    rAvg=rTotal/(rows*cols);
    grayAvg=(bAvg+gAvg+rAvg)/3;

    bRatio=grayAvg/bAvg;
    gRatio=grayAvg/gAvg;
    rRatio=grayAvg/rAvg;

    int maxNum=0;
    for(index=0; index<rows*cols; index++)
    {
        bArr[index]=floor(bArr[index]*bRatio);
        gArr[index]=floor(gArr[index]*gRatio);
        rArr[index]=floor(rArr[index]*rRatio);

        if( bArr[index]>maxNum)
            maxNum=bArr[index];
        if( gArr[index]>maxNum)
            maxNum=gArr[index];
        if( rArr[index]>maxNum)
            maxNum=rArr[index];
    }

    int factor=maxNum/255,blue,green,red;
    index=0;

    for(col=0; col<cns*rows*cols; col++)
    {
        if(factor>1)
        {
            blue=bArr[index]/factor;
            green=gArr[index]/factor;
            red=rArr[index]/factor;
            index++;
        }
        else
        {
            blue=bArr[index];
            green=gArr[index];
            red=rArr[index];
            index++;
        }
        (*img)->mData[col]=detectNum(blue);
        (*img)->mData[++col]=detectNum(green);
        (*img)->mData[++col]=detectNum(red);

    }
}

二、基于参考白的算法
1.统计每个灰度值的像素个数
2.求出值前大5%的像素灰度像素最为参考白,然后可以获得参考白的平均灰度值avgGray=参考白总像素值totalPixel/参考白像素个数total。则光照

void Illumination_compensation(V_Image** img)
{
    int col=0,index=0;
    int rows=(*img)->mRow,cols=(*img)->mCol,cns=(*img)->mChannels;
    unsigned char *grayArr=(unsigned char *) calloc(rows*cols,sizeof(unsigned char));
    ///计算原像素的灰度值
    for(col=0; col<rows*cols*cns; col++)
        grayArr[index++]=((*img)->mData[col] * 0.114 + (*img)->mData[++col] * 0.587 + (*img)->mData[++col]  * 0.299);

    int num=floor(rows*cols*0.05);
    int *refIndexArr=(int *) calloc(num,sizeof(int));//参考白数列
    int *avgRefIndexArr=(int *) calloc(num,sizeof(int));//参考白数列
    float *pixelNum=(float *) calloc(256,sizeof(float));//像素数数列
    ///初始化数组为0
    for(index=0; index<256; index++)
        pixelNum[index]=0;

    ///统计像素灰度个数
    for(col=0; col<rows*cols; col++ )
        pixelNum[grayArr[col]]++;

    ///求出灰度值从大到小前百分之五的灰度值是哪个灰度值maxPixel
    int total=0,maxPixel;
    for(index=255; index>=0; index--)
    {
        if(total<num)
        {
            total+=pixelNum[index];
            maxPixel=index;
        }
        else break;
    }
    ///求出参考白的总灰度数
    int totalPixel=0;
    for(index=maxPixel; index<255; index++)
        totalPixel+=index*pixelNum[index];
    ///参考白的平均灰度数
    float avgGray=totalPixel/total;
    ///光照补偿系数
    float coe=255/avgGray;
    ///原像素值乘以光照补偿系数
    for(index=0; index<rows*cols; index++)
    {
        (*img)->mData[index*3]=detectNum((*img)->mData[index*3]*coe);
        (*img)->mData[index*3+1]=detectNum((*img)->mData[index*3+1]*coe);
        (*img)->mData[index*3+2]=detectNum((*img)->mData[index*3+2]*coe);
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容