OpenCV的查找命中或未命中

返回:OpenCV系列文章目录(持续更新中......)

上一篇:OpenCV4.9更多形态转换

下一篇:OpenCV系列文章目录(持续更新中......)

目标

在本教程中,您将学习如何使用 Hit-or-Miss 转换(也称为 Hit-and-Miss 转换)在二进制映像中查找给定配置或模式。这种变换也是更高级的形态操作(如疏伐或修剪)的基础。

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

命中或未命中理论

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

命中或未命中变换对于查找二进制图像中的模式非常有用。特别是,它找到那些邻域与第一个结构元素B1的形状匹配,但同时与第二个结构元素 B2 的形状不匹配的像素。从数学上讲,应用于图像A的运算可以表示如下:

因此,命中或未命中操作包括三个步骤:

  1. 使用结构元素B1侵蚀图像 A。
  2. 侵蚀图像A(AC)的补码与结构元素(B2)。
  3. AND 来自步骤 1 和步骤 2。

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

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

 

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

代码

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

您也可以从这里下载

C++:

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

Java:

import org.opencv.core.*;
import org.opencv.highgui.HighGui;
import org.opencv.imgproc.Imgproc;class HitMissRun{public void run() {Mat input_image = new Mat( 8, 8, CvType.CV_8UC1 );int row = 0, col = 0;input_image.put(row ,col,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 = new Mat( 3, 3, CvType.CV_16S );kernel.put(row ,col,0, 1, 0,1, -1, 1,0, 1, 0 );Mat output_image = new Mat();Imgproc.morphologyEx(input_image, output_image, Imgproc.MORPH_HITMISS, kernel);int rate = 50;Core.add(kernel, new Scalar(1), kernel);Core.multiply(kernel, new Scalar(127), kernel);kernel.convertTo(kernel, CvType.CV_8U);Imgproc.resize(kernel, kernel, new Size(), rate, rate, Imgproc.INTER_NEAREST);HighGui.imshow("kernel", kernel);HighGui.moveWindow("kernel", 0, 0);Imgproc.resize(input_image, input_image, new Size(), rate, rate, Imgproc.INTER_NEAREST);HighGui.imshow("Original", input_image);HighGui.moveWindow("Original", 0, 200);Imgproc.resize(output_image, output_image, new Size(), rate, rate, Imgproc.INTER_NEAREST);HighGui.imshow("Hit or Miss", output_image);HighGui.moveWindow("Hit or Miss", 500, 200);HighGui.waitKey(0);System.exit(0);}
}public class HitMiss
{public static void main(String[] args) {// load the native OpenCV librarySystem.loadLibrary(Core.NATIVE_LIBRARY_NAME);new HitMissRun().run();}
}

 Python:

import cv2 as cv
import numpy as npinput_image = np.array(([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]), dtype="uint8")kernel = np.array(([0, 1, 0],[1, -1, 1],[0, 1, 0]), dtype="int")output_image = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel)rate = 50
kernel = (kernel + 1) * 127
kernel = np.uint8(kernel)kernel = cv.resize(kernel, None, fx = rate, fy = rate, interpolation = cv.INTER_NEAREST)
cv.imshow("kernel", kernel)
cv.moveWindow("kernel", 0, 0)input_image = cv.resize(input_image, None, fx = rate, fy = rate, interpolation = cv.INTER_NEAREST)
cv.imshow("Original", input_image)
cv.moveWindow("Original", 0, 200)output_image = cv.resize(output_image, None , fx = rate, fy = rate, interpolation = cv.INTER_NEAREST)
cv.imshow("Hit or Miss", output_image)
cv.moveWindow("Hit or Miss", 500, 200)cv.waitKey(0)
cv.destroyAllWindows()

正如你所看到的,它就像使用函数morphologyEx()和操作类型MORPH_HITMISS和所选的内核一样简单。

其他例子

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

 

现在试试你自己的模式吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/309579.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript知识点 --javaweb学习笔记

什么是Javascript? JavaScript(简称:JS)是一门跨平台、面向对象的脚本语言。是用来控制网页行为的&#xff0c;它能使网页可交互JavaScript 和Java 是完全不同的语言&#xff0c;不论是概念还是设计。但是基础语法类似JavaScript在1995 年由 Brendan Eich 发明&#xff0c;并…

护眼台灯什么品牌好?推荐目前比较好用的护眼台灯

现在孩子的近视率很高&#xff0c;尤其是儿童青少年居多&#xff0c;上了小学作业都变多了&#xff0c;很多孩子经常需要学习到很晚&#xff0c;不过家长们在重视教育质量的同时&#xff0c;有注意到孩子学习时的光线适合学习吗&#xff1f;用眼过度和光线不合适都容易导致近视…

Java快速入门系列-9(Spring框架与Spring Boot —— 深度探索及实践指南)

第九章:Spring框架与Spring Boot —— 深度探索及实践指南 9.1 Spring框架概述9.2 Spring IoC容器9.3 Spring AOP9.4 Spring MVC9.5 Spring Data JPA/Hibernate9.6 Spring Boot快速入门与核心特性9.7 Spring Boot的自动配置与启动流程详解9.8 创建RESTful服务与数据库交互实践…

OpenHarmony南向开发案例:【智能垃圾桶】

样例简介 智能垃圾桶可以通过数字管家应用来监测垃圾桶当前可用容量&#xff0c;提醒主人及时处理垃圾&#xff1b;通过日程管家可以实现和其他智能设备联动。 核心组件位置功能距离传感器置于垃圾桶盖内侧感应垃圾量红外传感器置于垃圾桶前端感应是否有人靠近光敏电阻开发板…

0.25W 3KVDC 隔离单、双输出 DC/DC SMD 型电源模块 ——TPVT-W2 系列

TPVT-W2系列是一款标准的表面贴装电源模块&#xff0c;完全实现采用全自动贴片机来组装和满足回流焊工艺&#xff0c;大大提高产能和降低人工费用。此系列产品小&#xff0c;效率高&#xff0c;低输出纹波及提供3000V以上的直流电压隔离&#xff0c;SMD封装。

第一节:什么是操作系统

什么是操作系统 一、一台计算机的组成部分1、计算机能干啥2、谈谈计算机硬件 二、什么是操作系统三、学习操作系统的层次 一、一台计算机的组成部分 如下图所示&#xff1a; 这就是就是构成一台计算机的组成部分 1、计算机能干啥 ∙ \bullet ∙计算机是我们专业吃饭的家伙&a…

微信小程序公共组件封装使用

1.在components目录下创建公共组件&#xff0c;以navbar为例 2.完成组件功能 3.调用&#xff0c;如果很多地方都会用到&#xff0c;建议放全局&#xff0c;如果不是则放在需要引用的文件中 3.1全局引用&#xff0c;在app.json做全局引用配置 3.2局部引用&#xff0c;在需要引入…

密码学与密码安全:理论与实践

title: 密码学与密码安全&#xff1a;理论与实践 date: 2024/4/10 21:22:31 updated: 2024/4/10 21:22:31 tags: 密码学加密算法安全协议密码分析密码安全实际应用未来发展 第一章&#xff1a;密码学基础 1.1 密码学概述 密码学是研究如何保护信息安全的学科&#xff0c;旨在…

C语言疑难点

AScii码&#xff1a; \0 、0、‘0’的区别&#xff1a;‘\0’转义字符的ascii码值是0&#xff0c;’\0’与数字0相同&#xff0c;但不与‘0’相同&#xff0c;‘0’的ascii码值是48&#xff0c;‘a字符的值是97&#xff08;ASCII表&#xff09; 字符串长度为5&#xff0c;大小…

房贷还款(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <math.h>int main() {//初始化变量值&#xff1b;double m, r 0.01;float d 300000;float p 6000;//运算还款所需月份&#xff1b;m log10…

Lua脚本使用手册(Redis篇)

Lua脚本 **简介&#xff1a;**Lua是一种功能强大的&#xff0c;高效&#xff0c;轻量级&#xff0c;可嵌入的脚本语言。它是动态类型语言&#xff0c;通过使用基于寄存器的虚拟机解释字节码运行&#xff0c;并具有增量垃圾收集的自动内存管理&#xff0c;是配置&#xff0c;脚…

Java-Tomcat

一、web补充技术 ①&#xff1a;B/S架构 主流的方式&#xff0c;只要有浏览器即可。编程方式直接基于socket即可 ②&#xff1a;javascript 简称js&#xff0c;早期只是实现在客户端的浏览器的动态效果&#xff0c;但服务端不会解释运行&#xff0c;所以本质上是静态资源。 …

1.16 LeetCode总结(基本算法)动态规划2

70. 爬楼梯 首先想到的是递归&#xff1a; // 递归 int climbStairs(int n) {if (n 1) {return 1;} else if (n 2) {return 2;}return climbStairs(n - 1) climbStairs(n - 2); }我们先来看看这个递归的时间复杂度吧&#xff1a; 递归时间复杂度 解决一个子问题时间*子问…

【无人机/平衡车/机器人】详解STM32+MPU6050姿态解算—卡尔曼滤波+四元数法+互补滤波(文末附3个算法源码)

效果: MPU6050姿态解算-卡尔曼滤波+四元数+互补滤波 目录 基础知识详解 欧拉角

Unsupervised Learning ~ Anomaly detection

unusual events vibration: 振动 Density estimation: Gaussian(normal) Distribution. standard deviation: 标准差 variance deviation sigma Mu Parameter estimation Anomaly detection algorithm 少量异常样本点的处理经验 algorithm evaluation skewed datatsets:…

Java实现二叉树(下)

1.前言 http://t.csdnimg.cn/lO4S7 在前文我们已经简单的讲解了二叉树的基本概念&#xff0c;本文将讲解具体的实现 2.基本功能的实现 2.1获取树中节点个数 public int size(TreeNode root){if(rootnull){return 0;}int retsize(root.left)size(root.right)1;return ret;}p…

【MySQL】索引篇

SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;学习技术栈 个性签名&#xff1a;保留赤子之心也许是种幸运吧 本文封面由 凯楠&#x1f4f8;友情提供 目录 本系列传送门 1. 什么是索引 2. 索引的特性 3. 索引的分类 4. 索引的优点及缺点 优点 缺点 5.…

实验5 流程图和盒图ns图

一、实验目的 通过绘制流程图和盒图&#xff0c;熟练掌握流程图和盒图的基本原理。 能对简单问题进行流程图和盒图的分析&#xff0c;独立地完成流程图和盒图设计。 二、实验项目内容&#xff08;实验题目&#xff09; 1、用Microsoft Visio绘制下列程序的程序流程图。 若…

蓝桥杯:握手问题和小球反弹问题

试题 A: 握手问题 本题总分&#xff1a; 5 分 【问题描述】 小蓝组织了一场算法交流会议&#xff0c;总共有 50 人参加了本次会议。在会议上&#xff0c; 大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手&#xff08;且仅有一次&#x…

ChatGPT在线网页版

ChatGPT镜像 今天在知乎看到一个问题&#xff1a;“平民不参与内测的话没有账号还有机会使用ChatGPT吗&#xff1f;” 从去年GPT大火到现在&#xff0c;关于GPT的消息铺天盖地&#xff0c;真要有心想要去用&#xff0c;途径很多&#xff0c;别的不说&#xff0c;国内GPT的镜像…