我试图在OpenCV中实现局部归一化算法,以减少图像中的照明差异.我找到了一个
MATLAB function,我在OpenCV中实现了它.但是,我得到的结果与MATLAB函数给出的结果不同.
这是我的代码:
Mat localNorm(Mat image,float sigma1,float sigma2) { Mat floatGray,blurred1,blurred2,temp1,temp2,res; image.convertTo(floatGray,CV_32FC1); floatGray = floatGray/255.0; int blur1 = 2*ceil(-NormInv(0.05,sigma1))+1; cv::GaussianBlur(floatGray,cv::Size(blur1,blur1),sigma1); temp1 = floatGray-blurred1; cv::pow(temp1,2.0,temp2); int blur2 = 2*ceil(-NormInv(0.05,sigma2))+1; cv::GaussianBlur(temp2,cv::Size(blur2,blur2),sigma2); cv::pow(blurred2,0.5,temp2); floatGray = temp1/temp2; floatGray = 255.0*floatGray; floatGray.convertTo(res,CV_8UC1); return res; }
函数NormInv是Euan Dean在this post年给出的C实现.
以下显示了我得到的结果和理论结果,对于sigma1和sigma2的相同值(分别为2.0和20.0)
我尝试过为sigma1和sigma2使用不同的值,但它们似乎都没有用.我也尝试在高斯函数中做blur1 = 0和blur2 = 0,但它也不起作用.
任何帮助,将不胜感激.提前致谢.
解决方法
在将图像转换为CV_8UC1之前,需要将图像标准化为0到255之间