15、OpenCV形态学操作——Hit-or-Miss

OpenCV形态学操作——Hit-or-Miss

一、学习目标

  • 理解什么是Hit-or-Miss
  • 学会在OpenCV中使用Hit-or-Miss

二、Hit-or-Miss

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

Hit-or-Miss操作对于在二值图像中寻找指定模式是很有用的。它能发现那些邻域像素匹配第一个结构元素B1的形状而同时不匹配第二个结构元素B2的形状的像素。从数学上讲,对图像A进行Hit-or-Miss的操作可以表示为:

在这里插入图片描述
因此,Hit-or-Miss操作包括三个步骤:

  • 使用结构元素B1 腐蚀图像A
  • 使用结构元素B2 腐蚀图像A的补,即AC
  • 对步骤1和步骤2的结果进行AND操作

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

在这里插入图片描述

结构元素(内核)。左:'hit'内核。中间:'miss'内核。右边:最终的组合内核

在本例中,我们试图寻找一种模式,其中中心像素属于背景(-1),而中心像素的上下左右相邻的像素属于前景。其他邻域像素可以是任何类型的,我们不关心它们。现在,让我们把这个内核应用到输入图像上:
在这里插入图片描述
使用上述结构元素进行Hit-or-Miss操作后得到如下结果:

在这里插入图片描述
可以看到,该图像仅有一个符合模式的地方。

OpenCV中,使用函数cv::morphologyEx实现Hit-or-Miss操作,指定op参数为MORPH_HITMISS即可,函数在前面的教程中已经详细介绍过,此处不再赘述。

使用实例:

#include<opencv2/opencv.hpp>
using namespace cv;

int main(int argc, char** argv)
{
    // 定义输入图像像素矩阵,0代表背景(黑色),255代表前景(白色)
    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);
    // 自定义结构元素,0表示无关紧要,1表示匹配的前景元素,0表示匹配的背景元素
    Mat kernel = (Mat_<uchar>(3, 3) <<
        0, 1, 0,
        1, -1, 1,
        0, 1, 0);

    Mat output_image;
    // 调用API执行Hit-or-Miss操作,与其它形态学操作的调用方式类似
    morphologyEx(input_image, output_image, MORPH_HITMISS, kernel);

    const int rate = 50;
    // 将kernel同比扩大50倍后可视化,注意需要调用函数cpnvertTo转换数值类型即图像的深度depth
    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);
	system("pause");
	return EXIT_SUCCESS;
}

在这里插入图片描述
你也可以使用其它的结构元素,如:
在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值