模板匹配相关概念与几种不常用的模板匹配(学都学了,了解一下)

这篇具有很好参考价值的文章主要介绍了模板匹配相关概念与几种不常用的模板匹配(学都学了,了解一下)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、模板匹配相关概念

(一)什么是模板匹配?

  • 模板匹配指的是通过模板图像与测试图像之间的比较,找到测试图像上与模板图像相似的部分,这是通过计算模板图像与测试图像中目标的相似度来实现的,可以快速地在测试图像中定位出预定义的目标

  • 是图像处理中最基本、最常用的匹配方法

(二)匹配主要思路

  • 为感兴趣的对象创建模型:使用具用代表性图像来创模板匹配模型句柄

  • 在搜索图像中查找模型在图像中搜索先前创建的模型的实例及其位置,搜索它们的角度及行列坐标

(三)匹配结果

  • 通过模板匹配可以得到目标的相似度,旋转角度,行列坐标,缩放大小等

(四)需要处理的问题

  • 针对不同的图像特征和检测环境,有多种模板匹配算法

  • 如何选择合适的模板匹配算法,取决于具体的图像数据和匹配任务

  • 只有理解这些算法的原理和适用场景后,才能根据项目的需要选择合适的算法

(五)模板匹配的分类

  • HALCON模板匹配包含:基于点、基于灰度值、基于描述性、基于相关性、基于形状、基于组件、局部可变形、可变形的

  • 常用的方式是基于相关性和基于形状

二、基于灰度值的模板匹配(Gray-Value-Based,不怎么用的)

  • 基于灰度值的模板匹配是最经典的模板匹配算法,也是最早提出来的模板匹配算法

(一)根本思想

  • 计算模板图像与检测图像之间的像素灰度差值的绝对值总和(SAD方法)或者平方差总和(SSD方法)

(二)原理

(三)使用条件

  • 首先选择一块ROI(感兴趣区域)作为模板图像,生成基于灰度值的模板

  • 然后将检测图像与模板图像进行粗匹配,在检测图像与模板图像中任选一点,采取隔点搜索的方式计算二者灰度的相似性,这样粗匹配一遍得到粗相关点

  • 接下来进行精匹配,将得到的粗相关点作为中心点,用最小二乘法寻找二者之间的最优匹配点

  • 该方法是利用模板图像的所有灰度值进行匹配,但在光照发生变化的情况下灰度值会产生强烈的变化

  • 因此该方法不能适应光照发生变化的情况,也不能用于多通道图像的匹配

  • 适用于目标图像光照比较稳定的情况,多数情况下还是优先考虑基于相关性的匹配和基于形状的匹配。只有针对极少数的简单图像,才会考虑基于灰度值的匹配

(四)灰度匹配算子

/*
1.创建模板:create_template()
2.搜索模板和图像的最佳匹配:best_match()
3.释放模板:clear_template()
*/

(五)实例

// 清空窗口,然后读取图像,转换为灰度图。关闭当前图像窗口并打开一个固定纵横比的窗口用来显示窗口
dev_clear_window ()
read_image(Image, '灰度.png')
rgb1_to_gray(Image, GrayImage)
dev_close_window()
dev_open_window_fit_image(GrayImage, 0, 0, -1, -1, WindowHandle)
dev_display(GrayImage)

// 画ROI区域(单个圆点),用于创建模板
draw_circle(WindowHandle, Row1, Column1, Radius1)
gen_circle(ROI_0, Row1, Column1, Radius1)
reduce_domain(GrayImage, ROI_0, ImageReduced)
create_template(ImageReduced, 255, 4, 'sort', 'original', TemplateID)
    
// 二值化后进行连通域操作,多条件筛选想要的区域
threshold(GrayImage, Region, 128, 255)
connection(Region, ConnectedRegions)
select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 1000, 50000)
// 为选中的区域增加灰度值,这里增加的是灰度图
add_channels(SelectedRegions, GrayImage, GrayRegions)

