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 (可选)** - 确定在模板应用于其边界附近时如何扩展输入图像(默认值为“reflect”)。

  • **cval (可选)** - 当 mode 为“constant”时使用的填充常数值(默认为 0.0)。

  • **out (可选)** - 定义存储输出图像的数组(默认为 None)。

示例

在下面的示例中,我们使用 mh.template_match() 函数执行模板匹配。

import mahotas as mh
import numpy as np
import matplotlib.pyplot as mtplt
# Loading the images
image = mh.imread('tree.tiff', as_grey=True)
template = mh.imread('cropped tree.tiff', as_grey=True)
# Applying template matching algorithm
template_matching = mh.template_match(image, template)
# Creating a figure and axes for subplots
fig, axes = mtplt.subplots(1, 3)
# Displaying the original image
axes[0].imshow(image, cmap='gray')
axes[0].set_title('Original Image')
axes[0].set_axis_off()
# Displaying the template image
axes[1].imshow(template, cmap='gray')
axes[1].set_title('Template Image')
axes[1].set_axis_off()
# Displaying the matched image
axes[2].imshow(template_matching, cmap='gray')
axes[2].set_title('Matched Image')
axes[2].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()
输出

以下是上述代码的输出:

Template Matching

通过包裹边界进行匹配

在 Mahotas 中执行模板匹配时,我们可以包裹图像的边界。包裹边界是指将图像边界折叠到图像的另一侧。

因此,边界之外的像素会在图像的另一侧重复。

这有助于我们在模板匹配过程中处理图像边界之外的像素。

在 mahotas 中,我们可以通过将值“wrap”指定给 template_match() 函数的 **mode** 参数来包裹图像的边界,从而执行模板匹配。

示例

在下面提到的示例中,我们通过包裹图像的边界来执行模板匹配。

import mahotas as mh
import numpy as np
import matplotlib.pyplot as mtplt
# Loading the images
image = mh.imread('sun.png', as_grey=True)
template = mh.imread('cropped sun.png', as_grey=True)
# Applying template matching algorithm
template_matching = mh.template_match(image, template, mode='wrap')
# Creating a figure and axes for subplots
fig, axes = mtplt.subplots(1, 3)
# Displaying the original image
axes[0].imshow(image, cmap='gray')
axes[0].set_title('Original Image')
axes[0].set_axis_off()
# Displaying the template image
axes[1].imshow(template, cmap='gray')
axes[1].set_title('Template Image')
axes[1].set_axis_off()
# Displaying the matched image
axes[2].imshow(template_matching, cmap='gray')
axes[2].set_title('Matched Image')
axes[2].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()

输出

上述代码的输出如下:

Template Matching1

通过忽略边界进行匹配

我们还可以通过忽略图像的边界来执行模板匹配。在通过忽略边界执行模板匹配时,超出图像边界的像素将被排除。

在 mahotas 中,我们通过将值“ignore”指定给 template_match() 函数的 **mode** 参数来忽略图像的边界,从而执行模板匹配。

示例

在这里,我们在执行模板匹配时忽略图像的边界。

import mahotas as mh
import numpy as np
import matplotlib.pyplot as mtplt
# Loading the images
image = mh.imread('nature.jpeg', as_grey=True)
template = mh.imread('cropped nature.jpeg', as_grey=True)
# Applying template matching algorithm
template_matching = mh.template_match(image, template, mode='ignore')
# Creating a figure and axes for subplots
fig, axes = mtplt.subplots(1, 3)
# Displaying the original image
axes[0].imshow(image, cmap='gray')
axes[0].set_title('Original Image')
axes[0].set_axis_off()
# Displaying the template image
axes[1].imshow(template, cmap='gray')
axes[1].set_title('Template Image')
axes[1].set_axis_off()
# Displaying the matched image
axes[2].imshow(template_matching, cmap='gray')
axes[2].set_title('Matched Image')
axes[2].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()

输出

执行上述代码后,我们将得到以下输出:

Matching Ignoring Boundaries
广告