图像的模板匹配,Python OpenCV 取经之旅第 29 天

Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧。

基础知识铺垫

今天的 1 个小时,我们要交给模板匹配了,而且学习起来比较轻松,因为我看到一句话,模板匹配是最没用的匹配方式,应用场景很少。

就喜欢这样的技术,学起来的摩擦力小,不容易掉头发。

模板匹配

模板匹配大意就是在整个图像区域寻找已有的小图像,在寻找之前,你需要准备一个待寻找的图像,以及一个小图

寻找的形式是从左到右,从上到下,这个找法很形象了,一行一行的找。

在寻找的过程中,通过 OpenCV 封装好的算法,计算小图与大图的匹配度,这个匹配度越大,两张图片相同的可能性越大。

模板匹配函数原型

在 Python 中,通过 help 函数,可以查看任意函数的说明。

matchTemplate(image, templ, method[, result[, mask]]) -> result

参数说明如下:

  • image:待检索的图像;
  • templ:小图,要求不大于待搜索图像;
  • method:匹配方法,下表提供,算法不需要掌握,知道用法即可;
  • result:结果图像;
  • mask:掩膜,需要与 templ 有相同的数据类型和大小,默认不设置,仅支持 method 参数值为 TM_SQDIFFTM_CCORR_NORMED

关于 method 参数的值有以下几种情况:

  • TM_SQDIFF:平方差匹配;
  • TM_SQDIFF_NORMED:标准平方差匹配,利用平方差来进行匹配,最好匹配为 0,匹配越差,匹配值越大;
  • TM_CCORR:相关性匹配;
  • TM_CCORR_NORMED:标准相关性匹配,采用模板和图像间的乘法操作,数越大表示匹配程度较高, 0 表示最坏的匹配效果;
  • TM_CCOEFF:相关性系数匹配;
  • TM_CCOEFF_NORMED:标准相关性系数匹配,将模版对其均值的相对值与图像对其均值的相关值进行匹配,1 表示完美匹配,-1 表示糟糕的匹配,0 表示没有任何相关性(随机序列)。

以上内容整理自网络

接下来编写测试代码:

import cv2 as cv

# 读取目标图片,小图
target = cv.imread("./target.jpg")

# 读取模板图片,待查找的图片
template = cv.imread("./template.jpg")

# 获取模板图片的宽高尺寸,用于后面画矩形框
th, tw = template.shape[:2]

# 执行匹配模板,匹配方式选择标准平方差匹配
result = cv.matchTemplate(target, template, cv.TM_SQDIFF_NORMED)

# 输出匹配结果
print(type(result))
cv.imshow("image", result)
cv.waitKey()

注意下图中,最终匹配到的区域颜色最深。

下面我们将其标记出来,需要用到一个新的函数,具体如下。

minMaxLoc 函数

该函数是在给定的矩阵中寻找最大值和最小值,并给出它们的位置。

特别说明是如果需要在所有的通道中查找最小或者最大元素,要先将矩阵重新解释为单通道,好吧,引出归一化的概念了。

那我们先把这个函数学到收,之后在把归一化的函数补充上。

函数原型如下:

minMaxLoc(src[, mask]) -> minVal, maxVal, minLoc, maxLoc

原型比较简单,输入一个图像之后,可以返回 4 个值。

这 4 个值分别是,最大值,最小值以及最大值与最小值的位置。

上文我们使用的是 cv.TM_SQDIFF_NORMED 方法,按照上面的叙述,匹配值最小越好,所以需要获取一下图像的最小值位置。

修改上文代码如下:

import cv2 as cv

# 读取目标图片,小图
target = cv.imread("./target.jpg")
# cv.imshow("target", target)

# 读取模板图片,待查找的图片
template = cv.imread("./template.jpg")
# cv.imshow("template", template)

# 获取模板图片的宽高尺寸,用于后面画矩形框
th, tw = template.shape[:2]

# 执行匹配模板,匹配方式选择标准平方差匹配
result = cv.matchTemplate(target, template, cv.TM_SQDIFF_NORMED)

