用Python加载CCITT T.3压缩的tiff的最佳方法是什么?

2 投票
2 回答
1478 浏览
提问于 2025-04-16 01:58

我想在Python中加载一个使用CCITT T.3压缩的tiff图像,并从中获取像素矩阵。这个矩阵应该是一个逻辑矩阵。

我尝试过使用pylibtiff和PIL这两个工具,但用它们加载图像时,返回的矩阵是空的。我在很多地方看到说这两个工具支持加载CCITT格式,但却无法访问像素。

我愿意转换图像,只要能从中得到逻辑矩阵,并且能用Python代码实现。奇怪的是,如果我用画图打开我的某个图像,保存时不做任何修改,然后再用pylibtiff加载,它就能正常工作。因为画图会把它重新压缩成LZW格式。

所以我真正想问的是:有没有办法直接将CCITT格式的图像加载为矩阵,或者用Python把这些图像转换成LZW格式?

谢谢,

tylerthemiler

2 个回答

0

你可以试试用 subprocess 来运行 tiffcp,这样可以把文件转换成 LZW 格式(用 -c lzw 这个选项),然后再用 pylibtiff 正常处理。网上有一些适用于 Windows 的 tiffcp 版本。虽然这不是完全用 Python 的方法,但也可以用。

1

看起来最好的办法是完全不使用Python,而是依赖于netpbm这个工具:

import Image
import ImageFile
import subprocess

tiff = 'test.tiff'
im = Image.open(tiff)
print 'size', im.size
try:
    print 'extrema', im.getextrema()
except IOError as e:
    print 'help!', e, '\n'

print 'I Get by with a Little Help from my Friends'
pbm_proc = subprocess.Popen(['tifftopnm', tiff],
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE)
(pbm_data, pbm_error) = pbm_proc.communicate()
ifp = ImageFile.Parser()
ifp.feed(pbm_data)
im = ifp.close()
print 'conversion message', pbm_error,
print 'extrema', im.getextrema()
print 'size', im.size
# houston: we have an image
im.show()

这个方法似乎有效:

$ python g3fax.py 
size (1728, 2156)
extrema help! decoder group3 not available 

I Get by with a Little Help from my Friends
conversion message tifftopnm: writing PBM file
extrema (0, 255)
size (1728, 2156)

撰写回答