【opencv 450 Image Processing】Hit-or-Miss

Goal

在本教程中,您将学习如何使用 Hit-or-Miss 变换(也称为 Hit-and-Miss 变换)在二进制图像中找到给定的配置或模式(-1对应背景,1对应前景。找到邻域与内核模式一样的像素)。 这种变换也是更高级的形态学操作(例如细化修剪)的基础。

In this tutorial you will learn how to find a given configuration or pattern in a binary image by using the Hit-or-Miss transform (also known as Hit-and-Miss transform). This transform is also the basis of more advanced morphological operations such as thinning or pruning.

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

Hit-or-Miss theory

形态学算子根据图像的形状处理图像。 这些运算符将一个或多个结构元素应用于输入图像以获得输出图像。 两个基本的形态学运算是腐蚀和膨胀。 这两个操作的组合产生了高级形态变换,例如开、闭或顶帽变换。 要了解更多关于这些和其他基本形态学操作的信息,请参阅之前的教程(腐蚀和膨胀)和(更多形态学转换)。

Hit-or-Miss 变换对于查找二值图像中的patterns模式很有用。 特别地,它找到那些邻域与第一结构元素B1的形状匹配但同时不与第二结构元素B2的形状匹配的像素。 在数学上,应用于图像 A 的操作可以表示如下:

 

因此,hit-or-miss 操作包括三个步骤:

用结构元素 B1 腐蚀图像 A。

用结构元素 B2 腐蚀图像 A () 的补码。

 

AND 来自第 1 步和第 2 步的结果。

结构元素 B1 和 B2 可以组合成单个元素 B。让我们看一个例子:

 

结构元素(内核)。 左:要“命中”的内核。 中间:内核“错过”。 右:最终组合内核

Structuring elements (kernels). Left: kernel to 'hit'. Middle: kernel to 'miss'. Right: final combined kernel

在这种情况下,我们正在寻找一种模式,其中中心像素属于背景,而北、南、东、西像素属于前景。 邻域中的其余像素可以是任何类型的,我们不关心它们。 现在,让我们将此内核应用于输入图像:

 

Input binary image

 

Output binary image

您可以看到该图案仅在图像中的一个位置找到。

Code

与上一个示例对应的代码如下所示。

你也可以从这里下载 raw.githubusercontent.com

#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
using namespace cv;
int main(){
    Mat input_image = (Mat_<uchar>(8, 8) <<
        0, 0, 0, 0, 0, 0, 0, 0,
        0, 255, 255, 255, 0, 0, 0, 255,
        0, 255, 255, 255, 0, 0, 0, 0,
        0, 255, 255, 255, 0, 255, 0, 0,
        0, 0, 255, 0, 0, 0, 0, 0,
        0, 0, 255, 0, 0, 255, 255, 0,
        0, 255, 0, 255, 0, 0, 255, 0,
        0, 255, 255, 255, 0, 0, 0, 0);
    Mat kernel = (Mat_<int>(3, 3) <<
        0, 1, 0,
        1, -1, 1,
        0, 1, 0);
    Mat output_image;
    morphologyEx(input_image, output_image, MORPH_HITMISS, kernel);
    const int rate = 50;
    kernel = (kernel + 1) * 127;
    kernel.convertTo(kernel, CV_8U);
    resize(kernel, kernel, Size(), rate, rate, INTER_NEAREST);
    imshow("kernel", kernel);
    moveWindow("kernel", 0, 0);
    resize(input_image, input_image, Size(), rate, rate, INTER_NEAREST);
    imshow("Original", input_image);
    moveWindow("Original", 0, 200);
    resize(output_image, output_image, Size(), rate, rate, INTER_NEAREST);
    imshow("Hit or Miss", output_image);
    moveWindow("Hit or Miss", 500, 200);
    waitKey(0);
    return 0;
}

如您所见,它就像使用具有操作类型 MORPH_HITMISS 和所选内核的函数morphologyEx() 一样简单。

Other examples

在这里,您可以找到将不同内核应用于之前使用的相同输入图像的输出结果:

 

查找右上角的内核和输出结果

 

查找左端点的内核和输出结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值