如何使用Python和OpenCV将多张图片叠加到指定原图并保存输出
问题排查与修复代码
现有代码的问题点
- 路径转义错误:Windows路径中的反斜杠
\为转义字符,直接书写会导致路径识别异常 - 前景图尺寸未统一:仅对底图做了1024*1024的resize操作,待叠加的光晕图尺寸未同步调整,数组维度不同会导致相加失败
- 像素值溢出风险:直接对图像数组做算术相加,像素值超过255后会发生溢出,导致输出图像颜色异常
- 输出路径拼接错误:输出路径未加文件夹分隔符,会导致文件名直接拼接在路径字符串末尾,无法正确存入目标文件夹
- 冗余操作:循环内部重复读取底图文件夹的文件列表,无意义增加IO开销
修正后代码
import cv2 from os import listdir, makedirs from os.path import isfile, join, exists import numpy as np path_wf = 'wf_flare' path_fr = 'captured_flare' # 输出文件夹路径,用原始字符串避免转义问题 output_path = r'C:\Flare\flare_img' # 自动创建输出文件夹(如果不存在) if not exists(output_path): makedirs(output_path) # 读取两个文件夹的有效文件列表 files_wf = [f for f in listdir(path_wf) if isfile(join(path_wf, f))] files_fr = [fl for fl in listdir(path_fr) if isfile(join(path_fr, fl))] k = 0 target_size = (1024, 1024) for n in range(len(files_wf)): # 读取两张图 img_wf = cv2.imread(join(path_wf, files_wf[n])) img_fr = cv2.imread(join(path_fr, files_fr[k])) print(f"已读取第{n}组图片") # 统一两张图的尺寸 img_wf = cv2.resize(img_wf, target_size, interpolation=cv2.INTER_AREA) img_fr = cv2.resize(img_fr, target_size, interpolation=cv2.INTER_AREA) # 用OpenCV官方加权融合API,自动处理像素截断,避免溢出 # 参数:图1,权重1,图2,权重2,gamma偏移值 merged_img = cv2.addWeighted(img_fr, 0.4, img_wf, 1.0, 0) # 拼接输出路径 output_file = join(output_path, files_wf[n]) print(f'正在生成:{output_file} 序号:{n+10991}') cv2.imwrite(output_file, merged_img) # 循环复用光晕图 k += 1 if k % 255 == 0: k = 0
内容的提问来源于stack exchange,提问作者Aryan Philip
相关产品推荐
相关产品推荐

