Я работаю над проектом по распознаванию лиц. У меня есть фотографии с разным освещением, поэтому мне нужно сделать нормализацию освещения. Я прочитал статью, в которой утверждается, что выполняется нормализация освещения. В документе описываются следующие функции и значения.
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);
}
Вот результат моей попытки:
И ссылка из газеты: