图像匹配的方法主要分为基于灰度值相关和基于特征提取。
基于像素匹配:
基于灰度值相关的方法直接对原图和模板图像进行操作,通过区域属性(灰度信息或频域分析等)的比较来反映他们之间的相似性。基于灰度的图像匹配具有速度、定位精度、误差估计等数据的输出。但是这种方式普遍存在的缺陷是时间复杂度高、对比图像尺寸敏感等。
原理:
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)
测试结果:
(以实心矩形为模板)
(以空心矩形为模板)
对比基于像素匹配和基于特征匹配的两组测试,它们之间的差异就显现出来了。