如何在OpenCV中显示Mat

4

对于存储图像的Mat,可以使用imshow轻松显示。但如果Mat的数据类型是CV_32FC1,我该如何显示这个Mat?

我尝试了imshow,但显示的图像全是白色的,缩放后仍然完全空白,我看不到Mat中的浮点数。

有谁知道如何显示整个Mat矩阵吗?

p.s.:感谢回复。我将发布一些代码和图像以显示更多细节: 代码:

Mat mat1;
mat1 = Mat::ones(3,4,CV_32FC1);
mat1 = mat1 * 200;
imshow("test", mat1);
waitKey(0);

Mat dst;
normalize(mat1, dst, 0, 1, NORM_MINMAX);
imshow("test1", dst);
waitKey(0);

mat1.convertTo(dst, CV_8UC1);
imshow("test2", dst);
waitKey(0);

return 0;

输出:

enter image description here

当我将其放大150%后:

enter image description here

然后,当我将其放大150%后,我们可以看到“test”完全是白色的,我们无法看到其元素值。“test1”完全是黑色的,我们仍然无法看到其元素值。但是对于“test2”,它是灰色的,我们可以看到其元素值为200。

这个实验是否意味着imshow()只能显示CV_8UC1,而我们无法显示任何其他数据类型?

1个回答

24
如果image是CV_32F类型的Mat,即图像为32位浮点型,则imshow()函数会将像素值乘以255。也就是说,值域[0,1]会映射到[0,255]。
因此,你的浮点型图像必须具有0到1的范围。
这将显示一个CV32F图像,无论其范围是多少:
        cv::Mat dst
        cv::normalize(image, dst, 0, 1, cv::NORM_MINMAX);
        cv::imshow("test", dst);
        cv::waitKey(0);

2
只是好奇为什么会被踩:这种方式对我来说完美无缺。 - Bull
1
我也在想为什么会被踩。将浮点图像归一化到[0:1]并调用imshow是完全有效的。对我来说加1。 - remi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接