基本概念
在图像中寻找目标图像(模板),或者说,就是在图像中寻找与模板图像相似部分的一种图像处理技术。依赖于选择的方法不同,模板匹配可以处理各种情形下的变换,如照明、杂点、大小、位置以及旋转,甚至模板内部的相对移动。
分类
HDevelop
开发环境中提供的匹配的方法主要有三种,即Component-Based
、Gray-Value-Based
、Shape-Based,
分别是基于组件(或成分、元素)的匹配,基于灰度值的匹配和基于形状的匹配。
总体流程
形状匹配
基本流程
详细步骤
- 读取图像,这里一定要是灰度图,如果是彩色图,先用
rgb1_to_gray()
转成灰度图像; - 确定
ROI
的区域。例如确定矩形,只需要确定矩形的左上点和右下点的坐标即可,利用gen_rectangle1()
生成一个矩形,利用area_center()
找到这个矩形的中心; - 从图像中获取这个
ROI
区域的图像,利用reduce_domain()
可以得到这个ROI
。在建立模板之前,可以先对这个区域进行一些预处理,方便以后的建模,比如阈值分割,形态学的一些处理等等(后续匹配时,也需要执行预处理操作); - 利用
create_shape_model()
创建模板。这个函数有许多参数,具体见下文分析; - 创建好模板后,这时还需要使用
inspect_shape_model()
来监视模板,它检查参数的适用性,还能帮助找到合适的参数;然后在使用get_shape_model_contours()
获得这个模板的轮廓,用于后面的匹配; - 创建好模板后,就可以打开另一幅图像,进行模板匹配了。这个过程就是在新图像中寻找与模板匹配的图像部分,利用
find_shape_model()
进行模板匹配,具体参数含义见下文分析; - 最后利用
vector_angle_to_rigid()
和affine_trans_contour_xld()
将其转化并显示。前一个是从一个点和角度计算一个刚体仿射变换,这个函数从匹配函数的结果中对构造一个刚体仿射变换(平移,旋转和缩放)很有用,把参考图像变为当前图像。
参数含义
create_shape_model()
1 | create_shape_model( |
NumLevels
越大,找到匹配使用的时间就越小。如果金字塔的层数太大,模板不容易识别出来,这是需要将find_shape_model
函数中MinScore
和Greediness
参数设置的低一些。如果金字塔层数太少找到模板的时间会增加。
AngleStart
和AngleExtent
决定可能的旋转范围,AngleStep
指定角度范围搜索的步长;
Optimization
:模板定位时使用的特征点的数量,模板点储存模式,设为none
时,全点储存。当模板较小时,较少点数并不会降低模板匹配时间。在模板数据量大时有必要降低数据量(point_reduction_high
),以提高定位速度。
Metric
定义了在图像中匹配模板的条件,如果Metric=use_polarity
,图像中的目标必须和模型具有一样的对比度。例如,如果模型是一个亮的目标在一个暗的背景上,那么仅仅那些比背景亮的目标可以找到。如果Metric=ignore_global_polarity
,在两者对比度完全相反时也能找到目标。在上面的例子中,如果目标是比背景暗的也能将目标找到。
Contras
决定着模型点的对比度。对比度是用来测量目标与背景之间和目标不同部分之间局部的灰度值差异。Contrast
的选择应该确保模板中的主要特征用于模型中。Contrast
也可以是两个数值,这时模板使用近似edges_image
函数中滞后阈值的算法进行分割。这里第一个数值是比较低的阈值,第二个数值是比较高的阈值。Contrast
也可以包含第三个,这个数值是在基于组件尺寸选择重要模型组件时所设置的阈值,比如,比指定的最小尺寸的点数还少的组件将被抑制。这个最小尺寸的阈值会在每相邻的金字塔层之间除以2
。如果一个小的模型组件被抑制,但是不使用滞后阈值,然而在Contrast
中必须指定三个数值,在这种情况下前两个数值设置成相同的数值。这个参数的设置可以在inspect_shape_model
函数中查看效果。如果Contrast
设置为auto
,create_shape_model
将会自动确定三个上面描述的数值。或者仅仅自动设置对比度(auto_contrast
),滞后阈值(auto_contrast_hyst
)或是 最小尺寸(auto_min_size
)中一个。其他没有自动设置的数值可以按照上面的格式再进行设置。可以允许各种组合,例如:如果设置 [‘auto_contrast’,’auto_min_size’],对比度和最小尺寸自动确定;如果设置 [‘auto_min_size’,20,30],最小尺寸会自动设定,而滞后阈值被设为20和30。有时候可能对比度阈值自动设置的结果是不满意的,例 如,由于一些具体应用的原因当某一个模型组件是被包含或是被抑制时,或是目标包含几种不同的对比度时,手动设置这些参数效果会更好。
MinContrast
用来确定在执行find_shape_model
函数进行识别时模型的哪一个对比度必须存在,也就是说,这个参数将模型从噪声图像中分离出来。因此一个好的选择应该是在图像中噪声所引起的灰度变化范围。例如,如果灰度浮动在10
个灰度级内,MinContrast
应该设置成10
。如果模板和搜索图像是多通道图像,Metric
参数设置成ignore_color_polarity
,在一个通道中的噪声必须乘以通道个数的平方根再去设置MinContrast
。例如,如果灰度值在一个通道的浮动范围是10
个灰度级,图像是三通道的,那么MinContrast
应该设置为17
。很显然,MinContrast
必须小于Contrast
。如果要在对比度较低的图像中识别模板,MinContrast
必须设置为一个相对较小的数值。如果要是模板即使严重遮挡(occluded
)也能识别出来,MinContrast
应该设置成一个比噪声引起的灰度浮动范围略大的数值,这样才能确保在find_shape_model
函数中提取出模板准确的位置和旋转角度。如果MinContrast
设置为auto
,最小对比度会基于模板图像中的噪声自动定义。因此自动设定仅仅在搜索图像和模板图像噪声近似时才可以使用。
find_shape_model()
1 | find_shape_model( |
Score
是一个0
到1
之间的数,是模板在搜索图像中可见比例的近似测量。如果模板的一半被遮挡,该值就不能超过0.5
。
Image
的domain
定义了模型参考点的搜索区域,参数AngleStart
和AngleExtent
确定了模型搜索的旋转角度,参数MinScore
定义模板匹配时至少有个什么样的质量系数才算是在图像中找到模板。MinScore
设置的越大,搜索的就越快。如果模板在图像中没有被遮挡, MinScore
可以设置为0.8
这么高甚至0.9
。
NumMatches
定义了在图像上找到模板的最大的个数。如果匹配时的质量系数大于MinScore
的目标个数多于NumMatches
,仅仅返回质量系数最好的NumMatches
个目标位置。如果找的匹配目标不足NumMatches
,那么就只返回找到的这几个。参数MinScore
优于NumMatches
。
如果模型具有对称性,会在搜索图像的同一位置和不同角度上找到多个与目标匹配的区域。参数MaxOverlap
是0
到1
之间的,定义了找到的两个目标区域最多重叠的系数,以便于把他们作为两个不同的目标区域分别返回。如果找到的两个目标区域彼此重叠并且大于MaxOverlap
,仅仅返回效果最好的一个。重叠的计算方法是基于找到的目标区域的任意方向的最小外接矩形(看smallest_rectangle2
)。如果MaxOverlap=0
, 找到的目标区域不能存在重叠, 如果MaxOverla p=1
,所有找到的目标区域都要返回。
SubPixel
确定找到的目标是否使用亚像素精度提取。如果SubPixel
设置为none
(或者false
背景兼容),模型的位置仅仅是一个像素精度和在create_shape_model
中定义的角度分辨率。如果SubPixel
设置为interpolation
(或true
),位置和角度都是亚像素精度的。在这种模式下模型的位置是在质量系数函数中插入的,这种模式几乎不花费计算时间,并且能达到足够高的精度,被广泛使用。
NumLevels
是在搜索时使用的金字塔层数,如有必要,层数截成创建模型时的范围。如果NumLevels=0
,使用创建模板时金字塔的层数。另外NumLevels
还可以包含第二个参数,这个参数定义了找到匹配模板的最低金字塔层数。NumLevels=[4,2]
表示匹配在第四层金字塔开始,在第二层金字塔找到匹配(最低的设为1
)。可以使用这种方法降低匹配的运行时间,但是这种模式下位置精度是比正常模式下低的,所谓正常模式是在金字塔最底层匹配。因此如果需要较高的精度,应该设置SubPixel
至少为least_squares
。如果金字塔最底层设置的过大,可能不会达到期望的精度,或者找到一个不正确的匹配区域。这是因为在较高层的金字塔上模板是不够具体的,不足以找到可靠的模板最佳匹配。在这种情况下最低金字塔层数应设为最小值。
参数Greediness
确定在搜索时的“贪婪程度”。如果Greediness=0
,使用一个安全的搜索启发式,只要模板在图像中存在就一定能找到模板,然而这种方式下搜索是相对浪费时间的。如果Greediness=1
,使用不安全的搜索启发式,这样即使模板存在于图像中,也有可能找不到模板,但只是少数情况。如果设置Greediness=0.9
,在几乎所有的情况下,总能找到模型的匹配。
实战代码解释
读取图像
1 | read_image (Image, 'C:/Users/Cxx/Desktop/Image.jpg') //读取图像 |
创建ROI
区域(人为给定取值)
1 | gen_circle (Circle, 270, 280, 90)//创建圆形区域 |
创建模板并监视模板
1 | create_scaled_shape_model (ImageReduced, 5, rad(-45), rad(90), 'auto', 0.8, 1.1, 'auto', 'auto', 'ignore_global_polarity', 'auto', 'auto', ModelID)// 准备一个可缩放比例的匹配轮廓模型 |
仿射变换
1 | dev_set_color ('red')//设置颜色 |
模板匹配
1 | read_image (Image1, 'C:/Users/Cxx/Desktop/Image1.jpg')//读取另一张图片 |
最终显示的模板匹配结果为:
其他
形态学
- 膨胀:通过结构元素(正方形,圆形等),对原图像进行对应法则处理,增加像素
- 腐蚀:减少像素
- 开运算:先腐蚀后膨胀,减少像素
- 闭运算:先膨胀后腐蚀,增加像素
注:
- 膨胀>闭运算,腐蚀>开运算
- 对二值化图像:腐蚀,膨胀等:改变形状;对灰度图像:腐蚀:变暗,膨胀:变亮,开闭运算同理。
Bloab分析
二值化->形态学->特征选择
预处理
- 中值滤波:求中间值,消除过亮或过暗的点,即消除椒盐噪声;
- 均值滤波:求均值
- 高斯滤波:加权值