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

使用tifffile生成带独立标签的多页TIFF时图像缺失问题

问题描述

我想用若干8bit小图像生成多页TIFF文件,要求每页图像带有独立的description标签(仅标签内容不同)。目前生成的TIFF文件标签信息正确,但未包含图像内容,以下是我使用的代码:

import numpy as np
import os
import tifffile as tf
import xml.etree.ElementTree as ET
from ihb_preprocessing.settings import LOGGING_CONFIG

def getDescription(description) -> str:
    description_content: str

    with open(description, "r") as f:
        description_content = f.read()
        print(len(description_content))
    f.close()

    return description_content

def list_files(folder_path:str, type:str) -> []:

    descriptions = []

    for file in os.listdir(folder_path):
        if file.endswith(type):
            descriptions.append(os.path.join(folder_path, file))
    descriptions = sorted(descriptions)

    return descriptions


#Note that currently the only information taken from the metadata is the Size, Name from the Description and the image.


#BitsPerSample: int = 8
Compression: int = 5
PhotometricInterpretation: int = 1
#Resolution: int = [4294967295, 213274]
PlanarConfiguration: int = 1
ResolutionUnit: int = 3
Software: str = 'PerkinElmer-QPI'


folder_path = "FakeImages/"
tiff_files = [os.path.join(folder_path, filename) for filename in os.listdir(folder_path) if filename.endswith(".tif")]
tiff_files = sorted(tiff_files)

image_array = np.empty((len(tiff_files),) + tf.imread(tiff_files[0]).shape, dtype=np.uint8)

print(len(image_array.shape))
descriptions = list_files("ImageDescriptions/", ".txt")
descriptions = sorted(descriptions)
descr_tag = {}
for i in range(len(image_array)):
    descr_tag[f"description{i}"] = getDescription(descriptions[i])

with tf.TiffWriter("Fake_Images_.tiff", bigtiff=True) as writer:
    for i in range(len(image_array)):
        writer.write(data= image_array[i],
                    #bitspersample = BitsPerSample ,
                    compression = Compression,
                    photometric = PhotometricInterpretation,
                   # resolution = Resolution,
                    planarconfig = PlanarConfiguration,
                    resolutionunit = ResolutionUnit,
                    software = Software,
                    description= descr_tag[f"description{i}"])
问题原因

核心问题是你只初始化了空的image_array,但没有将实际的图像数据读入数组中。np.empty()只会创建一个未初始化的数组,里面是随机垃圾值,后续没有填充从tiff_files读取的图像数据,导致写入TIFF的是空内容。

修复方案

方案1:填充图像数据到数组

修改图像数组的初始化部分,将每个TIFF文件的内容读入数组:

# 替换原来的image_array初始化代码
image_array = np.array([tf.imread(file) for file in tiff_files], dtype=np.uint8)

方案2:写入时直接读取图像(更高效,节省内存)

不需要提前创建大数组,在写入循环中直接读取单页图像并写入,适合图像数量多的场景:

# 移除原来的image_array相关代码,直接在写入循环中处理
with tf.TiffWriter("Fake_Images_.tiff", bigtiff=True) as writer:
    for i, (tiff_file, desc_file) in enumerate(zip(tiff_files, descriptions)):
        # 读取当前页的图像
        img = tf.imread(tiff_file)
        # 读取对应描述
        desc_content = getDescription(desc_file)
        writer.write(
            data=img,
            compression=Compression,
            photometric=PhotometricInterpretation,
            planarconfig=PlanarConfiguration,
            resolutionunit=ResolutionUnit,
            software=Software,
            description=desc_content
        )

额外优化点

  1. getDescription函数中,f.close()是多余的——with语句会自动关闭文件,可删除该行。
  2. list_files函数的返回类型标注可以改为list[str],符合Python类型提示规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 19:40:52