Mahotas - 命中与未命中变换
命中与未命中变换是一种二元形态学运算,用于检测图像中的特定图案或形状。
该运算将结构元素与输入二元图像进行比较。结构元素由前景 (1) 和背景 (0) 像素组成,这些像素以特定图案排列,代表要检测的所需形状或图案。
命中或未命中变换在结构元素和图像之间执行逐像素逻辑与运算,然后检查结果是否符合预定义条件。
条件指定匹配图案中应存在的前景和背景像素的确切排列。如果满足条件,则将输出像素设置为 1,表示匹配;否则,将其设置为 0。
Mahotas 中的命中和未命中变换
在 Mahotas 中,我们可以使用 mahotas.hitmiss() 函数对图像执行命中和未命中变换。该函数使用结构元素 'Bc' 来确定输入图像中是否存在特定模式。
Mahotas 中的结构元素可以采用三个值:0、1 或 2。值 1 表示结构元素的前景,而 0 表示背景。
值 2 用作"无关"值,意味着不应针对该特定像素执行匹配。
要识别匹配,结构元素的值必须与输入图像中相应的像素值重叠。
如果重叠满足结构元素指定的条件,则认为该像素匹配。
mahotas.hitmiss() 函数
mahotas.hitmiss() 将灰度图像作为输入并返回二值图像作为输出。白色像素表示结构元素与输入图像匹配的区域,而黑色像素表示不匹配的区域。
语法
以下是 mahotas − 中 hitmiss() 函数的基本语法
mahotas.hitmiss(input, Bc, out=np.zeros_like(input))
其中,
input − 为输入的灰度图像。
Bc − 为输入图像中需要匹配的模式。其值为 0、1 或 2。
out(可选) −它定义了在哪个数组中存储输出图像(默认大小与输入相同)。
示例
以下示例使用 mh.hitmiss() 函数显示图像上的命中和未命中转换。
import mahotas as mh import numpy as np import matplotlib.pyplot as mtplt # 加载图像 image = mh.imread('tree.tiff') # 将其转换为灰度 image = mh.colors.rgb2gray(image) # 应用阈值 threshold_image = mh.thresholding.bernsen(image, 5, 200) # 创建命中和未命中模板 template = np.array([[1, 2, 1, 2, 1],[2, 1, 1, 1, 2],[2, 2, 1, 2, 2]]) # 应用命中和未命中未命中变换 hit_miss = mh.hitmiss(threshold_image, template) # 为子图创建图形和轴 fig, axis = mtplt.subplots(1, 2) # 显示原始图像 axes[0].imshow(image, cmap='gray') axes[0].set_title('Original Image') axes[0].set_axis_off() # 显示命中和未命中变换后的图像 axes[1].imshow(hit_miss, cmap='gray') axes[1].set_title('命中和未命中变换后的图像') axes[1].set_axis_off() # 调整子图之间的间距 mtplt.tight_layout() # 显示图形 mtplt.show()
输出
以下是上述代码的输出 −

通过检测边缘
我们还可以通过应用 Hit & Miss 变换来检测图像的边缘。边缘表示图像中不同区域之间的边界。
这些区域相邻像素之间的强度值差异较大。
在 mahotas 中,要使用 Hit & Miss 变换检测边缘,我们首先创建一个结构元素。此结构元素将模板的边缘与输入图像进行匹配。
然后,我们对图像执行阈值处理,然后将结构元素作为 Bc 参数传递给 hitmiss() 函数。
例如,以下结构元素可用于检测输入图像中的边缘 −
[[1, 2, 1] [2, 2, 2] [1, 2, 1]]
在这里,1 位于结构元素的最右上、最左上、最右下和最左下的位置。边缘通常出现在图像中的这些位置。
结构元素中的 1 与图像中强度值为 1 的像素相匹配,从而将边缘突出显示为前景。
示例
在此示例中,我们尝试通过应用 Hit & Miss 变换 − 来检测图像的边缘。
import mahotas as mh import numpy as np import matplotlib.pyplot as mtplt # 加载图像 image = mh.imread('nature.jpeg') # 将其转换为灰度 image = mh.colors.rgb2gray(image).astype(np.uint8) # 应用阈值 threshold_value = mh.thresholding.rc(image) threshold_image = image > Threshold_value # 创建命中和未命中模板 template = np.array([[1, 2, 1],[2, 2, 2],[1, 2, 1]]) # 应用命中和未命中未命中变换 hit_miss = mh.hitmiss(threshold_image, template) # 为子图创建图形和轴 fig, axis = mtplt.subplots(1, 2) # 显示原始图像 axes[0].imshow(image, cmap='gray') axes[0].set_title('Original Image') axes[0].set_axis_off() # 显示命中和未命中变换后的图像 axes[1].imshow(hit_miss, cmap='gray') axes[1].set_title('命中和未命中变换后的图像') axes[1].set_axis_off() # 调整子图之间的间距 mtplt.tight_layout() # 显示图形 mtplt.show()
输出
上述代码的输出如下 −

通过检测对角线
我们也可以使用 Hit & Miss 变换来检测图像的对角线。对角线由连接图像对角的线性图案表示。
这些是像素强度沿对角线路径变化的区域。
在 mahotas 中,我们首先对输入图像执行阈值处理。然后,我们将结构元素作为 Bc 参数传递给 hitmiss() 函数。该结构元素将模板的对角线与输入图像的对角线进行匹配。
例如,以下结构元素可用于检测输入图像中的对角线 −
[[0, 2, 0] [2, 0, 2] [0, 2, 0]]
在这里,0 沿着对角线路径从最左上角到最右下角,从最右上角到最左下角。对角线通常出现在图像中的这些位置。
结构元素中的 0 与图像中强度值为 0 的像素相匹配,从而将对角线突出显示为背景。
示例
在这里,我们尝试使用 Hit & Miss 变换 − 检测图像的对角线
import mahotas as mh import numpy as np import matplotlib.pyplot as mtplt # 加载图像 image = mh.imread('sun.png') # 将其转换为灰度 image = mh.colors.rgb2gray(image) # 应用阈值 threshold_image = mh.thresholding.bernsen(image, 10, 10) # 创建命中和未命中模板 template = np.array([[0, 2, 0],[2, 0, 2],[0, 2, 0]]) # 应用命中和未命中未命中变换 hit_miss = mh.hitmiss(threshold_image, template) # 为子图创建图形和轴 fig, axis = mtplt.subplots(1, 2) # 显示原始图像 axes[0].imshow(image, cmap='gray') axes[0].set_title('Original Image') axes[0].set_axis_off() # 显示命中和未命中变换后的图像 axes[1].imshow(hit_miss, cmap='gray') axes[1].set_title('命中和未命中变换后的图像') axes[1].set_axis_off() # 调整子图之间的间距 mtplt.tight_layout() # 显示图形 mtplt.show()
输出
执行上述代码后,我们得到以下输出 −
