我需要一个python方法来打开TIFF图像并将其导入到numpy数组中,以便我可以分析和修改像素数据,然后再次将它们另存为TIFF。(它们基本上是灰度的光强度图,代表每个像素的相应值)
我找不到有关TIFF的PIL方法的任何文档。我试图弄清楚,但仅收到“错误模式”或“不支持的文件类型”错误。
我需要在这里使用什么?
Answers:
首先,我从此页面下载了名为的测试TIFF图像a_image.tif
。然后我像这样用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>
我使用matplotlib读取TIFF文件:
import matplotlib.pyplot as plt
I = plt.imread(tiff_file)
并将I
为类型ndarray
。
根据文档,尽管实际上是PIL在处理TIFF时在后台工作,因为matplotlib仅本地读取PNG,但这对我来说一直很好。
还有一个plt.imsave
保存功能。
ValueError: Only know how to handle extensions: ['png']; with Pillow installed matplotlib can handle more images
您也可以使用GDAL执行此操作。我意识到这是一个地理空间工具包,但没有什么要求您拥有地图产品。
链接到用于Windows的预编译GDAL二进制文件(此处假定为Windows) 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()
.astype(sometype)
通话结束时添加通话以ReadAsArray()
进行投射。不确定是否可以制作副本(只是未经测试)。
xrange
不是错字,xrange
是的python 2版本range
。我接受了此修改,因为python 3仍在积极改进,而python 2却没有。
pylibtiff对我来说比PIL更好,后者截至2020年6月不支持每种颜色超过8位的彩色图像。
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)
您可以使用安装pylibtiff
pip3 install numpy libtiff
pylibtiff的自述文件也提到了tifffile
,但是我还没有尝试过,尽管它表面上是开源的,但我认为该代码已不再可用(除了从PyPI软件包中手动提取代码之外)。
您也可以使用我是作者的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,因此您可以读取大图像的一部分。
对于图像堆栈,我发现它更易于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)