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

2023-11-10

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;
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

15、OpenCV形态学操作——Hit-or-Miss 的相关文章

  • Centos7 安装vm tools 工具 (命令行版本)

    一 准备工作 1 菜单栏安装VMware Tools 点击VMware菜单栏 虚拟机 选择 安装VMware Tools 如果安装了早期版本的VMware Tools 则菜单项为 更新VMware Tools 2 装载CD ROM 查看 虚
  • CentOS 安装redis及nginx报错:./configure: error: can not define uint32_t(yum及gcc都已安装)

    错误截图如下 解决方案如下 安装kernel headers yum install kernel headers kernel devel gcc make y
  • Git仓库代码迁移

    Git仓库代码迁移 前言 本文建立在已有 git 仓库地址存在的情况下 将当前 gitLab 仓库的代码迁移到另一个 gitLab 仓库中 或有其他更加简洁的方案 由于时间仓促 并未过多研究 还望大佬指点 以下操作如有不当 望指正 步骤 新
  • XGBoost股票预测

    XGBoost 极端梯度提升 Extreme Gradient Boosting XGBoost 有时候也直接叫做XGB 和GBDT类似 也会定义一个损失函数 不同于GBDT的是只会用到一阶导数信息 XGBoost会利用泰勒展开式把损失函数
  • React实现购物车基本功能(React-redux)

    本案例利用react redux实现购物车功能 概括有以下步骤 1 利用react redux操作商品的选中状态 2 全选与取消全选 3 动态reduce计算价格 4 结算取出商品id 演示网址 https zhangyongwnag gi
  • 连接失败_macOS下蓝牙键盘(Keychron K2)连接失败的解决办法

    笔者前段时间被各大科技博主种草购买了一个蓝牙键盘 Keychron K2 但使用经历并非一帆风顺 问题描述 问题1 笔者使用的系统是macOS Mojave 10 14 6 在我初次连接键盘的时候我就发现了一丝丝的不对劲 我按照说明 打开了

