一种基于边缘的模版匹配算法

引用资料 https://www.codeproject.com/Articles/99457/Edge-Based-Template-Matching

著名机器视觉软件Halcon 的开发人员出版的一本书

  1. Machine Vision Algorithms and Applications [Carsten Steger, Markus Ulrich, Christian Wiedemann]

中译本《机器视觉算法与应用》。

这本书里面没有代码,也没有公式验证,有少量必要的公式罗列。

侧重于工业上一些常用机器视觉算法的实现原理。

=========================================================

另外这里有C#与emgucv的算法实现:https://gitee.com/e1ki0lp/Edge-Based-Template-Matching

=========================================================

对于机器视觉来讲,视觉引导是很常见的应用,找到物体往往需要使用模版匹配。

工业上实操起来,我们需要的是鲁棒,稳定,准确,快速的算法。

基于灰度的算法是一个好的方向,基于特征点的算法可能并不适用。

这里主要介绍一种基于边缘的模版匹配算法。

下面只说笔者代码中的处理流程。

1.获取模版

①.找到感兴趣区域中的的边缘。OpenCV已经有了Canny函数,配合 FindContours 函数即可得到边缘点坐标值。

②.计算边缘点在的x,y方向的梯度值。OpenCV的 Sobel 函数。

③.根据②的数据计算边缘点的梯度强度和梯度角度。OpenCV的CartToPolar函数。

④.遍历边缘点,保存边缘点对应的x,y梯度,并将梯度强度归一化处理(1除以该点梯度强度,这样得到的值都是[0,1]区间内的值)

并将边缘点坐标转换为相对于中心的相对坐标(实际上我这里使用的是第一个边缘点坐标,并没有使用中心点,因为找中心也需要计算)

经过以上操作,我们便建立好了模版。

2,模版匹配

①.计算边缘点在x,y方向的梯度值。同 1.②。

②.根据①的数据计算边缘点的梯度强度和梯度角度。

③.这步是最重要的,通过 归一化交叉相关(NCC) 算法计算模版边缘梯度和目标图像边缘梯度的相关性。

而且该算法得到的值就是匹配相关性的得分,分值范围在[0,1],具体实现可以去看代码。其实就是拿着你的模版边缘在图像中平移,每移动一步计算一下边缘点对应的梯度强度相关性,这里引用链接中实现了一种优化,如果计算边缘点梯度相似性过程中得分过低,就可以跳过后续边缘点的计算,直接移动到下一个位置。

 

本文章中提供的C#算法和处理流程只是对检测结果的实现,追求代码的简化,但是效率是最差的,实际上中间实现和引用链接完全不同,因为Canny算法中已经包含了Sobel算法和计算梯度强度和梯度角度的过程以及遍历图像操作,所以获取模板操作的四个步骤完全可以合并到Canny函数中,但是EmguCV/OpenCV的Canny函数没有将这些中间变量暴露出来。引用链接中的实现是重写Canny算法,这样便能够使用Canny算法的中间变量。不需要再重复计算,经过一轮Canny算法即可建立模版数据

 

引用链接中还提及一些优化方法,比如对图像使用金字塔处理加快匹配速度,旋转建模使算法抗旋转。

拓展思维,我们可以发现梯度角度值没有使用,实际上也可以用于相似性检测,还能用于旋转角度的测量。

除了NCC算法,其它的一些基于灰度值的匹配算法也可照搬套用。

这里水平有限只提供一些思路,无法展开。

VisionPro的PatMax算法,Halcon的形状匹配算法都是基于边缘的模版匹配。

 

--------------------- 本文来自 e1ki0lp 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/backspace110/article/details/80767200?utm_source=copy

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
边缘模板匹配算法可以利用OpenCV中的Sobel算子来实现。Sobel算子是一种常用的边缘检测算子,可以用来检测图像中的垂直和水平边缘。 首先,我们需要加载原始图像和模板图像。然后,使用Sobel算子对原始图像进行边缘检测,得到包含边缘信息的图像。接下来,使用matchTemplate函数对边缘检测后的图像与模板图像进行匹配,得到一个结果矩阵。最后,使用minMaxLoc函数找到结果矩阵中的最大值和最小值,即为匹配的位置。 以下是实现边缘模板匹配算法的代码: ```python import cv2 import numpy as np # 加载原始图像和模板图像 img = cv2.imread('image.jpg', 0) template = cv2.imread('template.jpg', 0) # 使用Sobel算子进行边缘检测 sobel_x = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3) sobel_y = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3) sobel = cv2.addWeighted(sobel_x, 0.5, sobel_y, 0.5, 0) # 使用matchTemplate函数进行匹配 result = cv2.matchTemplate(sobel, template, cv2.TM_CCOEFF_NORMED) # 找到匹配的位置 min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result) # 绘制矩形框 h, w = template.shape top_left = max_loc bottom_right = (top_left[0] + w, top_left[1] + h) cv2.rectangle(img, top_left, bottom_right, 255, 2) # 显示结果 cv2.imshow('image', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 其中,sobel_x和sobel_y分别表示水平和垂直方向上的边缘检测结果,sobel为两者之和。matchTemplate函数的第三个参数表示匹配方法,这里选择了TM_CCOEFF_NORMED方法。minMaxLoc函数返回的max_loc即为匹配的位置。最后,使用cv2.rectangle函数在原始图像上绘制矩形框。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值