Нормализация освещения в OpenCV

Я работаю над проектом по распознаванию лиц. У меня есть фотографии с разным освещением, поэтому мне нужно сделать нормализацию освещения. Я прочитал статью, в которой утверждается, что выполняется нормализация освещения. В документе описываются следующие функции и значения.

1- гамма-коррекция с gamma = 0,2
2- разностная гауссовская (DOG) фильтрация с (sigma0 = 1, sigma1 =2)
3- выравнивание контраста (в бумага)

Я использую CvPow для гамма-коррекции, CvSmooth для DoG и Threshold() с усечением (не знаю, как указать компонент сжатия), но я не получил точного изображения. Я использовал выравнивание гистограммы для выравнивания контраста.

Если кто-то сделал это раньше или имеет какие-либо идеи ??

Ссылка на документ: http://lear.inrialpes.fr/pubs/2007/TT07/Tan-amfg07a.pdf

Ниже приведен код: (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);
}

Вот результат моей попытки:

Моя попытка

И ссылка из газеты:

введите здесь описание изображения


person Shah    schedule 12.07.2013    source источник
comment
Этот вопрос был бы намного лучше, если бы вы опубликовали свой код и описали, чем отличается ваш метод. А еще лучше разместите ссылки на примеры изображений.   -  person Aurelius    schedule 12.07.2013
comment
@Aurelius: код теперь доступен, и изображения также загружены.   -  person Shah    schedule 14.07.2013


Ответы (1)


Не знаю, слишком ли поздно для тебя.

В исходной статье DoG выполнялся по заданной сигме, здесь ваш радиус (23) слишком велик. Попробуйте радиус = 7 и радиус = 1. Насчет шага выравнивания, он отличается от бумажного. вам нужно реализовать один самостоятельно.

Кстати: некоторые базовые функции, такие как cvSmooth, не были реализованы правильно для вашего приложения. Вероятно, вам нужно реализовать это самостоятельно, чтобы получить лучший результат.

person blackball    schedule 16.09.2013
comment
Я использовал CvNormalize вместо EqualizeHist, и я приблизил изображение к изображению, упомянутому в статье. - person Shah; 19.09.2013