【问题标题】:Python: Floating Point images / alternative to matlab's im2double?Python:浮点图像/matlab 的 im2double 的替代品?
【发布时间】:2011-07-18 23:05:19
【问题描述】:

我正在尝试将一些 matlab 代码转换为 python,而 im2double 函数给我带来了麻烦。它需要一个图像并返回一个矩阵,其中像素使用双精度而不是整数。

目前我正在使用 PIL 处理我的图像。它有一个convert 方法,可以将'F' 作为参数,但它所做的只是将整数值255 转换为255.0。据我所知没用。

我遇到的问题是我正在做一些图像处理,然后必须保存它们。我可以标准化我的值,使它们落入 0-255 范围内,但我失去了一些精度。它足够小,通常不重要,但在这里,它确实如此。

我尝试过使用“tiff”文件格式,但效果不佳。虽然我可以对其进行写入/读取,但我得到的结果不是正确的,我目前只能将像素转换为 255,这会导致精度损失,正如我之前所说。我还尝试了这种'SPIDER' 文件格式的东西,我之前在谷歌上找到了 PIL 支持的东西,尽管我无法在编辑器上打开图像来检查它是如何做的。

【问题讨论】:

  • 为了最终写出像素,您必须转换为 0-255 范围,不是吗?
  • 是的,但我希望我只需要这样做,因为我现在没有合适的文件格式可以使用。例如,您实际上可以在 matlab 上做一个im.show(floating_point_image) 而无需转换它。
  • 您的计算机只有红色、绿色和蓝色的范围 0-255。它根本无法显示更多细节。
  • 真的吗?并不是我怀疑你,而是我真的很惊讶,因为我正在阅读的代码中有一些存储在 .mat 文件中的颜色数据,其精度大于 1/255。例如,我看不到从 .mat 文件生成的图片和转换为黑白的彩色图像的区别,但是加载原始值并对其进行操作,我可以用代码显示实际上存在差异在某些像素的图像中。所以,换句话说,为了存储这个显着差异,我不能使用图像,尽管代码对此有用?嗯。很奇怪。
  • 另外,像 exr 或 rgbe 这样的文件格式呢?

标签: python image matlab image-processing python-imaging-library


【解决方案1】:

在 Python 中正确执行此操作的方法是使用 Numpy。您可以通过PIL into numpy 数组读取图像。此时,您可以通过 numpy/scipy 使用各种类似 Matlab 的矩阵运算。更改数组的精度只是通过 numpy.xml 切换数组数据类型的问题。最近releases 的 PIL 包含来自 Travis Oliphant 的补丁,让您无需额外的黑客攻击即可做到这一点。

使用浮点 TIFF 可以在不损失精度的情况下将数据保存为更常见的可读图像格式。我使用GDAL library 来连接多个图像格式的写入器/读取器。如果你想要无损压缩 TIFF 也可以使用 zlib 进行压缩。

【讨论】:

  • 如果我正确理解发生了什么,OP 可能希望将他的源 .mat 直接读入 numpy 数组,在那里他可以在不显着损失精度的情况下执行操作,然后输出到 PIL。
  • 我已经在使用 ndarrays。问题是,一旦 PIL 读取图像,我就会失去精度,因为它将信息转换为 0-255。我可以使用scipy.io 轻松加载 .mat 文件。这将是“正确”的唯一方法是如果没有办法从像上面建议的@Winston Ewert 这样的“jpg”图像中获得更高的精度。那么这意味着我只能从非图像文件中获取必要的信息。
  • @idontlikeyourmatlab,如果它已经在 jpeg 文件中,则精度已经丢失。事实上,由于 jpeg 是有损的,你已经遭受了相当大的精度损失。
  • @Winston Ewert 我想可能是这样。我会暂时保持打开状态,以防有人有更有用的答案。
  • 来自图像处理领域,我避免像瘟疫一样将真实数据存储在 JPEG 中,除非证明保真度损失是目的。您可以将 TIFF 文件保存在浮点中 - 我通常为此使用 GDAL(请参阅修改后的答案)。
猜你喜欢
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 2012-11-26
  • 2012-06-29
  • 2018-08-27
  • 2021-02-11
相关资源
最近更新 更多