每日10行代码46:cv2.matchTemplate方法原理最简单解释:寻找相等或相似的子矩阵
程序员文章站
2022-05-27 14:51:49
...
今天研究了下matchTemplate方法,其实原理很简单,在opencv里,会把图片转成由象素点组成的数据,每一个象素点是一个颜色值,如果是rgb三通道的话,那么图像就是一个3维数组,也可以看作是3维矩阵。
模板匹配通俗的说是图片查找,其实在底层就是矩阵查找,如果需要完全匹配呢就是找相等的子矩阵,如果是相似查找呢,就需要找最相似的矩阵,至于怎么确定是否相似这就需要不同的算法了,我也可以人为的定义一个相似度算法,比如我可以定义相同位置值相减差值之和定义位相似度。
定义好相似度后,那么剩下的工作就是循环扫描矩阵,找到符合相似度的矩阵。
扫描矩阵的方法也很简单,相当于开一个滑动小窗,去依次扫过矩阵所有位置,然后依次计算相似度,最后把相似度记录成一个数组,数组的坐标跟小窗的左上角坐标是一样的。
下面看一个例子:
我用excel弄了个二维矩阵,假如我要找的矩阵是一个2*3的矩阵
3,4,8
1,9,1
那么我就需要从第一行开始依次查找所有位置,最后在f9的位置找到了这个矩阵,同时f9也是最后一次查找的位置
如果我有个算法,可以计算出矩阵的之间的相似度,那么我把这个值存在每次查找小框的最左上角位置,那么就形成了一个相关性的矩阵
在上面这个例子中矩阵的大小就是a1:f9.
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
# 1.模板匹配
img = cv.imread('lenna.jpg', 0)
template = cv.imread('eye.png', 0)
res = cv.matchTemplate(img, template, cv.TM_CCOEFF_NORMED)
print(type(res))
print(res.shape)
# plt.imshow(res)
# plt.show()
输出结果:
<class 'numpy.ndarray'>
(509, 1019)
看了好多人的代码,会把这个相似矩阵展示成图片,其实我觉得这样做意义不大,因为matchTemplate返回的结果就是一个相似度的矩阵,而不是色彩相关信息,所以展示的意义不大,我们只需要知道矩阵最大值最小值的位置就够了。
上一篇: PATB:1026程序运行时间
下一篇: File