5

我希望使用 C++/OpenCV 将图像的像素值标准化为 [0..1] 范围。但是,当我使用任何一个image *= 1./255或 normalize 函数进行标准化时,像素值会向下舍入为零。我尝试将图像设置为 type 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]
4

2 回答 2

6

您可以convertTo()为您进行标准化:

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

您正在传递3convertTo(),大概是作为通道计数,但这不是正确的签名

于 2013-06-27T14:40:35.357 回答
1

我使用了该normalize功能并且它有效(Java):

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

您应该为目标图像使用 32F 深度。我相信这样做的原因是,由于您需要获取十进制值,因此您应该使用非整数 OpenCV 数据类型。根据此,浮点类型对应于 32F 深度。我选择通道数为 1 并且它起作用了;CV_32FC1

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

于 2017-03-11T17:45:03.217 回答