【问题标题】:Python: Manipulating a 16-bit .tiff image in PIL &/or pygame: convert to 8-bit somehow?Python:在 PIL 和/或 pygame 中操作 16 位 .tiff 图像:以某种方式转换为 8 位?
【发布时间】:2011-08-11 17:47:29
【问题描述】:

大家好,

我正在开发一个程序,该程序可以从照片中确定酵母的平均菌落大小,并且它与我测试过的 .bmp 图像配合得很好。该程序使用pygame,以后可能会使用PIL。

但是,我们在实验室中使用的相机/软件组合只能保存 16 位灰度 tiff,而 pygame 似乎无法识别 16 位 tiff,只能识别 8 位。在过去的几个小时里,我一直在阅读有关此问题的简单方法,但即使是 Python Imaging Library 似乎也无法使用 16 位 .tiff,我已经尝试过并且我得到“IOError:无法识别图像文件”。

import Image

img = Image.open("01 WT mm.tif")

我的最终目标是让这个程序对用户友好且易于安装,因此我试图避免添加额外的模块或要求人们安装 ImageMagick 或其他东西。

有没有人知道使用免费软件或纯 python 解决此问题的简单方法?我对图像了解不多:位深度操作超出了我的范围。但我相当确定我不需要所有 16 位,而且可能只有大约 8 位实际上有真实数据。事实上,我曾经使用 ImageMagick 尝试转换它们,这导致了一个全白的图像:我已经读过我应该使用命令“-auto-levels”,因为数据实际上并不包含 16-位范围。

非常感谢您的帮助,并对我缺乏知识表示歉意。

P.S.:有没有人有关于如何使我的 Python 程序易于非程序员安装的任何提示?例如,有没有办法以某种方式将它与 Python 和 pygame 捆绑在一起,所以它只是一个安装? Windows 和 Mac 都可以这样做吗?谢谢。

编辑:我尝试在 GIMP 中打开它,但出现 3 个错误:

1) 字段“DateTime”的计数不正确(27,预期为 20);标签修剪 2) 抱歉,无法处理 12 位样本的图像 3) 不支持的布局,没有 RGBA 加载器

这是什么意思,我该如何适应?

【问题讨论】:

  • 您使用的是什么版本的 PIL? PIL 应该支持 16 位灰度图像(从 1.1.4 开始)。
  • 就我个人而言,我会使用 scipy.misc.imread() 和标记的数组函数来查看 SciPy,它们似乎非常适合您正在做的事情。
  • 我一直在使用 PIL 版本 1.1.7,所以可能不是位深度?我难住了!相机软件是否会对 .tiff 进行其他一些奇怪的格式化?
  • 在相关但单独的说明中,您可能需要查看CellProfiler。它有一个用于菌落计数的示例管道,并处理多种格式的 16 位图像。
  • 抱歉,愚蠢的问题:我可以在这个网站上上传我的示例图片吗?似乎stackoverflow将其转换为png。

标签: python python-imaging-library tiff pygame 16-bit


【解决方案1】:

我会看pylibtiff,它有一个纯python tiff 阅读器。

对于捆绑,最好的选择可能是 py2exe 和 py2app。

【讨论】:

    【解决方案2】:

    这实际上是一个两部分的问题:

    1) Python 的 16 位图像数据处理 - 我通常使用 GDAL + Numpy。这可能对您的要求有点过多,您可以改用 PIL + Numpy。

    2) 发布工程 Python 应用程序可能会变得混乱。根据您的应用程序的复杂程度,您可以使用py2debpy2apppy2exe。学习 distutils 也会有所帮助。

    【讨论】:

      【解决方案3】:

      py2exe 是在 Windows 系统上打包应用程序的方法。

      关于 16bit tiff 问题:

      此示例http://ubuntuforums.org/showthread.php?t=1483265 展示了如何使用 PIL 转换为显示。

      现在对于未提出的部分问题:在进行图像分析时,您希望在图像处理中尽可能长时间地保持最高动态范围 - 这样会丢失更少的信息。您可能知道也可能不知道,PIL 为您提供了许多过滤器/变换,它们可以让您增强图像的对比度、均匀光照水平或执行边缘检测。您可能要考虑的未来方向是在经过边缘检测处理的缩放图像旁边显示原始图像(当然缩放到 8 位)。

      查看http://code.google.com/p/pyimp/wiki/screenshots 了解更多示例和示例代码。

      【讨论】:

      • 我什至不能 Image.open() 这些 tiff,它给了我“IOError:无法识别图像文件”,所以第一个链接中的示例不起作用。我知道这些文件很好,因为它们在 Photoshop 中打开。会不会是位深度以外的东西?
      • 如果您在 Photoshop 中打开并重新另存为 tiff 是否有效?这可能是文件头问题或原始数据与压缩数据。
      • 我可以打开它们并用 Photoshop 转换它们;我一直在用我制作的 .bmp 测试我的代码。按右键查看“属性”,原件没有压缩。不知道什么是文件头,也不知道怎么看,怎么看有没有异常?
      • 但是您正在更改格式。如果您打开其中一张图像,并使用新名称另存为,但将文件类型保持为 TIFF 并将数据保持为 16 位,会发生什么情况。 Photoshop 会在后台静默修复问题,当您执行 SaveAs 时会修复任何标题问题。我的观点是尝试确定已知良好的 TIFF 文件是否有效。如果是这样,您可以添加一个例程(可以从 Python 中调用 ImageMagick),或者您可以找出这些文件的问题(可能它们不是真正的 TIFF),但首先您需要隔离问题。
      • @cgohlke @WombatPM 我尝试在 GIMP 中打开它,但出现 3 个错误:1)字段“DateTime”的计数不正确(27,预期为 20);标记修剪 2) 抱歉,无法处理 12 位样本的图像 3) 不支持的布局,没有 RGBA 加载器 这是什么意思,我该如何适应它?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-18
      • 1970-01-01
      • 2014-10-18
      • 2017-10-21
      相关资源
      最近更新 更多