Normalisation de l'éclairage en OpenCV

je travaille sur un projet de reconnaissance faciale. J'ai des photos avec différents éclairages donc je dois faire la normalisation de l'éclairage. J'ai lu un article qui prétend faire la normalisation de l'éclairage. L'article décrit la fonction et les valeurs suivantes.

1 - correction gamma avec gamma = 0.2

2-Différence de filtrage gaussien (chien) avec (sigma0 = 1, sigma1 = 2)

3-égalisation des contrastes (troncature) seuil de 10 et le composant de compression 0,1 est utilisé dans le papier)

j'utilise CvPow pour la correction gamma, CvSmooth pour le chien et Threshold() avec troncature (Je ne sais pas comment spécifier le composant de compression) mais je n'ai pas eu l'image exacte. J'ai utilisé l'égalisation des histogrammes pour l'égalisation des contrastes.

Si quelqu'un l'a fait avant ou a une idée??

lien vers le papier: http://lear.inrialpes.fr/pubs/2007/TT07/Tan-amfg07a.pdf

le code est ci-dessous: (code Python de Peb Aryan converti en 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);
}

Voici le résultat de ma tentative:

My attempt

et la référence du papier:

enter image description here

4
demandé sur Aurelius 2013-07-12 15:22:36

1 réponses

Je ne sais pas si c'est trop tard pour toi.

dans le papier original, le chien a été exécuté par un sigma donné, ici votre rayon(23) Il trop grand. Essayez radius = 7 et radius = 1. Pour l'égalisation, c'est différent du papier. vous avez besoin de mettre en œuvre un par vous-même.

BTW: certaines fonctions de base comme cvSmooth n'a pas été mis en œuvre right pour votre application. Vous avez probablement besoin de mettre en œuvre par vous-même pour obtenir une meilleure résultat.

1
répondu blackball 2013-09-16 12:17:34