随机推荐

  • 1059 C语言竞赛(PAT 乙级 C++实现)

    1059 C语言竞赛 20 point s C 语言竞赛是浙江大学计算机学院主持的一个欢乐的竞赛 既然竞赛主旨是为了好玩 颁奖规则也就制定得很滑稽 0 冠军将赢得一份 神秘大奖 比如很巨大的一本学生研究论文集 1 排名为素数的学生将赢得最好
  • 区块链运作机制_区块链如何运作? 铂 2

    区块链运作机制 This article was originally published on Blockchain Review Thank you for supporting the partners who make SitePo
  • AndroidStudio导入项目作为library

    在项目根目录下建立一个 libraries文件夹 移动你要使用的library project到libraries 目录 为什么 是移动 本人试过复制到工程 但复制过来的库工程里面的src目录下的代码会丢失 注意 你的library pro
  • Android开机启动流程简析

    Android开机启动流程简析 一 文章目录 Android开机启动流程简析 一 前言 一 开机启动的流程概述 二 Android的启动过程分析 1 总体流程 init简述 Zygote简述 前言 在学习Android过程中开机启动是必要了
  • 批量下载百度搜索图片+labelimg制作自己的数据集+转换至Yolo-v5训练数据集

    由于课题需要 需要自己制作数据集进行训练 目前是自己制作的第二个数据集 发现有某些细节已经忘记 记录备忘 同时为后来者提供借鉴 文章以car tank数据集做为例子介绍 整体流程 1 准备数据 从各种途径获取原始数据 博主的car tank
  • 高德地图报错TypeError: undefined is not a constructor

    高德地图在开发聚合和路线规划时报错TypeError undefined is not a constructor evaluating new n Driving map pe found in 经排查 原因是没有引入对应的插件 我们来看
  • IntelliJ IDEA流行的构建工具——Gradle

    IntelliJ IDEA 是java编程语言开发的集成环境 IntelliJ在业界被公认为最好的java开发工具 尤其在智能代码助手 代码自动提示 重构 JavaEE支持 各类版本工具 git svn等 JUnit CVS整合 代码分析
  • 猿如意 Chatgpt的使用规则

    猿如意 Chatgpt 是一种自然语言生成模型 它可以用来自动生成文本内容 使用规则如下 启动猿如意 Chatgpt 模型 输入自然语言文本作为模型的输入 根据模型的输出生成文本内容 可以根据需要修改输入文本或调整模型的参数来得到不同的输出
  • pandas逐行/列 遍历Dataframe的三种方式

    目录 一 pandas DataFrame iterrows 二 pandas DataFrame itertuples 三 pandas DataFrame items pandas 逐行 逐列 遍历数据有以下三种方法 一 pandas
  • Qt学习总结(一)

    一 项目中遇到的问题 1 c 文件中不同类如何共用一个变量 头文件1 h 源文件1 cpp 其他源文件2 cpp 3 cpp这些源文件都包含头文件1 h 方法 在1 h声明全局变量 extern int n 在1 cpp定义该全局变量 in
  • golang性能分析,pprof的使用,graphviz,火焰图

    golang中的pprof的使用 graphviz 一 关于pprof包 go中有pprof包来做代码的性能监控 包括 cpu profile mem profile block profile 在两个地方有包 net http pprof
  • 中文医疗大模型汇总

    写在前面 随着大语言模型的发展 越来越多的垂直领域的LLM发不出来 针对医学这一垂直领域的LLM进行整理 放在这里 希望对大家有一定的帮助吧 还会继续更新 大家有兴趣的话可以持续关注 更多关于中文医疗自然语言处理的资源和论文汇总 请访问我的
  • GoLang学习资源清单

    地鼠文档go语言文档网站通过收集整理go语言相关的学习文档 为大家提供一个学习平台https www topgoer cn 前景 Go语言中文文档https www topgoer com 文档 Gin Web FrameworkGin W
  • pyinstaller 打包.py文件生成exe(含转换.py文件为.pyd,保护源码,适合发布程序or论文复现用)

    文章目录 操作详情 1 安装Cython 2 修改调用外部数据or文件的 py文件 4 在命令行运行python setup py build ext inplace 5 创建main py文件 import 所有用到的包 写一个main
  • 数据库分表策略

    1 垂直划分 将数据表中的某些字段提出 组成新的数据表 将群组id 专辑id 音乐id提出 组成gzm数据表 而将 群组 专辑 音乐的详细信息单独放在其他数据表中 在求取索引 关系时 操作数据库效率更高 2 水平划分 2 1物理上的水平切分
  • 2018蓝桥杯B组国赛

    1 标题 三角形面积 已知三角形三个顶点在直角坐标系下的坐标分别为 2 3 2 5 6 4 3 1 5 1 7 2 求该三角形的面积 注意 要提交的是一个小数形式表示的浮点数 要求精确到小数后3位 如不足3位 需要补零 思路 利用两点求距离
  • vue项目(vue-cli)配置环境变量和打包时区分开发、测试、生产环境

    1 打包时区分不同环境 在自定义配置Vue cli 的过程中 想分别通过 env development env test env production 来代表开发 测试 生产环境 NODE ENV development NODE ENV
  • 坐标转换WGS-84 转 GCJ-02 和 GCJ-02转WGS-84

    WGS 84 to GCJ 02 static wgs gcj lng lat if this out of china lng lat return lng lat else var a 6378245 0 a 卫星椭球坐标投影到平面地图
  • ros系统设置动态服务器,让ROS变成你量身定做的WEB服务器

    如何用ROS来做一台简单的WEB服务器 我也提供了一些思路 但都太过于复杂 难以实用 介绍一种比较简单的修改方法 把HTTP目录链接到FTP目录下 不就可以很方便的修改了吗 试验 马上行动测试一下 1 关闭ROS 我的是学习用的 可一说关就
  • 15、OpenCV形态学操作——Hit-or-Miss

    OpenCV形态学操作 Hit or Miss 一 学习目标 二 Hit or Miss 一 学习目标 理解什么是Hit or Miss 学会在OpenCV中使用Hit or Miss 二 Hit or Miss 形态学算子根据图像的形状来