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

Python批量修正多光谱影像EXIF DateTime标签技术求助

解决Seqouia多光谱TIF文件EXIF时间戳同步问题

前置准备

先安装处理EXIF的依赖库:

pip install piexif

完整代码实现

import os
import glob
import piexif

def group_tif_files(tif_dir):
    """将TIF文件按拍摄组分组,返回{组前缀: {波段: 文件路径}}的字典"""
    groups = {}
    # 遍历目录下所有TIF文件(兼容大小写扩展名)
    for tif_path in glob.glob(os.path.join(tif_dir, "*.TIF")) + glob.glob(os.path.join(tif_dir, "*.tif")):
        filename = os.path.basename(tif_path)
        # 按Seqouia默认命名格式拆分文件名(如"IMG_1234_GRE.TIF")
        parts = filename.split("_")
        if len(parts) < 2:
            continue  # 跳过不符合规则的文件
        band = parts[-1].split(".")[0].upper()
        if band not in ["GRE", "RED", "REG", "NIR"]:
            continue
        # 提取组前缀(去除波段标识和扩展名)
        group_prefix = "_".join(parts[:-1])
        # 加入分组字典
        if group_prefix not in groups:
            groups[group_prefix] = {}
        groups[group_prefix][band] = tif_path
    return groups

def sync_exif_datetime(tif_dir):
    groups = group_tif_files(tif_dir)
    processed_count = 0
    # 遍历每个拍摄组
    for prefix, band_files in groups.items():
        # 检查是否包含全部四个波段
        required_bands = {"GRE", "RED", "REG", "NIR"}
        missing_bands = required_bands - band_files.keys()
        if missing_bands:
            print(f"跳过不完整组 {prefix}: 缺失波段 {','.join(missing_bands)}")
            continue
        
        # 读取GRE文件的EXIF DateTime(对应标签306)
        gre_path = band_files["GRE"]
        try:
            exif_dict = piexif.load(gre_path)
            # EXIF标签306对应ImageIFD.DateTime,需解码为字符串
            target_datetime = exif_dict["0th"][piexif.ImageIFD.DateTime].decode("utf-8")
            print(f"组 {prefix} 读取GRE时间戳: {target_datetime}")
        except Exception as e:
            print(f"组 {prefix} 读取GRE EXIF失败: {str(e)}")
            continue
        
        # 将时间戳写入同组其他三个文件
        for band in ["RED", "REG", "NIR"]:
            file_path = band_files[band]
            try:
                exif_dict = piexif.load(file_path)
                # 更新ImageIFD.DateTime标签,需编码为字节
                exif_dict["0th"][piexif.ImageIFD.DateTime] = target_datetime.encode("utf-8")
                # 写入更新后的EXIF数据
                piexif.insert(piexif.dump(exif_dict), file_path)
                print(f"已更新 {file_path} 的时间戳为 {target_datetime}")
            except Exception as e:
                print(f"更新 {file_path} 失败: {str(e)}")
        processed_count += 1
    print(f"\n处理完成,共处理 {processed_count} 个完整组")

if __name__ == "__main__":
    # 替换为你的TIF文件所在目录
    TIF_DIRECTORY = "./your_tif_folder"
    sync_exif_datetime(TIF_DIRECTORY)

关键说明

  1. 分组逻辑:适配Seqouia相机默认命名格式,通过拆分文件名提取组前缀和波段标识,确保同一拍摄的四个文件被正确归类,避免误报缺失波段。
  2. EXIF标签对应:EXIF标签306(Image DateTime)对应piexif.ImageIFD.DateTime,读取时需将字节数据解码为字符串,写入时重新编码为字节格式。
  3. 错误处理:添加了文件格式校验、EXIF读写异常捕获,避免个别损坏文件导致程序中断,同时明确输出不完整组和错误信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:15:02