如何使用OpenCV计算小图像存在于大图像中的匹配概率百分比
需求可行性结论
完全可以通过OpenCV实现,你当前采用的归一化模板匹配方案本身就支持计算匹配概率百分比。
百分比计算规则
你选用的cv2.TM_SQDIFF_NORMED是归一化平方差匹配算法,输出的匹配结果取值范围固定在0~1之间:
- 结果值为0时代表两块区域完全一致
- 结果值为1时代表两块区域完全不匹配
对应的匹配概率百分比计算公式为:(1 - 最小匹配值mn) * 100,数值越高代表小图存在于大图的概率越高。
如果后续你切换为其他归一化匹配方法,可对应调整计算逻辑:
- 若使用
cv2.TM_CCOEFF_NORMED、cv2.TM_CCORR_NORMED,值越大匹配度越高,完全匹配时值为1,概率计算可采用max(匹配结果最大值, 0) * 100
修正后可输出概率的完整代码
import cv2 import numpy as np large_image = cv2.imread(r'大图本地路径') # 裁剪大图降低无关区域干扰 height = large_image.shape[0] width = large_image.shape[1] large_image = large_image[5:height-173,260:width-25] small_image = cv2.imread(r'小图本地路径') method = cv2.TM_SQDIFF_NORMED # 注意:matchTemplate第一个参数为大图,第二个参数为小图模板,原代码此处顺序错误已修正 result = cv2.matchTemplate(large_image, small_image, method) # 获取最小匹配值和对应坐标 mn,_,mnLoc,_ = cv2.minMaxLoc(result) # 计算匹配概率 match_prob = (1 - mn) * 100 print(f"小图在大图中的匹配概率为:{match_prob:.2f}%") # 可选:绘制匹配框 MPx,MPy = mnLoc trows,tcols = small_image.shape[:2] cv2.rectangle(large_image, (MPx,MPy),(MPx+tcols,MPy+trows),(0,0,255),2) cv2.imshow('匹配结果',large_image) cv2.waitKey(0) cv2.destroyAllWindows()
注意事项
- 模板匹配仅适用于小图在大图中无缩放、无旋转、无透视变形的场景,如果存在以上变换建议改用SIFT、ORB等特征点匹配方案
- 可根据业务需求设定阈值过滤误匹配,比如匹配概率低于80%时判定为小图不存在于大图中
内容的提问来源于stack exchange,提问作者pythonuser1
相关产品推荐
相关产品推荐

