首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python:读写TIFF 16位、三通道、彩色图像

Python:读写TIFF 16位、三通道、彩色图像
EN

Stack Overflow用户
提问于 2013-08-26 22:41:50
回答 5查看 96.6K关注 0票数 29

有没有人有办法在Python中导入每通道16位,3通道的TIFF图像?

在处理TIFF格式时,我还没有找到一种方法来保留每个通道的16位深度。我希望一些有帮助的灵魂能有一个解决方案。

以下是我到目前为止没有成功的尝试和结果的列表:

代码语言:javascript
复制
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文件,这到目前为止也不是很简单。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-08-27 00:51:52

它的功能有限,特别是在写回磁盘非RGB图像时,但Christoph Gohlke's tifffile module读取3个通道的16位TIFF没有任何问题,我只是测试了一下:

代码语言:javascript
复制
>>> import tifffile as tiff
>>> a = tiff.imread('Untitled-1.tif')
>>> a.shape
(100L, 100L, 3L)
>>> a.dtype
dtype('uint16')

Photoshop阅读时不会抱怨我从这样做中得到的东西:

代码语言:javascript
复制
>>> tiff.imsave('new.tiff', a)
票数 33
EN

Stack Overflow用户

发布于 2013-08-28 16:33:22

我发现了上述两种方法的另一种替代方法。

scikit-image包还可以使用tifffile.py和FreeImage读取16位三通道的TIFF文件,并将它们指定为要使用的插件。

虽然使用tifffile.py阅读可能会更简单地使用@Jaime所示的方式,但我想我应该说明一下它是如何与scikit image一起使用的,以防有人想要这样做。

对于任何使用Ubuntu的人来说,FreeImage都可以通过aptlibfreeimage3的形式提供。

如果使用tifffile.py插件选项,则必须将tifffile.py复制到skimage/io/_plugins目录(f.ex。在Ubuntu上,我的例子中的完整路径是/usr/local/lib/python2.7/dist-packages/skimage/io/_plugins/)。

代码语言:javascript
复制
>>> 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文件:

代码语言:javascript
复制
>>> skimage.io.imsave('b.tif', im, plugin='tifffile')
>>> skimage.io.imsave('c.tif', im, plugin='freeimage')

使用ImageMagick检查b.tifc.tif的位深度显示,两个图像中的每个通道都是16位。

票数 11
EN

Stack Overflow用户

发布于 2016-09-23 23:48:44

对我来说,之前的替代方案不起作用。我已经成功地使用gdal读取了1 GB的16位图像。

您可以使用以下内容打开图像:

代码语言:javascript
复制
from osgeo import gdal
import numpy as np
ds = gdal.Open("name.tif")
channel = np.array(ds.GetRasterBand(1).ReadAsArray())

有一个supported diver列表,您可以使用它来写入数据。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18446804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档