两大图像匹配法的对比以及使用(基于像素匹配和基于特征匹配的区别)

图像匹配的方法主要分为基于灰度值相关和基于特征提取。

基于像素匹配:  

基于灰度值相关的方法直接对原图和模板图像进行操作,通过区域属性(灰度信息或频域分析等)的比较来反映他们之间的相似性。基于灰度的图像匹配具有速度、定位精度、误差估计等数据的输出。但是这种方式普遍存在的缺陷是时间复杂度高、对比图像尺寸敏感等。

原理:
NCC是一基于灰度相关的算法,具有不受比例因子误差影响和抗白噪干扰能力等优点。其原理是将模板图叠放在搜索图像上面平移,通过比较参考图像和输入图像在各个位置的相关系数,相关值最大的点就是最佳匹配位置。

如图所示,模板从原点坐标开始平移,每平移一个位置进行一轮基于像素差的相似度计算。

相关算子:
create_ncc_model(Template::NumLevels,AngleStart,AngleExtent,AngleStep,Metric:ModelID)
功能:使用图像创建NCC匹配模板
Template:模板图像
NumLevels:最高金字塔层数
AngleStart:开始角度
AngleExtent:角度范围
AngleStep:旋转角度步长
Metric:物体极性选择
ModelID:生成模板ID。

find_ncc_model(Image::ModelID,AngleStart,AngleExtent,MinScore,NumMatches,MaxOverlap,SubPixel,NumLevels:Row,Column,Angle,Score)
功能:搜索NCC最佳匹配模板
Image:要搜索的图像
ModelID:模板ID
AngleStart:起始角度
AngleExtent:角度范围
MinScore:最小匹配分数
NumMatches:匹配目标个数
MaxOverlap:最大重叠比值
SubPixel:是否亚像素级别
NumLevels:金字塔层数
Row:匹配目标的中心点行
Column:匹配目标的中心点列坐标
Angle:角度
Score:匹配的得分值

*清除模板ID
clear_ncc_model(ModelID)

测试:
测试图像:

halcon代码:

*基于灰度匹配
read_image (Image, 'D:/Halcon-WorkSpaces/Test/Image/test9.png')
*创建模板*********************
draw_rectangle1 (3600, Row1, Column1, Row2, Column2)
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
reduce_domain (Image, Rectangle, ImageReduced)
rgb1_to_gray (ImageReduced, GrayImage1)
threshold (GrayImage1, Regions, 0, 0)
reduce_domain (Image, Regions, ImageReduced1)
*创建ncc模板
create_ncc_model (ImageReduced, 'auto', 0, 0, 'auto', 'use_polarity', ModelID)
inspect_shape_model (ImageReduced, ModelImages, ModelRegions, 4, 30)
**模板匹配********************
dev_close_window ()
read_image (Image, 'D:/Halcon-WorkSpaces/Test/Image/test9.png')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)
find_ncc_model (Image, ModelID, 0, 0, 0.5, 0, 0.5, 'true', 0, Row, Column, Angle, Score)
for Index := 0 to |Row|-1 by 1
    disp_cross (WindowHandle, Row[Index], Column[Index], 100,0)
    disp_message(WindowHandle, '得分:'+Score[Index], 'image', Row[Index], Column[Index], 'red', 'false')
endfor
clear_ncc_model (ModelID)

测试结果:

显而易见,基于像素匹配与颜色无关

 

基于特征匹配:

特征匹配是指建立两幅图像中特征点之间对应关系的过程。

基于像素的匹配的缺陷:
基于灰度信息匹配的方式最大的缺点就是计算量相当大,其计算过程中有很多不必要的区域也进行了相关计算。其次,这种方式对图像灰度的变化比较敏感,对目标的变形、旋转以及遮挡也比较敏感。

基于特征匹配的优势:
由于图像中的图像特征点要比像素点要少很多,很大程度上减少了匹配过程的计算量。当然,图像过于复杂提取到的特征点多的话,也会明显感觉到匹配的时间。

相关算子:
inspect_shape_model(Image:ModelImages,ModelRegions:NumLevels,Contrast)
作用:根据金字塔层数和对比度检查要生成的模板是否合适。
Image:输入的图像
ModelImages:获得金字塔图像
ModelRegions:模板区域
NumLevels:金字塔层数
Contrast:对比度

create_shape_model(Template::NumLevels,AngleStart,AngleExtent,AngleStep,Optimization,Metric,Contrast,MinContrast:ModelID)
作用:使用图像创建形状匹配模板
Template:模板图像
NumLevels:最高金字塔层数
AngleStart:开始角度
AngleExtent:角度范围
AngleStep:旋转角度步长
Optimization:优化选项,是否减少模板点数(减少特征点数,优化匹配耗时同时可能造成误差)
Metric:匹配量极性选择
Contrast:阈值或滞后阈值来表示对比度
MinContrast:最小对比度
ModelID:生成模板ID

