美文网首页
模式匹配

模式匹配

作者: 原上的小木屋 | 来源:发表于2020-06-02 21:23 被阅读0次

模式匹配,

  • 即寻找待匹配图像和全体图像中最相似的部分,用于物体检测任务。将图像A在图像B中匹配的图像框起来
  • 算法基本原理
  1. 原图像记为I(H×W),待匹配图像为T(h×w):
  2. 对于图像I:,for ( j = 0, H-h) for ( i = 0, W-w)在一次移动1像素的过程中,原图像I的一部分I(i:i+w,j:j+h)与待匹配图像计算相似度S。
  3. S最大或最小的地方即为匹配的位置。
  4. S的计算方法主要有 SSD(误差平方和算法)、SAD(绝对值差和算法)、NCC(归一化交叉相关算法)、ZNCC(零均值归一化交叉相关)等。对于不同的方法,我们需要选择出最大值或者最小值。

使用误差平方和算法(Sum of Squared Difference)进行模式匹配

  • 使用误差平方和SSD(Sum of Squared Difference)。SSD计算像素值的差的平方和,S取误差平方和最小的地方。
    S=\sum_{x=0}^w\sum_{y=0}^h [I(i+x,j+y)-T(x,y)]^2
img = cv2.imread("imori.jpg").astype(np.float32)#读取原始图像
H, W, C = img.shape#读取图像尺寸
# Read templete image
temp = cv2.imread("imori_part.jpg").astype(np.float32)#读取需要匹配的图像
Ht, Wt, Ct = temp.shape#读取需要匹配图像的尺寸
# Templete matching
i, j = -1, -1#给一个匹配坐标的初始值
v = 255 * H * W * C#给一个误差平方和的初始值
for y in range(H-Ht):#匹配y方向上终点y坐标
    for x in range(W-Wt):#匹配x方向上终点x坐标
        _v = np.sum((img[y:y+Ht, x:x+Wt] - temp) ** 2)#依次计算误差平方和的值
        if _v < v:#如果误差平方和有所减小,就更新v
            v = _v
            i, j = x, y#同时更新匹配上的坐标点
out = img.copy()
cv2.rectangle(out, pt1=(i, j), pt2=(i+Wt, j+Ht), color=(0,0,255), thickness=1)#最终画框
out = out.astype(np.uint8)
cv2.imshow('out.jpg',out)
  • 可以预见的是,尺度变化和旋转变化对匹配的结果影响非常大

使用绝对值差和(Sum of Absolute Differences)进行模式匹配

img = cv2.imread("imori.jpg").astype(np.float32)
H, W, C = img.shape
# Read templete image
temp = cv2.imread("imori_part.jpg").astype(np.float32)
Ht, Wt, Ct = temp.shape
# Templete matching
i, j = -1, -1
v = 255 * H * W * C
for y in range(H-Ht):
    for x in range(W-Wt):
        _v = np.sum(np.abs(img[y:y+Ht, x:x+Wt] - temp))
        if _v < v:
            v = _v
            i, j = x, y
out = img.copy()
cv2.rectangle(out, pt1=(i, j), pt2=(i+Wt, j+Ht), color=(0,0,255), thickness=1)
out = out.astype(np.uint8)
cv2.imshow('out.jpg',out)
  • 与上面的误差平方和算法非常相似,只是将误差平方和换成了绝对值平方和

使用归一化交叉相关(Normalization Cross Correlation)进行模式匹配

  • S=\frac{\sum_{x=0}^w\sum_{y=0}^h [I(i+x,j+y)T(x,y)]}{\sqrt{\sum_{x=0}^w\sum_{y=0}^h I(i+x,j+y)^2}\sqrt{\sum_{x=0}^w\sum_{y=0}^h T(i,j)^2}}
  • S 最后的范围在−1≤S<=1NCC对变化十分敏感
img = cv2.imread("123.jpg").astype(np.float32)
H, W, C = img.shape

# Read templete image
temp = cv2.imread("4.jpg").astype(np.float32)
Ht, Wt, Ct = temp.shape
# Templete matching
i, j = -1, -1
v = -1
for y in range(H - Ht):
    for x in range(W - Wt):
        _v = np.sum(img[y:y + Ht, x:x + Wt] * temp)
        _v /= (np.sqrt(np.sum(img[y:y + Ht, x:x + Wt] ** 2)) * np.sqrt(np.sum(temp ** 2)))
        if _v > v:
            v = _v
            i, j = x, y
