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

求助:.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 09:45:10