我试图在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之间