OpenCV双精度矩阵显示为全白。

4

我有一个类型为6的mat(双值,单通道),其数据范围从0到255。我可以使用以下代码打印出数据:

    double* data  =  result.ptr<double>();

    for(int i = 0; i < rows; i++)
        for(int j = 0; j < cols; j++)
    std::cout<<data[i*step+j]<<"\t";

这看起来非常正常--在0到255的范围内,而且大小也符合我的预期。然而,当我尝试显示图像时:

imshow(window_name, result);
waitKey();

我只能看到一张白色的图片,除了白色的像素,什么都没有。

从文件中加载并在窗口中显示其他图像可以正常工作。

使用Windows 7,OpenCV 233。


那看起来像是C++代码,为什么不加上C++标签呢? - karlphillip
2个回答

11

cv::imshow 的工作方式如下:

  1. 如果图像是8位无符号的,它将按原样显示。
  2. 如果图像是16位无符号或32位整数,则像素除以256。也就是说,值范围[0, 255 * 256]映射到[0, 255]。
  3. 如果图像是32位浮点型,则像素值乘以255。也就是说,值范围[0,1]映射到[0,255]。

您的矩阵属于第三类,其中imshow期望值在0和1之间,并因此将其乘以255。由于您的值已经在0到255之间,因此会得到不需要的结果。因此,将像素归一化为0到1之间的值即可解决问题。


2
感谢您提供的所有精确信息。到目前为止,这是最好的答案! - Yohan Obadia

7
如果您使用 imshow,则需要将浮点图像标准化,使值介于0.0 - 1.0之间。我敢打赌您的值超过了1.0,因此这些像素全部设置为255,从而给您呈现了白色的图像。请标准化您的图像并重新运行程序。

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