在 OpenCV 中,如果图像是浮点类型,则只有那些像素可以使用 可视化imshow
,其值从 0.0 到 1.0,如果值大于 1.0,则显示为白色像素,如果小于 0.0 ,它将显示为黑色像素。要可视化浮点图像,请将其值缩放到 range 0.0 - 1.0
。
至于转换部分......当与默认参数一起使用时,该cv::Mat::convertTo
函数只是创建一个指定类型的矩阵,然后从源矩阵复制值,然后将它们四舍五入到目标数据类型的最接近的可能值。如果该值超出范围,则将其限制为最小值或最大值。
在 的文档中imshow
写道:
如果图像是 32 位浮点,则像素值乘以 255。即取值范围 [0,1] 映射到 [0,255]。
这意味着只有 0.0 到 1.0 范围内的值会被映射到 0 到 255。如果一个值大于 1.0,再乘以 255,它将变得大于 255。然后它将被钳制在CV_8U
和最终它也会变成255。
在您的示例中,所有 1000 的值将在目标矩阵中变为 255,因为目标类型是CV_8U
,最大可能值为 255。所有浮点值都将被floor
编辑。没有进行自动映射。
为了将值适当地映射到函数CV_8U
的第三个和第四个参数的使用范围cv::Mat::convertTo
,以便在转换完成之前对值进行缩放。
假设矩阵A
具有最小值和最大值Min
,并且Max
,其中Min!=Max
。
要正确地将值从 0 缩放到 255,您可以执行以下操作:
if (Min!=Max){
A -= Min;
A.convertTo(B,CV_8U,255.0/(Max-Min));
}
您也可以像这样直接执行此操作:
if (Min!=Max)
A.convertTo(B,CV_8U,255.0/(Max-Min),-255.0*Min/(Max-Min));
(编辑考虑到zhangxaochen的评论)