Skip to content

击中击不中变换

本教程中你将学到如何使用击中击不中变换(Hit-or-Miss transform,也称为 Hit-and-Miss transform)在二值图像中寻找给定的配置或模式。 这种变换也是更高级形态学运算(如细化 thinning 或剪枝 pruning)的基础。

我们将使用 OpenCV 函数 morphologyEx()。

形态学算子基于形状处理图像。这些算子对一个输入图像应用一个或多个结构元素以获得输出图像。 两种基本的形态学运算是腐蚀与膨胀。这两种运算的组合可生成诸如开运算、闭运算或 top-hat 变换等高级形态学变换。 要了解更多关于这些及其他基本形态学运算的内容,请参阅前面的教程(Eroding and Dilating)与(More Morphology Transformations)。

击中击不中变换可用于在二值图像中寻找模式。具体而言,它找出那些邻域与第一个结构元素 B1B_1 的形状相匹配,同时又与第二个结构元素 B2B_2 的形状不匹配的像素。在数学上,对图像 AA 应用的这一运算可表示如下:

A⊛B=(A⊖B1)∩(Ac⊖B2) A\circledast B = (A\ominus B_1) \cap (A^c\ominus B_2)

因此,击中击不中运算包含三个步骤: 1. 用结构元素 B1B_1 对图像 AA 做腐蚀。 2. 用结构元素 B2B_2 对图像 AA 的补集(AcA^c)做腐蚀。 3. 将第 1 步与第 2 步的结果做 AND(与)运算。

结构元素 B1B_1 与 B2B_2 可合并为单个元素 BB。来看一个例子:

在本例中,我们要寻找这样的模式:中心像素属于背景,而其北、南、东、西的像素属于前景。邻域中的其余像素可以是任意类型,我们不在意它们。现在,我们将这个核应用到一幅输入图像上:

可以看到,该模式在图像中仅在一处被找到。

hitmiss_kernels.png hitmiss_input.png hitmiss_output.png

与前例对应的代码如下所示。

你也可以从 这里 下载。 代码见下方示例 你也可以从 这里 下载。 代码见下方示例 你也可以从 这里 下载。 代码见下方示例 如你所见,只需使用函数 morphologyEx(),配合运算类型 MORPH_HITMISS 以及所选核即可。

下面是将不同核应用到之前所用同一输入图像上得到的输出结果:

现在,试试你自己设计的模式吧!

hitmiss_example2.png hitmiss_example3.png