OpenCV中的照明规范化

时间:2013-07-12 11:22:36

标签: opencv gaussian threshold contrast gamma

我正在开展一个面部识别项目。我有不同照明的照片,所以我需要做照明标准化。我读了一篇声称要进行照明归一化的论文。本文描述了以下功能和价值。

1-伽马校正,γ= 0.2
2-高斯(DOG)滤波的差值(sigma0 = 1,sigma1 = 2)
3-对比均衡(截断阈值10和压缩成分0.1用于本文)

我使用CvPow进行伽马校正,CvSmooth用于DoG,Threshold()用截断(我不知道如何指定压缩组件)但我没有得到确切的结果图片。我使用直方图均衡来进行对比度均衡。

如果某人以前做过或有任何想法?

链接到论文:http://lear.inrialpes.fr/pubs/2007/TT07/Tan-amfg07a.pdf

代码如下:( Peb Aryan的Python代码转换为JAVACV)

public static IplImage preprocessImg(IplImage img)
{
    IplImage gf = cvCreateImage(cvSize(img.width(),img.height()),IPL_DEPTH_32F, 1 );
    IplImage gr = IplImage.create(img.width(),img.height(), IPL_DEPTH_8U, 1);
    IplImage tr = IplImage.create(img.width(),img.height(), IPL_DEPTH_8U, 1);

    IplImage b1 = IplImage.create(img.width(),img.height(),IPL_DEPTH_32F, 1 );
    IplImage b2 = IplImage.create(img.width(),img.height(),IPL_DEPTH_32F, 1 );
    IplImage b3 = IplImage.create(img.width(),img.height(),IPL_DEPTH_32F, 1 );
    CvArr mask = IplImage.create(0,0,IPL_DEPTH_8U, 1 );

    cvCvtColor(img, gr, CV_BGR2GRAY); 
    gamma(gr,gr,gf);

    cvSmooth(gf,b1,CV_GAUSSIAN, 1);
    cvSmooth(gf,b2,CV_GAUSSIAN,23);
    cvSub(b1,b2,b2,mask);         
    cvConvertScale(b2,gr,127,127);
    cvEqualizeHist(gr, gr);

    //cvThreshold(gr,tr,255,0,CV_THRESH_TRUNC);

    return gr;
}

public static void gamma(IplImage src,IplImage dst, IplImage temp)
{
    cvConvertScale(src,temp, 1.0/255,0);
    cvPow(temp, temp, 0.2);
    cvConvertScale(temp, dst, 255,0);
}

以下是我尝试的结果:

My attempt

来自论文的参考文献:

enter image description here

1 个答案:

答案 0 :(得分:1)

不知道对你来说是否为时已晚。

在原始论文中,DoG是由给定的sigma执行的,这里你的半径(23)太大了。尝试半径= 7和半径= 1.关于均衡步骤,它与纸张不同。你需要自己实施一个。

BTW:cvSmooth等一些基本功能未针对您的应用程序实现正确。您可能需要自己实施以获得更好的结果。