OpenCV中的光照归一化

5
我正在进行人脸识别项目。我有不同光照条件下的照片,因此需要进行光照归一化。我读了一篇论文,声称可以进行光照归一化。该论文描述了以下函数和值。
1- 使用gamma=0.2进行伽马校正。 2- 使用(sigma0=1, sigma1=2)的高斯差分(DoG)滤波器。 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);
}

这是我的尝试结果:

我的尝试

这是来自论文的参考图片:

在此输入图片描述


如果您发布了您的代码,并描述了您的方法中的区别,那么这个问题会更好。更好的做法是,发布示例图像的链接。 - Aurelius
@Aurelius:代码现在已经可用,图片也已上传。 - Shah
1个回答

1

不知道现在对你来说是否太晚了。

在原始论文中,DoG是由给定的sigma执行的,而你的半径(23)太大了。尝试使用半径=7和半径=1。关于均衡化步骤,它与论文不同。你需要自己实现它。

顺便说一下:像cvSmooth这样的一些基本函数在你的应用程序中没有正确实现。你可能需要自己实现以获得更好的结果。


我使用了CvNormalize而不是EqualizeHist,得到的图像更接近论文中提到的图像。 - Shah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接