一、介绍
基于相关性的模板匹配其实是另一种基于灰度值的匹配的方法,不过它的特点是使用一种归一化的互相关匹配(Normalized Cross Correlation,NCC)来衡量模板图像和检测图像之间的关系,因此,在光照方面受的影响比较小。
与经典的基于灰度值的匹配算法不同的是,它的速度要快很多,并且能够适应线性光照变化;与基于形状模板的匹配算法相比,它的优势是对一些形状有细微变化的、纹理复杂的或者是聚焦模糊的检测图像都能检测到,支持有轻微形变的搜索,能弥补形状模板再某些方面的不足。
该方法不但能适应光照变化,对小范围的遮挡和缺失也同样适用,同时还适用于聚焦不清的图像和形状变形,因此在实际工程中应用比较广泛。但是,该方法也有其局限性,如果与参考图像相比,检测图像的位移、旋转或者缩放比较大,可能会导致匹配失败。所以一般应用在检测图像中指定匹配区域,然后在该区域中进行搜索。
二、使用基于相关性的匹配有如下步骤
①从参考图像上选择检测的目标。使用矩形选区等方法,从参考图像上选择一块ROI,然后使用reduce_domain算子将该区域裁剪成一个独立的图像区域。
②创建模板。用上一步裁剪后的图像创建一个归一化的互相关模型,使用的是create_ncc_model算子。
Matching / Correlation-Based 创建一个NCC(归一化算法,快速匹配)匹配模型。 create_ncc_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Metric : ModelID) Template:输入参数,输入的图像(单通道图像)的区域将被用来创建模型。 NumLevels:输入参数,金字塔的层数。默认'auto',范围【0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'auto'】。 该层级数可以通过get_ncc_model_params算子进行查看。 AngleStart:输入参数,最小旋转模式的起始角度。确定了模板图像可能出现在检测图像上的选择角度范围,在这个范围内的选择才有可能被搜索到。 注意:旋转的中心点是模板图像的重心。 AngleExtent:输入参数,输入角度范围(旋转的程度)。默认0.79,建议值【6.29, 3.14, 1.57, 0.79, 0.39】,范围 >= 0。 AngleStep:输入参数,角度变化的步长(分辨率)。 模型的角度变化是在检测前进行预处理,并将选择信息保存在内存中。因此,选择的角度大小和模型的点的数量决定了所需内存的大小。 【auto或0.0表示程序会自动确定合适的选择角度的步长】 默认'auto',建议值【'auto', 0.0, 0.0175, 0.0349, 0.0524, 0.0698, 0.0873】,范围【 AngleStep >= 0 && AngleStep <= pi / 16】 Metric:输入参数,匹配的方法。默认'use_polarity', 【 'ignore_global_polarity', 图像与模型有一定的差别,亮度变化可以忽略,如光线的原因导致物体比较暗的原因。 'use_polarity'图像与模型是颠倒(相反)的,也能够识别。 】 ModelID:输出参数,输出NCC匹配模型的句柄。{供匹配算子find_ncc_model调用,在该算子中有个MinSore用于指定匹配分数的最小值,即低于这个匹配分数的匹配结果就不需要返回了。由于匹配分数是从归一化的互相关系数中来的,为了提升匹配速度,这个分数的阈值应该尽可能设置得高一点,但是也要预防设得过高导致匹配失败} |
三、案例
*读取参考的原始图像。如果是彩色的,需要先转化为单通道灰度图像
read_image (Image, 'data/carmex-0')
rgb1_to_gray(Image, GrayImage)
get_image_size (GrayImage, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
*设置窗口绘制参数,线宽设为3
dev_set_line_width(3)
dev_set_draw ('margin')
*创建圆形,因为目标区域是圆形,因为用圆形将ROI区域选择出来
gen_circle (Circle, 161, 208, 80)
*获取圆形的中心点,为匹配后的可视化显示结果做准备
area_center (Circle, Area, RowRef, ColumnRef)
*裁剪ROI区域,得到模板图像
reduce_domain (GrayImage, Circle, ImageReduced)
*创建基于相关性的匹配模型,输入模板图像和模型参数
create_ncc_model (ImageReduced, 'auto', 0, 0, 'auto', 'use_polarity', ModelID)
*显示原始图像和圆形框
dev_display (GrayImage)
dev_display (Circle)
stop ()
*读取测试图像。该测试图像和参考图像比起来有轻微的位移,旋转,缩放,以及失焦
read_image (Image2, 'data/carmex-1')
rgb1_to_gray(Image2, GrayImage2)
*进行行基于相关性的模板匹配
find_ncc_model (GrayImage2, ModelID, 0, 0, 0.5, 1, 0.5, 'true', 0, Row, Column, Angle, Score)
vector_angle_to_rigid (RowRef, ColumnRef, 0, Row, Column, 0, HomMat2D)
*对圆形进行仿射变换,使其将匹配的结果目标标识出来
affine_trans_region (Circle, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
*显示测试画面和圆形标记圈
dev_display (GrayImage2)
dev_display (RegionAffineTrans)
*匹配结束,释放模板资源
clear_ncc_model (ModelID)
![](https://i-blog.csdnimg.cn/blog_migrate/3e25ae243df4b029bce08d6a1be9e50e.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/0a3de3b659e5539954dda667683443bf.jpeg)