求助:.ome.tif格式转换报错及图像拼接解决方案
解决OME-TIFF图像拼接与格式转换问题
一、修复格式转换错误(JPEG保存失败)
报错OSError: cannot write mode I;16 as JPEG的核心原因是JPEG不支持16位灰度图像模式(I;16),你的显微镜输出的是16位深度图像,直接存JPEG会失败。给你两个可行方案:
1. 转8位后存JPEG(适合允许降低位深的场景)
如果分析不需要保留16位精度,先把图像转成8位模式再保存:
from PIL import Image import glob for name in glob.glob("*ome.tif"): im = Image.open(name) # 将16位灰度转8位,自动缩放像素值范围 im_8bit = im.convert("L") new_name = name.replace(".ome.tif", ".jpg") im_8bit.save(new_name)
2. 直接存普通TIFF(保留原始16位深度)
要保留图像完整信息的话,直接转成普通TIFF更稳妥,无需转换图像模式:
from PIL import Image import glob for name in glob.glob("*ome.tif"): im = Image.open(name) new_name = name.replace(".ome.tif", ".tif") # 直接保存为TIFF,保留原始位深 im.save(new_name, format="TIFF")
二、直接拼接OME-TIFF(不用转格式更高效)
没必要先转格式,用专门支持OME-TIFF的库直接读取拼接就行,推荐用tifffile(专业处理TIFF/OME-TIFF的工具):
步骤1:安装依赖
pip install tifffile numpy
步骤2:读取并拼接OME-TIFF堆栈
假设你的4张图像对应5个Z位置,按顺序拼接成完整Z堆栈的代码示例:
import tifffile as tiff import glob import numpy as np # 按顺序获取所有OME-TIFF文件,确保拼接顺序正确 ome_files = sorted(glob.glob("*ome.tif")) # 读取所有图像堆栈 stacks = [] for file in ome_files: # 读取OME-TIFF里的所有Z层 stack = tiff.imread(file) stacks.append(stack) # 沿Z轴拼接所有堆栈,可根据需求调整axis参数 full_stack = np.concatenate(stacks, axis=0) # 保存为新的OME-TIFF或普通TIFF tiff.imwrite("full_stitched_stack.ome.tif", full_stack, imagej=True) # 要存普通TIFF的话用下面这句 # tiff.imwrite("full_stitched_stack.tif", full_stack)
补充:必须用imgstitch的处理方式
如果一定要用imgstitch包,先通过tifffile读取OME-TIFF,转成PIL图像列表再传入:
import tifffile as tiff import glob from PIL import Image ome_files = sorted(glob.glob("*ome.tif")) image_list = [] for file in ome_files: stack = tiff.imread(file) # 遍历每个Z层,转成PIL图像 for z_slice in stack: img = Image.fromarray(z_slice) image_list.append(img) # 调用imgstitch的拼接函数,根据实际参数调整 stitch_images_and_save(new_directory, image_list, 1, new_directory)
三、优化你现有代码的逻辑错误
你原来的代码里有个bug:最后筛选的是.tif文件,但前面转的是.jpg,导致newlist为空。如果要继续用现有流程,修正后的代码如下:
import os import shutil from PIL import Image import glob old_directory = "./" # 替换成你的旧目录路径 new_directory = "./stitched_dir" # 替换成你的新目录路径 os.makedirs(new_directory, exist_ok=True) # 把OME-TIFF转成普通TIFF for name in glob.glob(os.path.join(old_directory, "*ome.tif")): im = Image.open(name) base_name = os.path.basename(name).replace(".ome.tif", ".tif") im.save(os.path.join(old_directory, base_name), format="TIFF") keyword = 'Red_' # 复制目标TIFF文件到新目录 for filename in os.listdir(old_directory): if keyword in filename and filename.endswith(".tif"): source = os.path.join(old_directory, filename) destination = os.path.join(new_directory, filename) shutil.copyfile(source, destination) # 筛选新目录里的TIFF文件 file_dir = os.listdir(new_directory) newlist = [names for names in file_dir if names.endswith(".tif")] # 执行拼接 stitch_images_and_save(new_directory, newlist, 1, new_directory)
内容的提问来源于stack exchange,提问作者AndSS
相关产品推荐
相关产品推荐

