规范化0到1之间的像素值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了规范化0到1之间的像素值相关的知识,希望对你有一定的参考价值。

我希望使用C ++ / OpenCV将图像的像素值标准化为[0..1]范围。但是,当我使用image *= 1./255或normalize函数进行归一化时,像素值会向下舍入为零。我已经尝试将图像设置为键入CV_32FC3

以下是我的代码:

  Mat image;
  image = imread(imageLoc, CV_LOAD_IMAGE_COLOR | CV_LOAD_IMAGE_ANYDEPTH);

  Mat tempImage;

  // (didn't work) tempImage *= 1./255;

  image.convertTo(tempImage, CV_32F, 3);
  normalize(image, tempImage, 0, 1, CV_MINMAX);

  int r = 100;
  int c = 150;

  uchar* ptr = (uchar*)(tempImage.data + r * tempImage.step);
  Vec3f tempVals;
  tempVals.val[0] =  ptr[3*c+1];
  tempVals.val[1] =  ptr[3*c+2];
  tempVals.val[2] =  ptr[3*c+3];
  cout<<" temp image - "<< tempVals << endl;

  uchar* ptr2 = (uchar*)(image.data + r * image.step);
  Vec3f imVals;
  imVals.val[0] =  ptr2[3*c+1];
  imVals.val[1] =  ptr2[3*c+2];
  imVals.val[2] =  ptr2[3*c+3];
  cout<<" image - "<< imVals << endl;

这会在控制台中生成以下输出:

temp image - [0, 0, 0]
image - [90, 78, 60]
答案

你可以让convertTo()为你做标准化:

image.convertTo(tempImage, CV_32FC3, 1.f/255);

你正在将3传递给convertTo(),大概是通道数,但那不是the correct signature

另一答案

我使用了normalize函数,它工作(Java):

Core.normalize(src,dst,0.0,1.0,Core.NORM_MINMAX,CvType.CV_32FC1);

您应该使用32F深度作为目标图像。我认为其原因在于,由于需要获取十进制值,因此应使用非整数OpenCV数据类型。根据这个table,浮点类型对应于32F深度。我选择的频道数为1并且有效; CV_32FC1

还要记住,它不太可能在图像中发现任何视觉差异。最后,由于您的图像中可能有数千个像素,因此您的控制台可能看起来只打印了零。但是由于数据量很大,请尝试使用CTRL+F查看发生了什么。希望这可以帮助。

以上是关于规范化0到1之间的像素值的主要内容,如果未能解决你的问题,请参考以下文章

灰度图像时0到255之间的像素,哪个函数能把它变成0到1之间的像素

如何标准化图像中的像素值并保存

灰度图像时0到255之间的像素,哪个函数能把它变成0到1之间的

为啥使用 k-means(来自 Scipy)聚类到两个片段的图像会显示两个以上不同的像素值?

Python Pandas Dataframe:规范化 0.01 到 0.99 之间的数据?

OpenGL、GLSL 片段着色器无法读取 Sampler2D 纹理