// 搜索模板和图像的最佳匹配。
best_match(GrayRegions, TemplateID, 40, 'false', Row, Column, Error1)
// 生成特定长度的元组并初始化其元素,将所有的圆半径设为20
// 要生成元组长度,常量,用于初始化元组元素。新生成的元组中每个元素的数据类型和值由输入参数Const决定,该参数可能只包含单个元素。Newtuple中的所有元素都具有与Const中单个元素相同的数据类型和值。
tuple_gen_const(|Row|, 20, Radius)
dev_set_line_width (3)
// 创建与圆或圆弧对应的XLD轮廓
gen_circle_contour_xld(Circles, Row, Column, Radius, 0, 6.28318, 'positive', 1)
dev_display(GrayImage)
dev_display(Circles)

模板匹配相关概念与几种不常用的模板匹配(学都学了,了解一下)

三、基于形变的模板匹配 

  • 基于形变的模板匹配也是一种基于形状的匹配方法。但是基于形变的模板匹配返回结果中不仅包括轻微形变的形状、形变的位置和参数,还有描述形变的参数,如旋转角度、缩放倍数等

  • 基于透视的形变可以返回一个二维投影变换矩阵。如果是在相机标定的情况下,通过相机参数,还可以计算出目标的三维位姿

(一)根本思想

  • 形变有基于目标局部的形变 local deformable matching(局部变形匹配)和由于透视关系而产生的形变(透视形变匹配)

(二)原理

(三)使用条件

  • 对于很多干扰因素不敏感,如光照变化、混乱无序、缩放变化等。其适用于多通道图像,对于纹理复杂的图像匹配则不太适用

(四)局部变形匹配算子

/*
1.创建模板:create_local_deformable_model()
2.寻找模板:find_local_deformable_model()
3.释放模板:clear_deformable_model()
*/

(五)实例(基于局部形变的匹配)

dev_close_window ()
*读取参考图像,这里读取的是单通道灰度图像	
*这里的参考图像是已经剪裁好的感兴趣区域图像,可以直接作为模板图像
read_image (ModelImage, 'data/creamlabel')
*设置显示窗口参数
dev_open_window_fit_image (ModelImage, 0, 0, -1, -1, WindowHandle)
*创建局部形变模板,返回局部形变模板句柄ModelID
create_local_deformable_model (ModelImage, 'auto', rad(-15), rad(30), 'auto', 1, 1, 'auto', 1, 1, 'auto', 'none', 'use_polarity', [40,60], 'auto', [], [], ModelID)
*获取局部形变模板的轮廓
get_deformable_model_contours (ModelContours, ModelID, 1)
*为了将模板轮廓可视化显示,需要将轮廓与图像实物对应起来
*因此出于可视化显示的目的,先获取模板图像的几何中心
area_center (ModelImage, Area, Row, Column)
*进行仿射变换
hom_mat2d_identity (HomMat2DIdentity)
hom_mat2d_translate (HomMat2DIdentity, Row, Column, HomMat2DTranslate)
affine_trans_contour_xld (ModelContours, ContoursAffinTrans, HomMat2DTranslate)
*设置轮廓显示的线条参数,显示模板图像与轮廓
dev_set_line_width (2)
dev_display (ModelImage)
dev_display (ContoursAffinTrans)
stop ()
*读取测试图像,这里的图像中更包含模板图像,并且有一定的形变
read_image (DeformedImage, 'data/cream')
*显示用于测试的局部形变图像
dev_resize_window_fit_image (DeformedImage, 0, 0, -1, -1)
dev_display (DeformedImage)
*进行局部形变模板匹配
find_local_deformable_model (DeformedImage, ImageRectified, VectorField, DeformedContours, ModelID, rad(-14), rad(28), 0.9, 1, 0.9, 1, 0.78, 0, 0, 0, 0.7, ['image_rectified','vector_field','deformed_contours'], ['deformation_smoothness','expand_border','subpixel'], [18,0,0], Score, Row, Column)
*显示形变轮廓
dev_display (DeformedImage)
dev_set_line_width (2)
dev_set_color ('red')
dev_display (DeformedContours)
stop()
*匹配结束,释放模板资源
clear_deformable_model (ModelID)

模板匹配相关概念与几种不常用的模板匹配(学都学了,了解一下)

四、基于描述符的模板匹配

(一)根本思想

  • 与基于透视形变的模板匹配类似,基于描述符的模板匹配能够在物体处于透视形变的状态下进行匹配,并且已标定和未标定的相机图像都适用

  • 与透视形变不同的是,它的模板不是根据边缘轮廓创建的,而是根据特征点创建的

