OpenCV实现两文件夹图片逐对顺序比对 差异结果存第三文件夹
逻辑错误说明
现有伪代码存在4个核心问题:
- 嵌套双层循环的结构会生成两个文件夹所有图片的笛卡尔积比对关系:外层每读1张第一个文件夹的图片,内层就会遍历完第二个文件夹的全部图片,和按位置逐张匹配的需求完全不符
- 两个路径读取规则完全一致,均指向D盘根目录下的png文件,没有区分两个独立的待比对文件夹
- 变量命名冲突:循环内读取图片矩阵时直接覆盖了原本存储文件路径列表的
imageA、imageB变量,运行时会触发异常 - 缺失差异计算、结果存储到第三个指定文件夹的完整逻辑
修正方案
按需求调整实现逻辑:
- 分别配置两个待比对文件夹、差异结果输出文件夹的独立路径,提前创建输出文件夹避免写入报错
- 读取两个文件夹下的png路径后,统一按文件名排序,保证两个路径列表的顺序对齐(glob默认返回的文件顺序不保证和文件管理器显示顺序一致)
- 提前校验两个文件夹的图片数量是否相等,避免出现漏匹配问题
- 移除嵌套循环,通过相同索引逐对读取两个列表中同位置的图片,完成预处理、差异计算后,把结果写入指定输出文件夹
修正后代码示例
import cv2 import glob import os # 路径配置 PATH_PATTERN_A = "D:\\compare_folder_a\\*.png" # 第一个待比对图片文件夹 PATH_PATTERN_B = "D:\\compare_folder_b\\*.png" # 第二个待比对图片文件夹 SAVE_FOLDER = "D:\\diff_result\\" # 差异结果保存文件夹 # 初始化输出文件夹 os.makedirs(SAVE_FOLDER, exist_ok=True) # 读取文件路径并排序,保证匹配顺序一致 img_paths_a = sorted(glob.glob(PATH_PATTERN_A)) img_paths_b = sorted(glob.glob(PATH_PATTERN_B)) # 数量校验 if len(img_paths_a) != len(img_paths_b): raise RuntimeError(f"两个文件夹图片数量不匹配,A文件夹共{len(img_paths_a)}张,B文件夹共{len(img_paths_b)}张") # 逐张同位置比对 for i in range(len(img_paths_a)): # 读取当前位置的一对图片 img_a = cv2.imread(img_paths_a[i]) img_b = cv2.imread(img_paths_b[i]) # 灰度化预处理 gray_a = cv2.cvtColor(img_a, cv2.COLOR_BGR2GRAY) gray_b = cv2.cvtColor(img_b, cv2.COLOR_BGR2GRAY) # 差异计算逻辑,可根据实际需求替换 diff = cv2.absdiff(gray_a, gray_b) # 阈值过滤10像素值以内的微小差异,可按需调整 _, diff_mask = cv2.threshold(diff, 10, 255, cv2.THRESH_BINARY) # 保存差异结果 save_name = os.path.basename(img_paths_a[i]) cv2.imwrite(os.path.join(SAVE_FOLDER, f"diff_{save_name}"), diff_mask) print(f"已完成第{i+1}/{len(img_paths_a)}组图片比对:{save_name}")
提示:如果你的图片命名规则不是连续自然序号,可以调整
sorted函数的排序key,保证两个路径列表同索引对应的是需要匹配的图片对。
内容的提问来源于stack exchange,提问作者Arvinder Kumar
相关产品推荐
相关产品推荐

