【问题标题】:Matlab conversion of pixel values to double precisionMatlab将像素值转换为双精度
【发布时间】:2016-09-07 23:29:10
【问题描述】:

我是 Matlab 新手,所以这应该是一个简单的问题。我有一个带有几个特定像素的图像,我需要从中获取红色 RGB 分量,对它们求和,然后将结果存储到一个变量中。默认情况下,这些值的类型为 uint8,因此总和不能超过 255。我尝试使用 double() 的每个组合将 R 值转换为双精度值,但似乎没有任何效果。这正是正在发生的事情,从终端复制:(所有像素的 R 值都高于 200)

img = imread('img.png');
r = img(64,64,1)
r =
    224
r = r + double(img(64,65,1))
r =
    255
r = r + double(img(64,66,1))
r =
    255

我做错了什么?我无法将这些值转换为双精度值吗?

【问题讨论】:

  • r = double(img(64,64,1)) 呢?
  • 在这种特殊情况下,可能更容易做到sum(img(64,64:66,1))
  • 我注意到您尚未接受任何问题的答案。请阅读stackoverflow.com/help/someone-answers

标签: image matlab rgb


【解决方案1】:

对于图像处理,大多数时候最好使用im2double 函数将读取的图像转换为0-1之间的双精度数组:

img = im2double(imread('img.png'));

那你就不用再担心同一个程序中的数据类型了。

单独使用 double() 的数据类型转换几乎永远不会完成您想要对图像进行的操作,因为 uint8 和双图像在 数据类型和数据范围方面都不同。

【讨论】:

    【解决方案2】:

    r = r + double(img(64,65,1)) 行中发生的情况是,img(64,65,1) 值正在转换为 double,但随后又立即转换回 class(r),因为 r 是一个整数类并且在操作中具有优先权。观察class(int64(10)+10) 回馈int64。正如beaker 所说,这里的关键是首先将r 本身转换为double

    您可能不必担心使用double() 进行转换; doubles 可以表示最大为2^53-1 的整数,比 255 高得多。因此,如果您只是进行简单的像素求和操作或类似的操作,则不会在计算中失去任何精度。当然,如果你需要把它放回图像中,那么大约 255 的任何东西都会饱和。因此,根据您将事物重新调整到 0 和 1 之间的操作,这可能更有意义;在这种情况下,按照明镜的建议,最好使用im2double

    【讨论】:

      猜你喜欢
      • 2018-01-08
      • 2021-09-12
      • 2019-02-24
      • 2016-02-26
      • 1970-01-01
      • 2011-01-14
      • 2017-02-24
      • 2015-09-13
      • 1970-01-01
      相关资源
      最近更新 更多