我需要一个python例程,可以打开并将TIFF图像导入到numpy数组中,这样我就可以分析和修改包含的数据,然后再将它们保存为TIFF。 (它们基本上是灰度的光强度图,表示每个像素的相应值)
我试图找到一些东西,但没有关于TIFF的PIL方法的文档。我试图搞清楚,但只有错误的模式/文件类型不支持错误。
我需要在这里使用什么?
答案 0 :(得分:76)
首先,我从名为a_image.tif
的{{3}}下载了测试TIFF图像。然后我用PIL开了这样的话:
>>> from PIL import Image
>>> im = Image.open('a_image.tif')
>>> im.show()
这显示了彩虹图像。要转换为numpy数组,它就像:
一样简单>>> import numpy
>>> imarray = numpy.array(im)
我们可以看到图像的大小和数组的形状匹配:
>>> imarray.shape
(44, 330)
>>> im.size
(330, 44)
数组包含uint8
个值:
>>> imarray
array([[ 0, 1, 2, ..., 244, 245, 246],
[ 0, 1, 2, ..., 244, 245, 246],
[ 0, 1, 2, ..., 244, 245, 246],
...,
[ 0, 1, 2, ..., 244, 245, 246],
[ 0, 1, 2, ..., 244, 245, 246],
[ 0, 1, 2, ..., 244, 245, 246]], dtype=uint8)
修改完阵列后,可以将其重新转换为PIL图像,如下所示:
>>> Image.fromarray(imarray)
<Image.Image image mode=L size=330x44 at 0x2786518>
答案 1 :(得分:44)
我使用matplotlib读取TIFF文件:
import matplotlib.pyplot as plt
I = plt.imread(tiff_file)
和I
的类型为ndarray
。
根据文档虽然实际上PIL在处理TIFF时在幕后工作,因为matplotlib本身只能读取PNG,但这对我来说一直很好。
还有plt.imsave
保存功能。
答案 2 :(得分:13)
您也可以使用GDAL执行此操作。我意识到它是一个地理空间工具包,但没有任何东西需要你有一个制图产品。
链接到Windows的预编译GDAL二进制文件(假设这里有窗口) http://www.gisinternals.com/sdk/
访问数组:
from osgeo import gdal
dataset = gdal.Open("path/to/dataset.tiff", gdal.GA_ReadOnly)
for x in range(1, dataset.RasterCount + 1):
band = dataset.GetRasterBand(x)
array = band.ReadAsArray()
答案 3 :(得分:5)
pylibtiff比PIL({3}}更适合我。
from libtiff import TIFF
tif = TIFF.open('filename.tif') # open tiff file in read mode
# read an image in the currect TIFF directory as a numpy array
image = tif.read_image()
# read all images in a TIFF file:
for image in tif.iter_images():
pass
tif = TIFF.open('filename.tif', mode='w')
tif.write_image(image)
您可以使用
安装pylibtiffpip3 install numpy libtiff
pylibtiff的自述文件也提到doesn't support color images with more than 8 bits per color,但我还没有尝试过。
答案 4 :(得分:4)
您也可以使用我作为作者的pytiff。
import pytiff
with pytiff.Tiff("filename.tif") as handle:
part = handle[100:200, 200:400]
# multipage tif
with pytiff.Tiff("multipage.tif") as handle:
for page in handle:
part = page[100:200, 200:400]
这是一个相当小的模块,可能没有其他模块那么多的功能,但它支持平铺的tiff和bigtiff,因此你可以读取部分大图像。
答案 5 :(得分:2)
对于图像堆栈,我发现更容易使用scikit-image
进行读取,而更容易使用matplotlib
进行显示或保存。我已经使用以下代码处理了16位TIFF图像堆栈。
from skimage import io
import matplotlib.pyplot as plt
# read the image stack
img = io.imread('a_image.tif')
# show the image
plt.imshow(mol,cmap='gray')
plt.axis('off')
# save the image
plt.savefig('output.tif', transparent=True, dpi=300, bbox_inches="tight", pad_inches=0.0)
答案 6 :(得分:2)
有一个名为 tifffile
的好包,它使处理 .tif 或 .tiff 文件变得非常容易。
使用 pip 安装包
pip install tifffile
现在,以 numpy 数组格式读取 .tif/.tiff 文件:
from tifffile import tifffile
image = tifffile.imread('path/to/your/image')
# type(image) = numpy.ndarray
如果要将 numpy 数组保存为 .tif/.tiff 文件:
tifffile.imwrite('my_image.tif', my_numpy_data, photometric='rgb')
或
tifffile.imsave('my_image.tif', my_numpy_data)
您可以阅读有关此包 here 的更多信息。
答案 7 :(得分:0)
我建议使用与OpenImageIO的python绑定,这是处理vfx世界中各种图像格式的标准。我发现ovten与PIL相比,在读取各种压缩类型方面更可靠。
import OpenImageIO as oiio
input = oiio.ImageInput.open ("/path/to/image.tif")
答案 8 :(得分:0)
import cv2
image = cv2.imread(tiff_file.tif)
cv2.imshow('tif image',image)