Python:如何在PIL和/或pygame中处理16位.tiff图像转换为8位?
大家好,
我正在开发一个程序,可以从照片中计算酵母菌落的平均大小,目前在我测试的.bmp格式图片上运行得很好。这个程序使用了pygame,未来可能还会用到PIL库。
不过,我们实验室使用的相机和软件组合只能保存16位灰度的tiff格式文件,而pygame似乎只能识别8位的tiff格式。我这几小时一直在寻找简单的解决办法,但连Python图像库(PIL)似乎也无法处理16位的.tiff文件,我尝试过,结果得到“IOError: cannot identify image file”的错误。
import Image
img = Image.open("01 WT mm.tif")
我的最终目标是让这个程序对用户友好,安装起来简单,所以我尽量避免添加额外的模块或要求大家安装像ImageMagick这样的工具。
有没有人知道用免费软件或纯Python解决这个问题的简单方法?我对图像了解不多,位深度的处理超出了我的能力范围。但我很确定我不需要所有16位的数据,实际上大约只有8位的数据是有用的。事实上,我曾经用ImageMagick尝试转换这些文件,结果得到了一张全白的图片;后来我了解到应该使用“-auto-levels”这个命令,因为数据并没有覆盖16位的范围。
非常感谢大家的帮助,也为我的知识不足表示歉意。
附言:有没有人有建议,如何让我的Python程序对非程序员来说容易安装?比如,有没有办法把它和Python、pygame打包在一起,只需要一次安装?这个方法能在Windows和Mac上都实现吗?谢谢。
编辑:我尝试在GIMP中打开这个文件,结果出现了三个错误:
1) "DateTime"字段的计数不正确(27,期望20);标签被裁剪 2) 抱歉,无法处理12位样本的图像 3) 不支持的布局,没有RGBA加载器
这是什么意思,我该如何解决?
3 个回答
我建议你看看 pylibtiff,这是一个用纯Python写的TIFF文件阅读器。
如果你想打包你的程序,最好的选择可能是py2exe和py2app。
如果你在使用Windows系统,py2exe是打包你应用程序的好方法。
关于16位tiff的问题:
这个例子 http://ubuntuforums.org/showthread.php?t=1483265 展示了如何使用PIL进行转换以便显示。
接下来是一个没有被问到的部分:在进行图像分析时,你希望在处理图像的过程中尽量保持最高的动态范围,这样可以减少信息的损失。你可能知道,PIL提供了很多滤镜和转换工具,可以帮助你增强图像的对比度、均匀光线水平,或者进行边缘检测。你可以考虑一个未来的方向,就是将原始图像(当然要缩放到8位)和经过边缘检测处理的图像并排显示。
可以查看 http://code.google.com/p/pyimp/wiki/screenshots 来获取更多示例和示例代码。