(二)原理

  • 点的位置或相邻像素的灰度信息等都可以作为描述符

(三)使用条件

  • 有纹理的平面图形非常适用于这种方法,尤其是对于旋转倾斜等场景中的匹配可以得到非常理想的结果

  • 基于描述符的模板匹配只能用于有纹理的图像

(四)描述符匹配算子

 /*
 1.创建模板:create_calib_descriptor_model()
 2.寻找模板:find_calib_descriptor_model()
 3.释放模板:clear_descriptor_model()
 */

(五)实例

 dev_close_window ()
 *读取参考图像,这里的参考图像应只包含识别的关键区域,用于创建模板
 read_image (ImageLabel, 'D:/MVTec/HALCON-21.11-Progress/examples/images/brochure/brochure_01.jpg')
 *设置窗口参数用于显示图像
 get_image_size (ImageLabel, Width, Height)
 dev_open_window (0, 0, Width, Height, 'black', WindowHandle1)
 dev_set_draw ('margin')
 dev_display (ImageLabel)
 *设置用于存储特征点和感兴趣区域的变量
 NumPoints := []
 RowRoi := [10,10,Height - 10,Height - 10]
 ColRoi := [10,Width - 10,Width - 10,10]
 *将参考图像中的除边缘外的区域都设为感兴趣区域。因为参考图像已经近似于匹配的纹理样本
 gen_rectangle1 (Rectangle, 10, 10, Height - 10, Width - 10)
 *显示参考图像上选择的ROI区域
 dev_set_line_width (4)
 dev_display (Rectangle)
 stop ()
 *将感兴趣区域剪裁为模板图像
 reduce_domain (ImageLabel, Rectangle, ImageReduced)
 dev_clear_window ()
 dev_display (ImageLabel)
 *创建基于描述符的模板
 create_uncalib_descriptor_model (ImageReduced, 'harris_binomial', [], [], ['min_rot','max_rot','min_scale','max_scale'], [-90,90,0.2,1.1], 42, ModelID)
 *设置模型的原点,为了后面获取坐标作参照
 set_descriptor_model_origin (ModelID, -Height / 2, -Width / 2)
 *获取模型中特征点的位置
 get_descriptor_model_points (ModelID, 'model', 'all', Row_D, Col_D)
 *将模型中计算出的特征点存入NumPoints变量中
 NumPoints := [NumPoints,|Row_D|]
 ​
 *读取测试图像,这里读取的是单通道灰度图像,因此省略了通道转化的步骤
 read_image (ImageGray, 'D:/MVTec/HALCON-21.11-Progress/examples/images/brochure/brochure_05.jpg')
 dev_resize_window_fit_image (ImageGray, 0, 0, -1, -1)
 dev_display (ImageGray)
 *对描述符特征点进行匹配
 find_uncalib_descriptor_model (ImageGray, ModelID, 'threshold', 800, ['min_score_descr','guided_matching'], [0.003,'on'], 0.25, 1, 'num_points', HomMat2D, Score)
 *显示匹配结果,将特征点用不同的颜色绘制出来
 if ((|HomMat2D| > 0) and (Score > NumPoints[0] / 4))
     get_descriptor_model_points (ModelID, 'search', 0, Row, Col)
   *创建十字标识符
     gen_cross_contour_xld (Cross, Row, Col, 6, 0.785398)
     projective_trans_region (Rectangle, TransRegion, HomMat2D, 'bilinear')
     projective_trans_pixel (HomMat2D, RowRoi, ColRoi, RowTrans, ColTrans)
     angle_ll (RowTrans[2], ColTrans[2], RowTrans[1], ColTrans[1], RowTrans[1], ColTrans[1], RowTrans[0], ColTrans[0], Angle)
     Angle := deg(Angle)
     if (Angle > 70 and Angle < 110)
         area_center (TransRegion, Area, Row, Column)
         dev_set_color ('green')
         dev_set_line_width (4)
         dev_display (TransRegion)
         dev_set_colored (6)
         dev_display (Cross)                
    endif
 endif
 stop ()
 *匹配结束,释放模板资源
 clear_descriptor_model (ModelID)

五、优化匹配速度

  • 可从两个方面下手:缩小搜索空间和使用图像不采样

