经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。 |
前面我们通过图像直方图反向投影的方式在图像中寻找模板图像,由于直方图不能直接反应图像的纹理,因此如果两张不同模板图像具有相同的直方图分布特性,那么在同一张图中对这两张模板图像的直方图进行反向投影,最终结果将不具有参考意义。因此,我们在图像中寻找模板图像时,可以直接通过比较图像像素的形式来搜索是否存在相同的内容,这种通过比较像素灰度值来寻找相同内容的方法叫做图像的模板匹配。
模板匹配常用于在一幅图像中寻找特定内容的任务中。由于模板图像的尺寸小于待匹配图像的尺寸,同时又需要比较两张图像中的每一个像素的灰度值,因此常采用在待匹配图像中选择与模板相同尺寸的滑动窗口,通过比较滑动窗口与模板的相似程度,判断待匹配图像中是否含有与模板图像相同的内容,其原理如图4-11所示。
在图4-11中,右侧4×4的图像是模板图像,每个像素中的数字是该像素的灰度值,左侧8×8图像是待匹配图像,模板匹配的流程如下:
- Step1:在待匹配图像中选取与模板尺寸大小相同的滑动窗口,如图4-11中的阴影区域所示。
- Step2:比较滑动窗口中每个像素与模板中对应像素灰度值的关系,计算模板与滑动窗口的相似性。
- Step3:将滑动窗口从左上角开始先向右滑动,滑动到最右边后向下滑动一行,从最左侧重新开始滑动,记录每一次移动后计算的模板与滑动窗口的相似性。
- Step4:比较所有位置的相似性,选择相似性最大的滑动窗口作为备选匹配结果。
OpenCV 4中提供了用于图像模板匹配的函数matchTemplate(),该函数能够实现模板匹配过程中图像与模板相似性的计算,在代码清单4-12中给出了函数原型。
代码清单4-12 matchTemplate()函数原型
1. void cv::matchTemplate(InputArray image,
2. InputArray templ,
3. OutputArray result,
4. int method,
5. InputArray mask = noArray()
6. )
- image:待模板匹配的原图像,图像数据类型为CV_8U和CV_32F两者中的一个。
- templ:模板图像,需要与image具有相同的数据类型,但是尺寸不能大于image。
- result:模板匹配结果输出图像,图像数据类型为CV_32F。如果image的尺寸为W×H,模板图像尺寸为w×h,则输出图像的尺寸为(W-w+1)×(H-h+1)。
- method:模板匹配方法标志,可选择参数及含义在表4-3中给出。
- mask:匹配模板的掩码,必须与模板图像具有相同的数据类型和尺寸,默认情况下不设置,目前仅支持在TM_SQDIFF和TM_CCORR_NORMED这两种匹配方法时使用。
该函数同时支持灰度图像和彩色图像两种图像的模板匹配。函数前两个参数为输入的原图像和模板图像,由于是在原图像中搜索是否存在与模板图像相同的内容,因此需要模板图像的尺寸小于原图像,并且两者必须具有相同的数据类型。第三个参数为相似性矩阵,滑动窗口与模板的相似性系数存放在滑动窗口左上角第一个像素处,因此输出的相似性矩阵尺寸要小于原图像的尺寸,如果image的尺寸为W×H,模板图像尺寸为w×h,则输出图像的尺寸为(W-w+1)×(H-h+1)。因为在模板匹配中原图像不需要进行尺寸的外延,所以滑动窗口左上角可以移动的范围要小于原图像的尺寸。无论输入的是彩色图像还是灰度图像,函数输出结果都是单通道矩阵。了解相似性系数记录的方式便于寻找到与模板最相似的滑动窗口,继而在原图中标记出与模板相同的位置。函数第四个参数是滑动窗口与模板相似性系数的计算方式,OpenCV 4提供了多种计算方法,所有可以选择的标志参数在表4-3中给出,接下来对每一种方法进行详细介绍。
标志参数 | 简记 | 作用 |
---|---|---|
TM_SQDIFF | 0 | 平方差匹配法 |
TM_SQDIFF_NORMED | 1 | 归一化平方差匹配法 |
TM_CCORR | 2 | 相关匹配法 |
TM_CCORR_NORMED | 3 | 归一化相关匹配法 |
TM_CCOEFF | 4 | 系数匹配法 |
TM_CCOEFF_NORMED | 5 | 归一化相关系数匹配法 |
(1)TM_SQDIFF:
该方法名为平方差匹配法,计算的公式如式(6.9)所示,这种方法利用平方差来进行匹配,当模板与滑动窗口完全匹配时计算数值为0,两者匹配度越低计算数值越大。
R ( x , y ) = ∑ x ′ , y ′ ( T ( x ′ , y ′ ) − I ( x + x ′ , y + y ′ ) ) 2 (6.9) R(x,y) = \sum\limits_{x',y'} {
{
{(T(x',y') - I(x + x',y + y'))}^2}} \tag{6.9} R(x,y)=x′,y′∑(T(x′,y′)−I(x+x′,y+y′))2(6.9)
其中 表示模板图像, 表示原图像。
(2)TM_SQDIFF_NORMED:
该方法名为归一化平方差匹配方法,计算公式如式(6.10)所示,这种方法是将平方差方法进行归一化,使得输入结果缩放到了0到1之间,当模板与滑动窗口完全匹配时计算数值为0,两者匹配度越低计算数值越大。
R ( x , y ) = ∑ x ′ , y ′ ( T ( x ′ , y ′ ) − I ( x + x ′ , y + y ′ ) ) 2 ∑ x ′ , y ′ T ( x ′ , y ′ ) 2 ∗ ∑ x ′ , y ′ I ( x + x ′ , y + y ′ ) 2 (6.10) R(x,y) = \frac{
{\sum\limits_{x',y'} {
{
{(T(x',y') - I(x + x',y + y'))}^2}} }}{
{\sqrt {\sum\limits_{x',y'} {T{
{(x',y')}^2}} * \sum\limits_{x',y'} {I{
{(x + x',y + y')}^2}} } }} \tag{6.10} R(x,y)=x′,y′∑T(x′,y′)2∗x′,y′∑I(x+x′,y