2013-07-12 46 views
4

我正在進行人臉識別項目。我有不同照明的照片,所以我需要做照明標準化。我讀了一篇論文,聲稱做光照正常化。本文描述了以下功能和值。用γ與(sigma0 = 1,sigma1 = 2)的10
3-對比度均衡(截斷閾值和壓縮元件0.1濾波OpenCV中的照明規範化

1-伽馬校正= 0.2
2-高斯差分(DOG)的使用在紙)

我用CvPow的伽瑪校正,CvSmooth狗和Threshold()與截斷(我不知道如何來指定壓縮部件),但我並沒有得到確切的圖像。我使用直方圖均衡來進行對比度均衡。

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

鏈接到紙:http://lear.inrialpes.fr/pubs/2007/TT07/Tan-amfg07a.pdf

的代碼如下:(PEB雅利安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

+0

如果您發佈了[您的代碼](http://sscce.org)並描述了您的方法有什麼不同,那麼這個問題會更好。更好的是,張貼鏈接到示例圖像。 – Aurelius

+0

@Aurelius:代碼現在可用,照片也會上傳。 – Shah

回答

1

不知道對你來說太晚了。

在原始文件中,DoG是通過給定的西格瑪來執行的,在這裏你的半徑(23)太大了。嘗試半徑= 7和半徑= 1。關於均衡步驟,它與紙張不同。你需要自己實施一個。

順便說一句:一些基本的功能,如cvSmooth沒有實施正確爲您的應用程序。您可能需要自行實施才能獲得更好的結果。

+0

我用CvNormalize代替了EqualizeHist,並且我在文中提到的圖像變得更接近圖像。 – Shah

+0

@agile:你介意更新你的最終代碼嗎? – Ela782