六、使用halcon匹配助手进行匹配

  • 选择匹配方法
  • 创建模板
  • 检测模板
  • 优化匹配速度

模板匹配相关概念与几种不常用的模板匹配(学都学了,了解一下)文章来源地址https://www.toymoban.com/news/detail-477659.html

到了这里,关于模板匹配相关概念与几种不常用的模板匹配(学都学了,了解一下)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV 笔记:cv2.matchTemplate() 单模板匹配和多模板匹配

            模板匹配是用来在一副大图中搜寻查找模版图像位置的方法。         模板匹配实现简单(2~3行代码),计算效率高,不需要执行阈值化、边缘检测等操作来生成二值化图像。 但是: 如果输入图像中存在变化的因素,包括旋转、缩放、视角变化等,模板匹配很容

    2024年02月05日
    浏览(45)
  • 多角度模板匹配的模板创建技巧

            基于形状的模板匹配角度范围通常为360°,如果角度步长为1°,就需要准备360个模板,再加上金字塔层级,准备的模板个数会多达上百个,这样无疑对模板的存储和读取都极为不利,一是占据很大的内存,二是极其耗时,光是读取模板的时间就比整个匹配时间长。

    2024年02月10日
    浏览(45)
  • OpenCV中的模板匹配

    OpenCV中的模板匹配 模板匹配是一项常见的计算机视觉任务,其目的是从输入图像中找到与给定模板最相似的部分。在OpenCV中,我们可以使用模板匹配算法来识别某个图案或对象在另一个图像中的位置。本文将介绍如何使用OpenCV进行模板匹配,并提供相应的源代码。 1.读取图像

    2024年02月06日
    浏览(49)
  • 用OpenCV进行模板匹配

    今天我们来研究一种传统图像处理领域中对象检测和跟踪不可或缺的方法——模板匹配,其主要目的是为了在图像上找到我们需要的图案,这听起来十分令人兴奋。 所以,事不宜迟,让我们直接开始吧! 模板匹配的算法的核心十分简单:它将模板与源图像中的每个部分进行

    2024年02月10日
    浏览(43)
  • opencv#27模板匹配

         例如给定一张图片,如上图大矩阵所示,然后给定一张模板图像,如上图小矩阵。      我们在大图像中去搜索与小图像中相同的部分或者是最为相似的内容。比如我们在图像中以灰色区域给出一个与模板图像尺寸大小一致的区域,通过比较灰色区域中的内容与模板中

    2024年01月23日
    浏览(45)
  • OpenCV 模板匹配 matchTemplate

    模板匹配是一项在一副图像中寻找与另一幅模板图像最匹配(相似)部分的技术。模板匹配不是基于直方图的,而是通过在输入图像上滑动图像块(模板)同时对比相似度,来对模板和输入图像进行匹配的一种方法。 应用: (1)目标查找定位 (2)运动物体跟踪 image:待搜

    2024年02月04日
    浏览(62)
  • Opencv——图像模板匹配

    什么是模板匹配呢? 看到这里大家是否会觉得很熟悉的感觉涌上心头!在人脸识别是不是也会看见 等等。 模板匹配可以看作是对象检测的一种非常基本的形式。使用模板匹配,我们可以使用包含要检测对象的“模板”来检测输入图像中的对象。 参数:(img: 原始图像、

    2024年02月16日
    浏览(40)
  • OpenCV(十九):模板匹配

    1.模板匹配:      OpenCV提供了一个模板匹配函数,用于在图像中寻找给定模板的匹配位置。 2.图像模板匹配函数matchTemplate  void matchTemplate( InputArray image, InputArray templ, OutputArray result, int method, InputArray mask = noArray() ); image:待模板匹配的原图像,图像数据类型为CV 8U和CV 32F两者中

    2024年02月09日
    浏览(43)
  • 第15章:模板匹配

    ​ 模板匹配是指在当前 图像A 内匹配与 图像B 最相似的部分,一般将 图像A 称为 输入图像 ,将 图像B 称为 模板图像 。 模板匹配的方法是将模板图像B在图像A上滑动,逐个遍历所有像素以完成匹配。 ​ 例如,下图中,大图像“lena”是输入图像,“眼睛”图像是模板图像。

    2024年02月09日
    浏览(64)
  • 模板匹配Template Matching

     实现代码: 运行结果:

    2024年02月11日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包