Mahotas - 模板匹配
模板匹配是一种用于在较大图像中定位特定图像(模板)的技术。简单来说,目标是找到较小图像与较大图像匹配的位置。
模板匹配涉及将模板图像与较大图像的不同区域进行比较。在比较过程中,模板图像的不同属性(例如大小、形状、颜色和强度值)与较大图像进行匹配。
比较一直持续到在模板图像和较大图像之间找到最佳匹配的区域为止。
Mahotas 中的模板匹配
在 Mahotas 中,我们可以使用 mahotas.template_match() 函数执行模板匹配。该函数将模板图像与较大图像中与模板图像大小相同的每个区域进行比较。
该函数使用平方差和 (SSD) 方法执行模板匹配。 SSD 方法的工作方式如下 −
第一步是计算模板图像和较大图像的像素值之间的差异。
下一步,对差异求平方。
最后,对较大图像中所有像素的平方差异求和。
最终的 SSD 值决定了模板图像和较大图像之间的相似性。值越小,模板图像与较大图像之间的匹配度就越高。
mahotas.template_match() 函数
mahotas.template_match() 函数以图像和模板图像作为输入。
它从较大图像中返回与输入模板图像最匹配的区域。
最佳匹配是具有最低 SSD 值的区域。
语法
以下是 mahotas − 中 template_match() 函数的基本语法
mahotas.template_match(f, template, mode='reflect', cval=0.0, out=None)
其中,
f −它是输入图像。
template − 它是将与输入图像匹配的模式。
mode(可选) − 它确定当模板应用于其边界附近时如何扩展输入图像(默认为"反射")。
cval(可选) − 当模式为"常量"时,它是用于填充的常量值(默认值为 0.0)。
out(可选) − 它定义存储输出图像的数组(默认值为 None)。
示例
在下面的示例中,我们使用 mh.template_match() 函数执行模板匹配。
import mahotas as mh import numpy as np import matplotlib.pyplot as mtplt # 加载图像 image = mh.imread('tree.tiff', as_grey=True) template = mh.imread('cropped tree.tiff', as_grey=True) # 应用模板匹配算法 template_matching = mh.template_match(image, template) # 为子图创建图形和轴 fig, axis = mtplt.subplots(1, 3) # 显示原始图像 axes[0].imshow(image, cmap='gray') axes[0].set_title('Original Image') axes[0].set_axis_off() # 显示模板图像 axes[1].imshow(template, cmap='gray') axes[1].set_title('Template Image') axes[1].set_axis_off() # 显示匹配的图像 axes[2].imshow(template_matching, cmap='gray') axes[2].set_title('Matched Image') axes[2].set_axis_off() # 调整子图之间的间距 mtplt.tight_layout() # 显示图形 mtplt.show()
输出
以下是上述代码的输出 −

通过包裹边界进行匹配
在 Mahotas 中执行模板匹配时,我们可以包裹图像的边界。包裹边界是指将图像边界折叠到图像的另一侧。
因此,边界外的像素会在图像的另一侧重复出现。
这有助于我们在模板匹配期间处理图像边界外的像素。
在 mahotas 中,我们可以在执行模板匹配时通过为 template_match() 函数的 mode 参数指定值"wrap"来包裹图像的边界。
示例
在下面提到的示例中,我们通过包裹图像的边界来执行模板匹配。
import mahotas as mh import numpy as np import matplotlib.pyplot as mtplt # 加载图像 image = mh.imread('sun.png', as_grey=True) template = mh.imread('cropped sun.png', as_grey=True) # 应用模板匹配算法 template_matching = mh.template_match(image, template, mode='wrap') # 为子图创建图形和轴 fig, axis = mtplt.subplots(1, 3) # 显示原始图像 axes[0].imshow(image, cmap='gray') axes[0].set_title('Original Image') axes[0].set_axis_off() # 显示模板图像 axes[1].imshow(template, cmap='gray') axes[1].set_title('Template Image') axes[1].set_axis_off() # 显示匹配的图像 axes[2].imshow(template_matching, cmap='gray') axes[2].set_title('Matched Image') axes[2].set_axis_off() # 调整间距子图 mtplt.tight_layout() # 显示图形 mtplt.show()
输出
上述代码的输出如下 −

忽略边界匹配
我们还可以通过忽略图像的边界来执行模板匹配。通过忽略边界,在执行模板匹配时排除超出图像边界的像素。
在 mahotas 中,我们为 template_match() 函数的 mode 参数指定值"ignore",以在执行模板匹配时忽略图像的边界。
示例
在这里,我们在执行模板匹配时忽略图像的边界。
import mahotas as mh import numpy as np import matplotlib.pyplot as mtplt # 加载图像 image = mh.imread('nature.jpeg', as_grey=True) template = mh.imread('cropped nature.jpeg', as_grey=True) # 应用模板匹配算法 template_matching = mh.template_match(image, template, mode='ignore') # 为子图创建图形和轴 fig, axis = mtplt.subplots(1, 3) # 显示原始图像 axes[0].imshow(image, cmap='gray') axes[0].set_title('Original Image') axes[0].set_axis_off() # 显示模板图像 axes[1].imshow(template, cmap='gray') axes[1].set_title('Template Image') axes[1].set_axis_off() # 显示匹配的图像 axes[2].imshow(template_matching, cmap='gray') axes[2].set_title('Matched Image') axes[2].set_axis_off() # 调整子图之间的间距 mtplt.tight_layout() # 显示图 mtplt.show()
输出
执行上述代码后,我们得到以下输出 −
