Python:在PIL和/或pygame中操作16位.tiff图像:如何转换为8位?

4

enter image description here大家好,

我正在开发一个程序,用于从照片中确定酵母的平均菌落大小,该程序在我测试的 .bmp 图像上运行良好。该程序使用 pygame,并可能稍后使用 PIL。

然而,我们实验室使用的相机/软件组合只能保存 16 位灰度 tiff 文件,而 pygame 似乎无法识别 16 位 tiff 文件,只能识别 8 位。我已经花了几个小时阅读易于解决此问题的方法,但即使 Python Imaging Library 也似乎无法处理 16 位 .tiff 文件,我尝试过并且会出现 "IOError: cannot identify image file" 错误。

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加载器
这是什么意思,我该怎么做?

2
你使用的是哪个版本的PIL?自1.1.4版本以来,PIL应该支持16位灰度图像。 - Gabe
个人而言,我会看一下SciPy,使用scipy.misc.imread()和标记数组函数,这似乎非常适合你正在做的事情。 - Benjamin
我一直在使用PIL 1.1.7版本,所以也许不是位深度的问题?我陷入了困境!相机软件可能对.tif文件还进行了其他奇怪的格式化吗? - Ain Britain
1
另外需要注意的是,您可能想看一下CellProfiler。它有一个用于菌落计数的示例管道,并且可以处理多种格式的16位图像。 - user227667
抱歉,问题有点傻:我能在这个网站上上传我的示例图片吗?看起来stackoverflow已经将它转换成了png格式。 - Ain Britain
因此,我们可以得出结论,您的图像存在问题。 1)查找相机的手册或文档。 科学设备通常具有详细规格说明。 2)确定正在生成的输出以及是否有任何选项,或者3)尝试其他工具,如Photoshop,Imagemagick等。 这就是为什么科学研究很难 - 实验可能很简单,而数据分析却很麻烦。 在这一点上,您应该接受thouis的答案,并提出一个关于您的图像格式的新问题。 这不再是一个Python问题。 - WombatPM
3个回答

2
我��议您使用纯Python的tiff阅读器pylibtiff
对于打包,您最好使用py2exe和py2app。

2

如果您使用的是Windows系统,那么py2exe就是打包应用程序的最佳选择。

关于16位TIFF问题:

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

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

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


我甚至无法使用Image.open()打开这些tiff文件,它会给我一个"IOError: cannot identify image file"的错误,所以第一个链接中的示例不起作用。我知道这些文件没问题,因为它们可以在Photoshop中打开。除了位深度之外,可能还有其他原因吗? - Ain Britain
如果你在Photoshop中打开并另存为TIFF格式,它能正常工作吗?这可能是一个文件头问题或原始数据与压缩数据的区别。 - WombatPM
我可以使用Photoshop打开它们并进行转换;我一直在使用我制作的.bmp文件测试我的代码。根据右键单击并查看“属性”,原始文件中没有压缩。我不知道文件头是什么或如何查看它,我该如何查看是否有异常? - Ain Britain
但是你正在更改格式。如果你打开其中一张图片,并将其另存为一个新名称,但保持文件类型为TIFF和数据为16位,会发生什么?Photoshop会在后台默默地修复问题,当你进行SaveAs时,会修复任何头文件问题。我的观点是尝试确定一个已知的好的TIFF文件是否有效。如果是这样,你可以添加一个例程(ImageMagick可以从Python中调用),或者你可以找出这些文件有什么问题(也许它们并不是真正的TIFF文件),但首先你需要隔离问题。 - WombatPM
我尝试在GIMP中打开它,但出现了3个错误: 1)字段“DateTime”的计数不正确(27,期望20);标签被修剪 2)抱歉,无法处理具有12位样本的图像 3)不支持的布局,没有RGBA加载器这是什么意思,我该怎么解决? - Ain Britain

1

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

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

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


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