Python和16位Tiff

Python和16位Tiff,python,tiff,16-bit,Python,Tiff,16 Bit,如何在Python中转换和保存16位单通道TIF 我可以毫无问题地加载16位和32位图像,并且可以看到32位图像是modeF,16位图像是modeI;16S: import Image i32 = Image.open('32.tif') i16 = Image.open('16.tif') i32 # <TiffImagePlugin.TiffImageFile image mode=F size=2000x1600 at 0x1098E5518> i16 # <TiffIm

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

我可以毫无问题地加载16位和32位图像,并且可以看到32位图像是mode
F
,16位图像是mode
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>
如果我转换32位图像,我可以保存它:

i32.convert('L').save('foo.png')
但同样的命令不适用于16位图像:

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

您似乎遇到了一个PIL错误,或者是一个尚未实现的角落案例

这里有一个解决方法:

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

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


无意中发现此线程试图使用PIL/numpy保存16位TIFF图像

版本:python 2.7.1-numpy 1.6.1-PIL 1.1.7

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

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

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


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

使用PIL 4.1将ImageJ TIFF转换为JPEG+

im = numpy.array(Image.open('my.tiff'))
image = Image.fromarray(im / numpy.amax(im) * 255)
image.save('my.jpg')

Pil应该有支持:“(1.1.4a2发布)改进了对16位无符号整数图像的支持(模式“I;16”)。这包括TIFF读取器支持,以及对“getextrema”和“point”的支持(来自Klamer Shutte)。“您能提供一个示例文件吗?好的。我正在使用PIL1.1.7,所以支持就在那里。编辑了这个问题。问题不是PIL,但我仍然不知道我做错了什么…我仍然希望看到一个示例文件。这是一个示例文件:和32位:我得到:
ValueError:unknown raw mode
@mankoff:对不起,我一定是用了两种不同的方法尝试了它并复制了错误的一种。我编辑了
mode='I;16'
mode='I'
,现在试试。这似乎有效。数据丢失了吗?我认为(?)I模式是8位的。@mankoff,如果没有其他东西,到L模式的转换将被截断为8位。如果要查看原始数据,请在模式设置为
'I'
后尝试
getpixel
load
。这怎么可能是无损的?从每像素16位变为8位。PNG格式支持每通道16位灰度(1通道)。我已经使用PNG很多年了,从来都不知道它支持每通道16位。回到RFC2083,我可以看到从一开始就是这样。谢谢你今天教我一些东西!很好的解决方案,但是PythonMagick没有包含在许多默认安装(EPD、sage)中,这使得代码的可移植性降低。
from PythonMagick import Image
Image('pinei_2002300_1525_modis_ch02.tif').write("foo.png")
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')
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
im = numpy.array(Image.open('my.tiff'))
image = Image.fromarray(im / numpy.amax(im) * 255)
image.save('my.jpg')