OpenCV 图像匹配算法
- 第一章:图像模板匹配演示
- ① 效果展示1
- ② 效果展示2
- ③ 实现源码
- 第二章:六大模板匹配算法
- ① CV_TM_SQDIFF【平方差匹配】
- ② CV_TM_SQDIFF_NORMED【标准平方差匹配】
- ③ CV_TM_CCORR【相关匹配】
- ④ CV_TM_CCORR_NORMED【标准相关匹配】
- ⑤ CV_TM_CCOEFF【相关系数匹配】
- ⑥ CV_TM_CCOEFF_NORMED【标准相关系数匹配】
第一章:图像模板匹配演示
① 效果展示1
这是我要进行匹配的图片:
匹配后的效果:
② 效果展示2
这是我要进行匹配的图片:
匹配后的效果:
③ 实现源码
实现源码如下:
这里使用了 CV_TM_SQDIFF 算法,调用方法为 cv.TM_SQDIFF
import cv2 as cv def template_matching(img_match, img, arithmetic_model): ''' 【作用】 进行图片模板匹配 【参数1】 模板图片 【参数2】 进行匹配的图片 【参数3】 算法模型 【返回】 无 ''' # 进行模板匹配 result = cv.matchTemplate(img, img_match, arithmetic_model) # 获取最小最大匹配值,还有对应的坐标 min_value, max_value, min_coordinate, max_coordinate = cv.minMaxLoc(result) # 默认最佳最大值,当算法为CV_TM_SQDIFF或CV_TM_SQDIFF_NORMED时改为最小值 best_coordinate = max_coordinate; if(arithmetic_model == cv.TM_SQDIFF or arithmetic_model == cv.TM_SQDIFF_NORMED): best_coordinate = min_coordinate; # 获取匹配图片的高和宽 m_height, m_width = img_match.shape[:2] # 矩形的起始点和结束点 r_start = best_coordinate r_end = (best_coordinate[0] + m_width, best_coordinate[1] + m_height); # 矩形的颜色和线的宽度 r_color = (0, 0, 0) r_line_width = 2 # 绘制矩形并展示 cv.rectangle(img, r_start, r_end, r_color, r_line_width) cv.imshow("Xiao Lanzao", img) # 传入图片数据 img_match = cv.imread("./image/baidu-ico.png") img = cv.imread("./image/baidu-sousuo.png") template_matching(img_match, img, cv.TM_SQDIFF) cv.waitKey(0) cv.destroyAllWindows()
第二章:六大模板匹配算法
在一些复杂的场景下,从简单的平方差算法到更复杂的相关系数算法,匹配的准确率会不断提高,但是计算量也同时增加了。
① CV_TM_SQDIFF【平方差匹配】
平方差匹配:CV_TM_SQDIFF
说明:
利用平方差进行匹配。
特点:系数越小匹配程度越好,最小值 0。
公式如下:
② CV_TM_SQDIFF_NORMED【标准平方差匹配】
标准平方差匹配:CV_TM_SQDIFF_NORMED
特点同上①。
公式如下:
③ CV_TM_CCORR【相关匹配】
相关匹配:CV_TM_CCORR
利用模板和图像间的乘法操作。
特点: 系数越高匹配效果越好,最小值 0。
公式如下:
④ CV_TM_CCORR_NORMED【标准相关匹配】
标准相关匹配:CV_TM_CCORR_NORMED
特点同③。
公式如下:
其中:
⑤ CV_TM_CCOEFF【相关系数匹配】
相关系数匹配 CV_TM_CCOEFF
利用模版对其均值的相对值与图像对其均值的相关值进行匹配。
特点: 系数越高匹配系数越好,最大值为 1,最小为 -1。
公式如下:
其中:
⑥ CV_TM_CCOEFF_NORMED【标准相关系数匹配】
标准相关系数匹配:CV_TM_CCOEFF_NORMED
特点同上⑤。
公式如下:
喜欢的点个赞❤吧!