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)
关键说明
- 分组逻辑:适配Seqouia相机默认命名格式,通过拆分文件名提取组前缀和波段标识,确保同一拍摄的四个文件被正确归类,避免误报缺失波段。
- EXIF标签对应:EXIF标签306(Image DateTime)对应
piexif.ImageIFD.DateTime,读取时需将字节数据解码为字符串,写入时重新编码为字节格式。 - 错误处理:添加了文件格式校验、EXIF读写异常捕获,避免个别损坏文件导致程序中断,同时明确输出不完整组和错误信息。
内容的提问来源于stack exchange,提问作者Sky
相关产品推荐
相关产品推荐