out = img.copy()
cv2.rectangle(out, pt1=(i, j), pt2=(i + Wt, j + Ht), color=(0, 0, 255), thickness=1)
out = out.astype(np.uint8)

使用零均值归一化交叉相关(Zero-mean Normalization Cross Correlation)进行模式匹配

  • 零均值归一化交叉相关(Zero-mean Normalization Cross Correlation)求出两个图像的相似度,匹配S最大处的图像。
  • 图像I的平均值记为mi,图像T的平均值记为mt。使用下式计算S:
  • S=\frac{\sum_{x=0}^w\sum_{y=0}^h [[I(i+x,j+y)-mi][T(x,y)-mt]]}{\sqrt{\sum_{x=0}^w\sum_{y=0}^h [I(i+x,j+y)-mi]^2}\sqrt{\sum_{x=0}^w\sum_{y=0}^h [T(i,j)-mt]^2}}
  • S最后的范围在−1≤S≤1。零均值归一化积相关去掉平均值的话就是归一化交叉相关,据说这比归一化交叉相关对变换更加敏感。
img = cv2.imread("123.jpg").astype(np.float32)
H, W, C = img.shape
mi = np.mean(img)
# Read templete image
temp = cv2.imread("4.jpg").astype(np.float32)
Ht, Wt, Ct = temp.shape
mt = np.mean(temp)
# Templete matching
i, j = -1, -1
v = -1
for y in range(H - Ht):
    for x in range(W - Wt):
        _v = np.sum((img[y:y + Ht, x:x + Wt] - mi) * (temp - mt))
        _v /= (np.sqrt(np.sum((img[y:y + Ht, x:x + Wt] - mi) ** 2)) * np.sqrt(np.sum((temp - mt) ** 2)))
        if _v > v:
            v = _v
            i, j = x, y
out = img.copy()
cv2.rectangle(out, pt1=(i, j), pt2=(i + Wt, j + Ht), color=(0, 0, 255), thickness=1)
out = out.astype(np.uint8)

无一例外,上述四种模式匹配方法对不同尺度不同角度匹配性极差

相关文章

  • 模式匹配

    模式匹配之字符串 模式匹配之匹配类型 模式匹配之匹配数组、元组、集合 模式匹配之样例类 模式匹配之偏函数

  • 多模式串匹配 - AC 自动机

    多模式串匹配概念 多模式串匹配,即多个模式串在一个主串中进行匹配。 虽然单模式串也能完成多模式串的匹配,但每个模式...

  • Scala模式匹配

    模式匹配match 模式匹配不仅可以匹配值(case 1)还可以匹配类型(case s:String) 匹配过程有...

  • 正则表达式懒惰型元字符匹配 ?

    懒惰匹配模式即表示以最少的匹配量返回匹配个数,默认是非懒惰匹配模式 表达式 匹配结果:

  • scala 模式匹配的几个模式

    Scala 的模式匹配是类似与正则匹配的的模式匹配,但是不仅仅如此,它还可以匹配对象的内在的构建形式. 模式匹配就...

  • 模式匹配

    模式匹配 sql模式匹配允许使用"_"匹配任何单个字符,"%"匹配任意数目字符(包括零字符)。使用sql模式时,不...

  • Scala中的模式匹配

    简单匹配 模式匹配常用于match语句: 变量使用 模式匹配case中可以使用变量来获取参数值 类型匹配 守卫匹配...

  • web开发常识

    .gitignore规则 匹配模式前 / 代表项目的根目录 匹配模式最后加 / 代表是目录 匹配模式前加!代表取反...

  • 模式匹配

    模式 模式类型 通配符模式 _ 匹配任何值 _? 匹配非nil值 标识符模式 值绑定模式 元组模式 枚举case模...

  • Swift-模式匹配

    模式就是匹配的规则,下面介绍Swift中的模式。 1. 通配符模式 _匹配任何值,_?匹配非nil值。 2. 标识...

网友评论

      本文标题:模式匹配

      本文链接:https://www.haomeiwen.com/subject/sscpzhtx.html