You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中tiff.imread()读取TIFF堆叠遇Errno22无效参数问题

问题描述

我有一个包含约800张TIFF图片的文件夹,编写了代码将其保存为每组220张的多个TIFF堆叠文件。但后续用tiff.imread()读取这些堆叠文件时,偶尔会出现Errno 22: Invalid Argument错误,代码时好时坏。

导入函数代码

import numpy as np
import scipy as sp
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd
import sys
import tifffile as tiff
from skimage import io
import cv2
import tifftools
from tifffile import imread, imsave
from tifffile import TiffWriter, memmap

生成TIFF堆叠的代码

image_stack =[]

tiff_files = math.ceil(len(list_of_images)/220)  ## each tiff file to be 220 images long
print(tiff_files)

if tiff_files >1:
    for i in range(tiff_files-1):
        print(i)
        
        image_stack =[]
        for j in range(220):
            print(j)
            image_r = imread(wrk_dir + list_of_images[j+i*220])
            image_stack.append(image_r)
        tiff.imwrite(output_dir + str(i)+'.tif', image_stack)
        print(i,'done')
    
    image_stack =[]
    for j in range(len(list_of_images)-220*(tiff_files-1)):
        print(j)
        image_r = imread(wrk_dir + list_of_images[j+(tiff_files-1)*220])
        image_stack.append(image_r)
    tiff.imwrite(output_dir + str(tiff_files-1)+'.tif', image_stack)
    print(tiff_files-1,'done')
    
else:
    image_stack =[]
    for j in range(len(list_of_images)):
        print(j)
        image_r = imread(wrk_dir+ list_of_images[j])
        image_stack.append(image_r)
    tiff.imwrite(output_dir + str(tiff_files-1)+'.tif', image_stack)
    print(tiff_files-1,'done')

读取TIFF堆叠时报错的代码片段

for i in range(tiff_files):
    print(i)
    # read all images matching the pattern
    image_stack = tiff.imread(output_dir+str(i)+'.tif')

解决方案

1. 规范TIFF写入流程,避免文件损坏

原代码直接用列表写入,可能存在数组维度不一致、文件未正确关闭导致的损坏问题。改为将列表转为numpy数组,并使用TiffWriter上下文管理器确保文件正确写入:

import math
import numpy as np
import tifffile as tiff
from tifffile import imread

tiff_files = math.ceil(len(list_of_images)/220)
print(tiff_files)

if tiff_files > 1:
    for i in range(tiff_files-1):
        print(f"处理批次 {i}")
        image_stack = []
        for j in range(220):
            img_path = wrk_dir + list_of_images[j + i*220]
            image_r = imread(img_path)
            image_stack.append(image_r)
        # 转换为numpy数组,确保所有图像维度一致
        stack_array = np.array(image_stack)
        # 上下文管理器自动处理文件关闭
        with tiff.TiffWriter(output_dir + f"{i}.tif") as tif:
            tif.write(stack_array)
        print(f"批次 {i} 完成")
    
    # 处理最后一批剩余图像
    remaining_count = len(list_of_images) - 220*(tiff_files-1)
    image_stack = []
    for j in range(remaining_count):
        img_path = wrk_dir + list_of_images[j + (tiff_files-1)*220]
        image_r = imread(img_path)
        image_stack.append(image_r)
    stack_array = np.array(image_stack)
    with tiff.TiffWriter(output_dir + f"{tiff_files-1}.tif") as tif:
        tif.write(stack_array)
    print(f"批次 {tiff_files-1} 完成")
else:
    image_stack = []
    for j in range(len(list_of_images)):
        img_path = wrk_dir + list_of_images[j]
        image_r = imread(img_path)
        image_stack.append(image_r)
    stack_array = np.array(image_stack)
    with tiff.TiffWriter(output_dir + f"{tiff_files-1}.tif") as tif:
        tif.write(stack_array)
    print(f"批次 {tiff_files-1} 完成")

2. 增加读取重试机制,处理偶发IO错误

读取时的偶发错误可能是系统IO波动导致,增加重试逻辑避免单次报错中断流程:

import tifffile as tiff
import time

tiff_files = math.ceil(len(list_of_images)/220)

for i in range(tiff_files):
    print(f"读取批次 {i}")
    file_path = output_dir + f"{i}.tif"
    max_retries = 3
    for attempt in range(max_retries):
        try:
            image_stack = tiff.imread(file_path)
            break
        except OSError as e:
            if attempt < max_retries -1:
                print(f"读取失败,重试第{attempt+2}次...")
                time.sleep(1)
            else:
                print(f"读取{file_path}失败,错误:{e}")
                raise  # 或选择跳过该文件
    # 后续处理image_stack

3. 写入后验证文件完整性

在每个批次写入后立即验证文件是否可读,提前发现损坏的文件:

# 写入完成后添加验证步骤
with tiff.TiffWriter(output_dir + f"{i}.tif") as tif:
    tif.write(stack_array)
# 验证文件
try:
    test_read = tiff.imread(output_dir + f"{i}.tif")
    print(f"批次 {i} 写入验证成功,共{test_read.shape[0]}张图")
except Exception as e:
    print(f"批次 {i} 写入后验证失败:{e}")

4. 检查文件路径合法性

确保output_dir和文件名不包含特殊字符、空格或非ASCII字符,这类问题也可能导致偶发的IO错误。


内容的提问来源于stack exchange,提问作者Shagun Maheshwari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 18:20:27