OpenCV:规范化图像的像素值

Ani*_*ein 3 c++ opencv

我试图将图像的像素值标准化为具有0.0的平均值和1.0的范数,以使图像具有一致的强度.有一个OpenCV功能,即cvNormalize(src,dst,0,1,cv_MINMAX),但是这个功能可以用于我的目的吗?任何帮助表示赞赏.谢谢.

BCo*_*nic 12

不,文档normalize:

normType=NORM_MINMAX(仅适用于密集数组)时,函数normalize缩放并移位输入数组元素,以便:

方程式http://docs.opencv.org/_images/math/31bceb122fccfc14279355379f91c7b269290386.png

因此,如果您使用normalize(src, dst, 0, 1, NORM_MINMAX, CV_32F);,您的数据将被标准化,以使最小值为0,最大值为1.

通过给出图像的像素值0.0和1.0的范数,你不清楚你的意思.在您编写时,我了解您要对像素值进行标准化,以便通过堆叠图像列获得的向量的范数为1.0.如果这是您想要的,您可以使用meanStdDev(文档)并执行以下操作(假设您的图像是灰度):

cv::Scalar avg,sdv;
cv::meanStdDev(image, avg, sdv);
sdv.val[0] = sqrt(image.cols*image.rows*sdv.val[0]*sdv.val[0]);
cv::Mat image_32f;
image.convertTo(image_32f,CV_32F,1/sdv.val[0],-avg.val[0]/sdv.val[0]);
Run Code Online (Sandbox Code Playgroud)

如果您只想标准化以使像素值的方差为1,则忽略第3行.

是的,这CV_32F意味着生成的图像将使用32位浮点数据类型(即float).

  • @ Anislein343尚不清楚什么应该具有“ 1.0范数” ...无论如何,如果您想有效地减少不同照明条件的影响,则图像的全局归一化将无济于事。请查看以下文章:[link1](http://scholar.google.fr/scholar?cluster=6690823132241966720),[link2](http://scholar.google.fr/scholar?cluster=14271520333736502311), [link3](http://scholar.google.fr/scholar?cluster=2687681104163852721),[link4](http://scholar.google.fr/scholar?cluster=14602528712956028312)。 (2认同)