大道之行,天下为公。这篇文章主要讲述#yyds干货盘点#Python图像处理,cv2模块,OpenCV实现模板匹配相关的知识,希望能为你提供帮助。
前言利用python实现OpenCV实现边缘检测。废话不多说。
让我们愉快地开始吧~
开发工具Python版本: 3.6.4
相关模块:
cv2模块;
以及一些Python自带的模块。
环境搭建安装Python并添加到环境变量,pip安装需要的相关模块即可。
模板匹配模板匹配,就是在整个图像区域里发现与给定子图像相匹配的小块区域
这里需要一个模板图像(给定的子图像)和一个待检测的图像(原图像)
在待检测图像上,从左向右,从上向下计算模板图像与重叠子图像的匹配度,匹配度越大,两者相同的可能性越大
文章图片
这里主要涉及OpenCV的cv2.matchTemplate()和cv2.minMaxLoc()函数
第一个函数作用是在模板和输入图像之间寻找匹配,获得匹配结果图像
第二个函数的作用则是在给定的矩阵中寻找最大和最小值(包括它们的位置)
其中模板匹配算法有以下六种
# 第一类,利用平方差来进行匹配,最好匹配为0.匹配越差,匹配值越大# 平方差匹配
method=CV_TM_SQDIFF# 标准平方差匹配
method=CV_TM_SQDIFF_NORMED# 第二类,采用模板和图像间的乘法操作,所以较大的数表示匹配程度较高,0标识最坏的匹配效果# 相关匹配
method=CV_TM_CCORR# 标准相关匹配
method=CV_TM_CCORR_NORMED# 第三类,将模版对其均值的相对值与图像对其均值的相关值进行匹配,1表示完美匹配,-1表示糟糕的匹配,0表示没有任何相关性(随机序列)# 相关系数匹配
method=CV_TM_CCOEFF# 标准相关系数匹配
method=CV_TM_CCOEFF_NORMED
标准化意味着将数值统一到0~1
检索图像看一下两张图像,都为灰度图
import cv2# 读取待检测图像
img = cv2.imread(game.png, 0)
# 读取模板图像
temple = cv2.imread(temple.png, 0)# 显示灰度处理后的待检测图像
cv2.namedWindow(sample, 0)
cv2.resizeWindow(sample, 400, 600)
cv2.imshow(sample, img)# 显示灰度处理后的模板图像
cv2.namedWindow(target, 0)
cv2.resizeWindow(target, 400, 600)
cv2.imshow(target, temple)
结果展示
文章图片
【#yyds干货盘点#Python图像处理,cv2模块,OpenCV实现模板匹配】第一张为模板图像,第二张为待检测图像
下面使用OpenCV的两个函数,来实现模板匹配
# 获取模板图像的高和宽
th, tw = temple.shape[:2]
print(th, tw)# 使用标准相关系数匹配,1表示完美匹配,-1表示糟糕的匹配,0表示没有任何相关性
result = cv2.matchTemplate(img, temple, cv2.TM_CCOEFF_NORMED)# result为匹配结果矩阵
# print(result)# TM_CCOEFF_NORMED方法处理后的结果图像
cv2.namedWindow(match_r, 0)
cv2.resizeWindow(match_r, 400, 600)
# 显示窗口
cv2.imshow(match_r, result)# 使用函数minMaxLoc,确定匹配结果矩阵的最大值和最小值(val),以及它们的位置(loc)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)# 此处选取最大值的位置,为图像的左上角
tl = max_loc
# 获取图像的右下角
br = (tl[0]+tw, tl[1]+th)
# 绘制矩形框
cv2.rectangle(img, tl, br, (0, 0, 255), 2)# 设置显示窗口
cv2.namedWindow(match, 0)
cv2.resizeWindow(match, 400, 600)
# 显示窗口
cv2.imshow(match, img)# 结束
cv2.waitKey(0)
cv2.destroyAllWindows()
结果输出
文章图片
第一张图中最白的位置,即代表着最高的匹配
第二张图中,矩形框则代表着匹配到的结果
通过矩形框的位置参数,结合模板图像的大小,便可得到小跳棋中心点位置(底部)
推荐阅读
- #yyds干货盘点# python-redis-lock锁
- Python训练营Python每日一练----第15天:字串排序
- #yyds干货盘点# mybatis源码解读(cache包(缓存机制功能))
- RDBMS和HBase之间有哪些区别()
- Python和C#之间有什么区别()
- 进程和用户级别线程之间有什么区别()
- ++*p、*p++和*++p之间有什么区别()
- PIC与MSP430之间有哪些区别()
- PIC和ARM之间有什么区别()