如何用Python打开多页TIFF文件并保存为数组?解决读取不全问题
解决方案:读取多页TIF文件并存储为数组/列表
方法一:使用OpenCV(cv2)
cv2.imread仅支持读取单页图像,要读取多页TIF需使用cv2.imreadmulti函数,它能一次性读取所有页面并存储为列表或数组:
import cv2 import numpy as np # 读取多页TIF,保留原始图像格式 ret, pages = cv2.imreadmulti('sen_15Hz_500Hz_6_6A.tif', flags=cv2.IMREAD_UNCHANGED) if ret: print(f"读取到{len(pages)}页图像") # 若所有页面尺寸一致,可转换为三维numpy数组 tif_array = np.array(pages) print(f"数组形状:{tif_array.shape}") # 格式为 (页数, 高度, 宽度[, 通道数]) else: print("文件读取失败")
方法二:使用PIL/Pillow
通过Pillow打开多页TIF后,循环调用seek()切换页面,将每页图像转为numpy数组存入列表:
from PIL import Image import numpy as np tif = Image.open('sen_15Hz_500Hz_6_6A.tif') pages = [] try: while True: # 将当前页转为numpy数组并添加到列表 pages.append(np.array(tif)) # 跳转到下一页 tif.seek(tif.tell() + 1) except EOFError: # 无更多页面时触发EOFError,结束循环 pass print(f"读取到{len(pages)}页图像") # 尺寸一致时可转为三维数组 tif_array = np.array(pages) print(f"数组形状:{tif_array.shape}")
方法三:使用tifffile库(专业TIF处理推荐)
tifffile库对多页、大尺寸TIF支持更友好,需先安装:pip install tifffile
import tifffile # 直接读取所有页面为numpy数组 tif_array = tifffile.imread('sen_15Hz_500Hz_6_6A.tif') print(f"读取到{tif_array.shape[0]}页图像") print(f"数组形状:{tif_array.shape}") # 如需列表格式,直接转换即可 pages_list = list(tif_array)
注意事项
- 若所有页面尺寸、通道数不一致,转换为三维numpy数组会失败,建议保留列表格式存储。
- 你之前用
cv2.imread得到的3维数组,大概率是把单页彩色图像的RGB通道当成了多页,多页TIF的正确维度应为(页数, 高度, 宽度)或(页数, 高度, 宽度, 通道数)。
内容的提问来源于stack exchange,提问作者Diego Gonzalez
相关产品推荐
相关产品推荐