# 获取最小值位置
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(result)
tl = min_loc
print(tl)
# 通过模板的宽和高,找到匹配最好的右下角地方
# tl[0],tl[1]分别代表最佳匹配值地方的 x 和 y
br = (tl[0]+tw, tl[1]+th)
cv.rectangle(target, tl, br, (0,0,255),2)
# 输出匹配结果

cv.imshow("image", target)
cv.waitKey()

最终运行效果如下,匹配成功。

其他的 method你自行测试吧。

补一个 cv2.normalize

学习新的函数,先把概念通读,尝试理解,理解不要在降格到应用。

归一化就是把待处理的数据进行处理,这里的处理就是某种算法了,然后将数据限制在一个范围内(范围由我们自己定义)

归一化之后,数据会变得更加有可比性,具体原因还未找到可靠资料。

函数原型如下:

dst = cv2.normalize(src[, dst[, alpha[, beta[, norm_type[, dtype[, mask]]]]]])

参数说明:

  • src:输入数组;
  • dst:与 src 大小相同的输出数组;
  • alpha:如果 norm_type 为 NORM_MINMAX ,则 alpha 为最小值或最大值,如果 norm_type 为其他类型,则为归一化要乘的系数;
  • beta:如果 norm_type 为 NORM_MINMAX ,则 beta 为最小值或最大值,如果 norm_type 为其他类型,beta 被忽略,此处不会被用到,一般传入 0;
  • norm_type:归一化类型,常见的有 NORM_L1, NORM_L2, NORM_INF, NORM_MINMAX;
  • dtype:如果取负值时,dst 与 src 同样的类型,否则,dst 和 src 有同样的通道数,且此时图像深度为 CV_MAT_DEPTH(dtype);
  • mask:掩膜。

应用起来比较简单,例如本篇博客中的案例,只需要增加如下代码即可。

# 归一化处理
cv.normalize(result, result, 0, 1, cv.NORM_MINMAX, -1)

橡皮擦的小节

希望今天的 1 个小时,你有所收获,我们下篇博客见~

今天是持续写作的第 70 / 100 天。
如果你有想要交流的想法、技术,欢迎在评论区留言。


博主 ID:梦想橡皮擦,希望大家点赞评论收藏

免责声明:务必仔细阅读

  • 本站为个人博客,博客所转载的一切破解、path、补丁、注册机和注册信息及软件等资源文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。

  • 本站为非盈利性站点,打赏作为用户喜欢本站捐赠打赏功能,本站不贩卖软件等资源,所有内容不作为商业行为。

  • 本博客的文章中涉及的任何解锁和解密分析脚本,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断.

  • 本博客的任何内容,未经许可禁止任何公众号、自媒体进行任何形式的转载、发布。

  • 博客对任何脚本资源教程问题概不负责,包括但不限于由任何脚本资源教程错误导致的任何损失或损害.

  • 间接使用相关资源或者参照文章的任何用户,包括但不限于建立VPS或在某些行为违反国家/地区法律或相关法规的情况下进行传播, 博客对于由此引起的任何隐私泄漏或其他后果概不负责.

  • 请勿将博客的任何内容用于商业或非法目的,否则后果自负.

  • 如果任何单位或个人认为该博客的任何内容可能涉嫌侵犯其权利,则应及时通知并提供身份证明,所有权证明至admin@proyy.com.我们将在收到认证文件后删除相关内容.

  • 任何以任何方式查看此博客的任何内容的人或直接或间接使用该博客的任何内容的使用者都应仔细阅读此声明。博客保留随时更改或补充此免责声明的权利。一旦使用并复制了博客的任何内容,则视为您已接受此免责声明.

您必须在下载后的24小时内从计算机或手机中完全删除以上内容.

您使用或者复制了本博客的任何内容,则视为已接受此声明,请仔细阅读


更多福利请关注一一网络微信公众号或者小程序

一一网络微信公众号
打个小广告,宝塔服务器面板,我用的也是,很方便,重点是免费的也能用,没钱太难了,穷鬼一个,一键全能部署及管理,送你3188元礼包,点我领取https://www.bt.cn/?invite_code=MV9kY3ZwbXo=


一一网络 » 图像的模板匹配,Python OpenCV 取经之旅第 29 天

发表评论

发表评论

一一网络-提供最优质的文章集合

立即查看 了解详情