使用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 )
额外优化点
getDescription函数中,f.close()是多余的——with语句会自动关闭文件,可删除该行。list_files函数的返回类型标注可以改为list[str],符合Python类型提示规范。
内容的提问来源于stack exchange,提问作者nanocinho
相关产品推荐
相关产品推荐

