【问题标题】:Matlab imshow doesn't plot correctly but imshowpair doesMatlab imshow 无法正确绘制,但 imshowpair 可以
【发布时间】:2015-11-13 22:29:52
【问题描述】:

我已经导入了一张图片。我已将其解析为双精度并对其进行了一些过滤。

当我用imshow 绘制结果时,双重图像太暗了。但是当我使用imshowpair 绘制原始图像和最终图像时,两个图像都正确显示。

我尝试过使用uint8im2uint8,乘以255然后使用这些函数,但获得正确图像的唯一方法是使用imshowpair

我能做什么?

【问题讨论】:

  • 你试过imshow(im,[]);吗?另外,请向我们展示您为解析图像数据而编写的代码。如果不查看您的尝试,就不可能知道发生了什么。
  • 为了解析我刚才使用的数据 I = im2double(I);另外,我试过你说的,它奏效了!为什么?如果我想将图像存储在矩阵中,我该怎么办?谢谢!
  • 图像已经存储为矩阵,所以这没有意义。但是,使用im2double 只是将图像转换为double,如果图像已经是double,则不会发生任何事情。这可能是因为您过滤图像的方式。你在做某种边缘检测吗?你得到黑暗图像的原因可能是因为你的大部分强度都是负面的。 imshow 假设对于 double 类型,强度的动态范围是 [0,1],因此 imshow(im,[]) 会移动范围,因此最小值映射为 0,最大值映射为 1。
  • 我在问如何更改图像的动态范围,但经过您的解释,我能够自己完成。你不知道我花了多少时间试图解决这个问题,感谢你,我终于做到了!非常感谢!

标签: image matlab image-processing imshow


【解决方案1】:

在显示double 数据时,您的大部分强度/颜色数据超出了imshow 可接受的动态范围,这听起来像是一个问题。

我还看到您正在使用im2double,但im2double 只是将图像转换为双倍,如果图像已经是双倍,则没有任何反应。这可能是因为您过滤图像的方式。你在做某种边缘检测吗?你得到黑暗图像的原因可能是因为你的大部分强度是负的,或者在 0 附近徘徊。imshow 在显示double 类型图像时假设强度的动态范围是 [0,1]。

因此,解决问题的一种方法是:

imshow(im,[]);

这会改变显示范围,使最小值映射到 0,将最大值映射到 1。

如果您想要更持久的解决方案,请考虑创建一个新的输出变量来为您执行此操作:

out = (im - min(im(:))) / (max(im(:)) - min(im(:)));

这将执行与 imshow 在为您显示数据时所做的相同转换。你现在可以这样做:

imshow(out);

【讨论】:

    猜你喜欢
    • 2016-02-18
    • 2020-10-11
    • 2021-12-06
    • 2018-02-20
    • 2012-07-05
    • 2012-10-05
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    相关资源
    最近更新 更多