我希望使用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]
答案 0 :(得分:2)
您可以让convertTo()
为您进行规范化:
image.convertTo(tempImage, CV_32FC3, 1.f/255);
您正在将3
传递给convertTo()
,大概是通道数,但那不是the correct signature。
答案 1 :(得分:1)
我使用了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
查看正在发生的情况。希望这会有所帮助。