get_shape_model_contours(:ModelContours:ModelID,Level:)
功能:获取形状模板的轮廓
ModelContours:得到的轮廓XLD
ModelID:输入模板ID
Level:对应金字塔层数

find_shape_model(Image::ModelID,AngleStart,AngleExtent,MinScore,NumMatches,MaxOverlap,SubPixel,NumLevels,Greediness:Row,Column,Angle,Score)
作用:寻找单个形状模板最佳匹配
Image:要搜索的图像
ModelID:模板ID
AngleStart:开始角度
AngleExtent:角度范围
MinScore:最低分值
NumMatches:匹配实例个数
MaxOverlap:最大重叠
SubPixel:是否亚像素精度
NumLevels:金字塔层数
Greediness:贪婪值(0到1,值越大越不靠谱相对的数度越快)
Row:中心点坐标
Column:中心点坐标
Angle:缩放
Score:得分

测试:

测试图像:

 

halcon代码:

*基于形状的匹配
read_image (Image, 'C:/Users/斌/Desktop/test10.png')
*创建模板*********************
draw_rectangle1 (3600, Row1, Column1, Row2, Column2)
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
reduce_domain (Image, Rectangle, ImageReduced)
rgb1_to_gray (ImageReduced, GrayImage1)
threshold (GrayImage1, Regions, 0, 0)
reduce_domain (Image, Regions, ImageReduced1)
*创建 模板
create_shape_model (ImageReduced1, 'auto', 0, 0, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID1)
**模板匹配********************
dev_close_window ()
read_image (Image, 'C:/Users/斌/Desktop/test10.png')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)
find_shape_model (Image, ModelID1, 0, 0, 0.5, 0, 0.5, 'least_squares', 0, 0.5, Row, Column, Angle, Score)
for Index := 0 to |Row|-1 by 1
    disp_cross (WindowHandle, Row[Index], Column[Index], 100,0)
    disp_message(WindowHandle, '得分:'+Score[Index], 'image', Row[Index], Column[Index], 'red', 'false')
endfor
get_shape_model_contours (ModelContours, ModelID1, 1)
clear_shape_model (ModelID1)

(以实心矩形为模板)

特征模板:

 

匹配结果:

(以空心矩形为模板)

模板特征:

匹配结果:
 

图中表示为,选取两组不同的模板,一组为实心矩形,另一组是空心矩形。我们可以看到选择以实心矩形为模板的其它6个图形(包括空心矩形)匹配得分都是0.9978;选择以空心矩形为模板,其中3个实心矩形匹配得分为0.910035,3个空心矩形匹配得分为0.999645.因此我们得到以下结论:

1、基于特征的匹配只计算匹配图像中的感兴趣特征点,除此之外的特征忽略。

2、特征匹配的得分也是通过计算相似特征的占比。

 

基于像素匹配的同类测试:

测试代码:

*基于灰度匹配
read_image (Image, 'C:/Users/斌/Desktop/test10.png')
rgb1_to_gray (Image, GrayImage)
*创建模板*********************
draw_rectangle1 (3600, Row1, Column1, Row2, Column2)
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
reduce_domain (GrayImage, Rectangle, ImageReduced)
rgb1_to_gray (ImageReduced, GrayImage1)
threshold (GrayImage1, Regions, 0, 0)
reduce_domain (Image, Regions, ImageReduced1)
*创建ncc模板
create_ncc_model (ImageReduced, 'auto', 0, 0, 'auto', 'use_polarity', ModelID)
inspect_shape_model (ImageReduced, ModelImages, ModelRegions, 4, 30)
**模板匹配********************
dev_close_window ()
read_image (Image, 'C:/Users/斌/Desktop/test10.png')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)
find_ncc_model (GrayImage, ModelID, 0, 0, 0.5, 0, 0.5, 'true', 0, Row, Column, Angle, Score)
for Index := 0 to |Row|-1 by 1
    disp_cross (WindowHandle, Row[Index], Column[Index], 100,0)
    disp_message(WindowHandle, '得分:'+Score[Index], 'image', Row[Index], Column[Index], 'red', 'false')
endfor
clear_ncc_model (ModelID)

测试结果

(以实心矩形为模板)

 

(以空心矩形为模板)

 

对比基于像素匹配和基于特征匹配的两组测试,它们之间的差异就显现出来了。

 

  • 9
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值