有没有人有办法在Python中导入每通道16位,3通道的TIFF图像?
在处理TIFF格式时,我还没有找到一种方法来保留每个通道的16位深度。我希望一些有帮助的灵魂能有一个解决方案。
以下是我到目前为止没有成功的尝试和结果的列表:
import numpy as np
import PIL.Image as Image
import libtiff
import cv2
im = Image.open('a.tif')
# IOError: cannot identify image file
tif = libtiff.TIFF.open('a.tif')
im = tif.read_image()
# im only contains one of the three channels. im.dtype is uint16 as desired.
im = []
for i in tif.iter_images():
# still only returns one channel
im = np.array(cv2.imread('a.tif'))
# im.dtype is uint8 and not uint16 as desired.
# specifying dtype as uint16 does not correct this
到目前为止,我找到的唯一解决方案是使用ImageMagick将图像转换为PNG。然后,bog标准matplotlib.pyplot.imread
读取PNG文件没有任何问题。
我遇到的另一个问题是将numpy数组保存为16位PNG文件,这到目前为止也不是很简单。
发布于 2013-08-27 00:51:52
它的功能有限,特别是在写回磁盘非RGB图像时,但Christoph Gohlke's tifffile
module读取3个通道的16位TIFF没有任何问题,我只是测试了一下:
>>> import tifffile as tiff
>>> a = tiff.imread('Untitled-1.tif')
>>> a.shape
(100L, 100L, 3L)
>>> a.dtype
dtype('uint16')
Photoshop阅读时不会抱怨我从这样做中得到的东西:
>>> tiff.imsave('new.tiff', a)
发布于 2013-08-28 16:33:22
我发现了上述两种方法的另一种替代方法。
scikit-image包还可以使用tifffile.py
和FreeImage读取16位三通道的TIFF文件,并将它们指定为要使用的插件。
虽然使用tifffile.py
阅读可能会更简单地使用@Jaime所示的方式,但我想我应该说明一下它是如何与scikit image一起使用的,以防有人想要这样做。
对于任何使用Ubuntu的人来说,FreeImage都可以通过apt
以libfreeimage3
的形式提供。
如果使用tifffile.py
插件选项,则必须将tifffile.py复制到skimage/io/_plugins目录(f.ex。在Ubuntu上,我的例子中的完整路径是/usr/local/lib/python2.7/dist-packages/skimage/io/_plugins/
)。
>>> import skimage.io
>>> im = skimage.io.imread('a.tif', plugin='tifffile')
>>> im.dtype
dtype('uint16')
>>> im.shape
(288, 384, 3)
>>> im = skimage.io.imread('a.tif', plugin='freeimage')
>>> im.dtype
dtype('uint16')
>>> im.shape
(288, 384, 3)
编写TIFF文件:
>>> skimage.io.imsave('b.tif', im, plugin='tifffile')
>>> skimage.io.imsave('c.tif', im, plugin='freeimage')
使用ImageMagick检查b.tif
和c.tif
的位深度显示,两个图像中的每个通道都是16位。
发布于 2016-09-23 23:48:44
对我来说,之前的替代方案不起作用。我已经成功地使用gdal读取了1 GB的16位图像。
您可以使用以下内容打开图像:
from osgeo import gdal
import numpy as np
ds = gdal.Open("name.tif")
channel = np.array(ds.GetRasterBand(1).ReadAsArray())
有一个supported diver列表,您可以使用它来写入数据。
https://stackoverflow.com/questions/18446804
复制相似问题