python+OpenCv笔记(十七):模板匹配

模板匹配

OpenCV框架提供了用于对象检测、跟踪和计数的许多不同方法。其中,模板匹配是OpenCV中最基本的对象检测方法之一。

OpenCV API:

res = cv.matchTemplate(image, templ, method)

参数:

  1. image:要进行模板匹配的图像
  2. templ:模板(图像)
  3. method:是模板匹配的算法。主要有:
    1. 平方差匹配(cv.TM_SQDIFF):利用模板与图像之间的平方差进行匹配,最好的匹配是0,匹配越差,匹配的值越大。
    2. 相关匹配(cv.TM_CCORR):利用模板与图像间的乘法进行匹配,数值越大表示匹配程度较高,越小表示匹配效果差。
    3. 利用相关系数匹配(cv.TM_CCOEFF):利用模板与图像间的相关系数匹配,1表示完美的匹配,-1表示最差的匹配。
    4. cv.TM_SQDIFF_NORMED
    5. cv.TM_CCORR_NORMED
    6. cv.TM_CCOEFF_NORMED

原理:

  1. 模板匹配即用大小为 W*H 的模板在大小为 Q*S 的图像上滑动,并使用参数method中指定的方法,将模板与图像的所有重叠部分进行比较,然后将比较结果存储在结果 res 中。
    显然,图像 (Q*S) 必须大于模板 (W*H) ,且最终的结果 res 的大小为(Q-W+1)*(S-H+1)。
  2. 如果匹配方法中含有_NORMED,那么模板匹配函数之后就不再需要进行归一化处理,因为结果将在0和1的范围内,否则,需要使用 normalize 函数对结果进行归一化处理。
  3. 完成匹配后,使用cv.minMaxLoc()方法定位结果图像的全局最小值(图像中的最暗点)和全局最大值(图像中的最亮点)。如果使用的是平方差匹配,则最小值位置是最佳匹配位置,否则,则最大值位置是最佳匹配位置。

注意:

        模板匹配不适用于尺度变换,视角变换后的图像,这时我们就要使用关键点匹配算法,比较经典的关键点检测算法包括SIFT和SURF等,主要的思路是首先通过关键点检测算法获取模板和测试图片中的关键点﹔然后使用关键点匹配算法处理即可,这些关键点可以很好的处理尺度变化、视角变换、旋转变化、光照变化等,具有很好的不变性。
 

代码编写

import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np

src = cv.imread("E:\\qi.png")
img = src.copy()
src_roi = cv.imread("E:\\roi.png")
roi = src_roi.copy()

# 模板匹配
res = cv.matchTemplate(img, roi, cv.TM_CCOEFF_NORMED)

# 返回模板中最匹配的位置,确定左上角的坐标
min_Val, max_Val, min_Loc, max_Loc = cv.minMaxLoc(res)
# 使用相关系数匹配时,最大值为最佳匹配位置
top_left = max_Loc
roi_rows, roi_cols = roi.shape[:2]
cv.rectangle(img, top_left, (top_left[0]+roi_cols, top_left[1]+roi_rows)
             , (0, 0, 255), 3)

# 显示图像
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 8), dpi=100)
axes[0][0].imshow(src[:, :, ::-1])
axes[0][0].set_title("原图")
axes[0][1].imshow(roi[:, :, ::-1])
axes[0][1].set_title("模板")
axes[1][0].imshow(res, cmap=plt.cm.gray)
axes[1][0].set_title("比较结果")
axes[1][1].imshow(img[:, :, ::-1])
axes[1][1].set_title("最终匹配图")
plt.show()

 拓展

        matchTemplate函数的另一个功能就是模板计数,为了完成该功能,需要在循环内运行matchTemplate函数,并在每次匹配成功后从原图像中移除已匹配的部分,以便在matchTemplate下一次调用时不再匹配已匹配的部分。

        模板计数广泛用于生产线或平整表面中对目标进行计数,或者在微观图像中计算相似形状和大小的细胞的数量。

猜你喜欢

转载自blog.csdn.net/qq_45832961/article/details/122455118