Python和16位Ti

2024-05-13 10:44:31 发布

您现在位置:Python中文网/ 问答频道 /正文

如何在Python中转换和保存16位单通道TIF?

我可以毫无问题地加载16位和32位图像,并看到32位图像是模式F,而16位图像是模式I;16S

import Image
i32 = Image.open('32.tif')
i16 = Image.open('16.tif')
i32
# <TiffImagePlugin.TiffImageFile image mode=F size=2000x1600 at 0x1098E5518>
i16
# <TiffImagePlugin.TiffImageFile image mode=I;16S size=2000x1600 at 0x1098B6DD0>

但我在处理16位图像时遇到了问题。如果要将其中一个保存为PNG,则不能直接执行以下操作:

i32.save('foo.png')
# IOError: cannot write mode F as PNG
i16.save('foo.png')
# ValueError: unrecognized mode

如果我转换32位图像,我可以保存它:

i32.convert('L').save('foo.png')

但同一命令对16位图像不起作用:

i16.convert('L').save('foo.png')
# ValueError: unrecognized mode

Tags: 图像imagesizefoopngmodesave模式
3条回答

对于从16位灰度TIFF到PNG的无损转换,请使用PythonMagick

from PythonMagick import Image
Image('pinei_2002300_1525_modis_ch02.tif').write("foo.png")

你似乎遇到了一个PIL bug,或者一个没有实现的角落案例。

以下是解决方法:

i16.mode = 'I'
i16.point(lambda i:i*(1./256)).convert('L').save('foo.png')

无意中发现这个线程试图用PIL/numpy保存16位TIFF图像。

版本:python 2.7.1-numpy 1.6.1-pil1.1.7

这是我写的一个快速测试。uint16 numpy数组->;转换为字符串->;转换为类型为“I;16”的PIL图像->;另存为16位TIFF。

在ImageJ中打开图像显示右水平渐变图案,图像类型为“每像素位数:16(无符号)”

import Image
import numpy

data = numpy.zeros((1024,1024),numpy.uint16)

h,w = data.shape

for i in range(h):
    data[i,:] = numpy.arange(w)

im = Image.fromstring('I;16',(w,h),data.tostring())
im.save('test_16bit.tif')

编辑:从1.1.7开始,PIL不支持写入压缩文件,但pylibtiff支持(lzw压缩)。因此,测试代码变为(使用pylibtiff 0.3测试):

import Image
import numpy
from libtiff import TIFFimage

data = numpy.zeros((1024,1024),numpy.uint16)

h,w = data.shape

for i in range(w):
    data[:,i] = numpy.arange(h)

tiff = TIFFimage(data, description='')
tiff.write_file('test_16bit.tif', compression='lzw')
#flush the file to disk:
del tiff

请注意:测试代码已更改为生成垂直渐变,否则无法实现压缩(请参阅警告:pylibtiff当前支持读取和写入使用TIFF条存储的图像)。

相关问题 更多 >