使用 numpy 在 Python 中处理 TIFF(导入、导出)

2025-03-18 08:55:00
admin
原创
44
摘要:问题描述:我需要一种 Python 方法来打开 TIFF 图像并将其导入 numpy 数组,以便我可以分析和修改像素数据,然后再次将它们保存为 TIFF。(它们基本上是灰度光强度图,代表每个像素的相应值)我找不到任何有关 TIFF 的 PIL 方法文档。我尝试解决它,但只收到“错误模式”或“文件类型不受支持”...

问题描述:

我需要一种 Python 方法来打开 TIFF 图像并将其导入 numpy 数组,以便我可以分析和修改像素数据,然后再次将它们保存为 TIFF。(它们基本上是灰度光强度图,代表每个像素的相应值)

我找不到任何有关 TIFF 的 PIL 方法文档。我尝试解决它,但只收到“错误模式”或“文件类型不受支持”错误。

我这里需要用什么?


解决方案 1:

首先,我从这个名为的页面下载了一个测试 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>

解决方案 2:

我使用 matplotlib 读取 TIFF 文件:

import matplotlib.pyplot as plt
I = plt.imread(tiff_file)

并且I将是 类型ndarray

虽然根据文档,在处理 TIFF 时实际上是 PIL 在后台工作,因为 matplotlib 只能本机读取 PNG,但这对我来说工作正常。

还有plt.imsave保存功能。

解决方案 3:

对我来说, PyLibTiff比 PIL 效果更好,截至 2023 年 4 月,PIL仍然不支持每种颜色超过 8 位的彩色图像。

from libtiff import TIFF

tif = TIFF.open('filename.tif') # open tiff file in read mode
# read an image in the current 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 pylibtiff

PyLibTiff 的自述文件也提到了该tifffile库,但我还没有尝试过。

解决方案 4:

您也可以使用 GDAL 来执行此操作。我知道它是一个地理空间工具包,但不需要您拥有制图产品。

链接到 Windows 的预编译 GDAL 二进制文件(此处假设为 Windows)
链接

访问数组:

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()

解决方案 5:

对于图像堆栈,我发现它更易于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(img,cmap='gray')
plt.axis('off')
# save the image
plt.savefig('output.tif', transparent=True, dpi=300, bbox_inches="tight", pad_inches=0.0)

解决方案 6:

有一个很好的软件包,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)

您可以在此处阅读有关此包的更多信息。

解决方案 7:

您还可以使用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,因此您可以读取大图像的部分内容。

解决方案 8:

使用 cv2

import cv2
image = cv2.imread(tiff_file.tif)
cv2.imshow('tif image',image)

解决方案 9:

如果你想用 保存 tiff 编码geoTiff。你可以使用rasterio

一个简单的代码:

import rasterio

out = np.random.randint(low=10, high=20, size=(360, 720)).astype('float64')
new_dataset = rasterio.open('test.tiff', 'w', driver='GTiff',
                            height=out.shape[0], width=out.shape[1],
                            count=1, dtype=str(out.dtype),
                            )
new_dataset.write(out, 1)
new_dataset.close()

有关 numpy 2 GEOTiff 的更多详细信息,您可以单击此处:https://gis.stackexchange.com/questions/279953/numpy-array-to-gtiff-using-rasterio-without-source-raster

解决方案 10:

我建议使用 OpenImageIO 的 Python 绑定,它是处理视觉特效世界中各种图像格式的标准。我发现与 PIL 相比,它在读取各种压缩类型方面更可靠。

import OpenImageIO as oiio
input = oiio.ImageInput.open ("/path/to/image.tif")

解决方案 11:

读取 tiff 文件的另一种方法是使用 tensorflow api

import tensorflow_io as tfio
image = tf.io.read_file(image_path)
tf_image = tfio.experimental.image.decode_tiff(image)
print(tf_image.shape)

输出:

(512, 512, 4)

tensorflow 文档可以在这里找到

为了使该模块正常工作,必须安装一个名为 tensorflow-io 的python 包。

虽然我找不到查看输出张量的方法(转换为 nd.array 后),因为输出图像有 4 个通道。在查看此帖子cv2.cvtcolor()后,我尝试使用标志进行转换,但仍然无法查看图像。cv2.COLOR_BGRA2BGR

解决方案 12:

这个问题没有答案,对我来说没有用。所以我找到了另一种查看 tif/tiff 文件的方法:

import rasterio
from matplotlib import pyplot as plt
src = rasterio.open("ch4.tif")
plt.imshow(src.read(1), cmap='gray')

上述代码将帮助您查看 tif 文件。还请检查以下内容以确保:

type(src.read(1)) #see that src.read(1) is a numpy array

src.read(1) #prints the matrix
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用