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.mzph.cn/news/817159.shtml

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

相关文章

树莓派驱动开发--驱动文件代码的浅度分析(以iic的为例)

前言:我使用的代码是正点原子的驱动代码,我们借鉴学习,看多了别人优秀的代码是我们自主完成代码编写的前提! 一. 总体层面梳理 总线-驱动-设备 模型 --把不同功能的外设归类,然后实现统一接口,无法归类的使用虚拟总线来形容,从而实现总线-驱动-设备模型. --为什么要这样?比…

C/C++基础----指针

指针的定义 在c/c中&#xff0c;有一个特殊的变量指向我们电脑中某个内存地址&#xff0c;进而可以让我们操作这段内存&#xff0c;指的就是指针类型 语法&#xff1a; int a 10; int* p &a;&符号是取出某个变量的内存地址 把这个内存地址赋值给一个变量p&#xff…

pgcrypto

瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;14 文档用途 本文详细介绍pgcrypto。 详细信息 1、简介 pgcrypto是PostgreSQL的一个扩展模块&#xff0c;用于提供加密和密码散列功能。它扩展…

Java代码基础算法练习-拆分一个三位数的个位、十位、百位-2024.04.14

任务描述&#xff1a;输入一个三位数&#xff0c;逆序输出这个三位数的个位、十位、百位对应的数字&#xff0c;用空格分开。 任务要求&#xff1a; 代码示例&#xff1a; package April_2024;import java.util.Scanner; public class a240414 {public static void main(Strin…

972: 统计利用先序遍历创建的二叉树的宽度

解法&#xff1a; #include<iostream> #include<queue> using namespace std; // 定义二叉树结点 struct TreeNode {char val;TreeNode* left;TreeNode* right;TreeNode(char x) :val(x), left(NULL), right(NULL) {}; }; // 先序递归遍历建立二叉树 TreeNode* bu…

深入理解 copyWithin:提升JavaScript图形处理中数组数据的复用与变换能力

引言 copyWithin 是 JavaScript 中数组对象的一个实例方法&#xff0c;用于在数组内部进行元素的复制和移动。从数组的指定位置拷贝元素到另一个指定位置&#xff0c;覆盖原数组中的相应位置。它不会改变数组的长度。 copyWithin 方法解析 语法&#xff1a; arr.copyWithin…

【uniapp】状态存储Pinia的使用,以及它的数据持久化

1、下载安装pinia&#xff0c;引入pinia //stores->index.ts import { createPinia } from pinia import persist from pinia-plugin-persistedstate //持久化插件// 创建 pinia 实例 const pinia createPinia() // 使用持久化存储插件 pinia.use(persist)// 默认导出&…

spark实验三-spark进阶编程

1&#xff0e;Spark编程统计各地区租房人数 实验目标&#xff1a; (1) 掌握在IntelliJ IDEA 中操作spark程序开发 (2) 打包程序提交集群运行 实验说明&#xff1a; 现有一份某省份各地区租房信息文件 house.txt&#xff0c;文件中共有8个数据字段&#xff0c;字段说明…

vue 项目中添加DES加密

vue 项目中添加DES加密 由于现在项目使用http协议&#xff0c;且登录界面是明文传输&#xff0c;项目真正上线后基本的密码传输都很不安全。 决定用前端框架加密后再进行传输&#xff0c;以提高密码传输过程中的安全性。 crypto-js 是一个流行的 JavaScript 加密库&#xff0…

vxe-vxe-toolbar中vxe-button选中切换status

1.VXE-Toolbar 在VXE-Toolbar中&#xff0c;可以使用vxe-button组件实现按钮的选中切换效果&#xff0c;并且可以根据不同的选中状态显示不同的样式。你可以通过设置status属性来控制按钮的选中状态&#xff0c;并通过监听按钮的点击事件来切换选中状态。需要在vxe-toolbar中添…

服务器配置ssh免密登录

需求:备份test10.22.33.96上的文件到 test10.22.33.97的定时脚本,需要使用scp命令传输文件,两台节点没有ssh互信,需要配置服务器之间的SSH互信为了让两台或多台服务器之间能够无密码自动登录 步骤1&#xff1a;生成密钥对 在每一台需要建立互信的服务器(test10.22.33.96)上执…

每日两题1

文章目录 使用最小花费爬楼梯91解码方法 使用最小花费爬楼梯 class Solution { public:int minCostClimbingStairs(vector<int>& cost) {if(cost.size() 2)return min(cost[0],cost[1]);vector<int> dp;dp.reserve(cost.size()1);dp[0] 0;dp[1] 0;for(int i…

【域适应】基于深度域适应MMD损失的典型四分类任务实现

关于 MMD &#xff08;maximum mean discrepancy&#xff09;是用来衡量两组数据分布之间相似度的度量。一般地&#xff0c;如果两组数据分布相似&#xff0c;那么MMD 损失就相对较小&#xff0c;说明两组数据/特征处于相似的特征空间中。基于这个想法&#xff0c;对于源域和目…

顶切,半顶切是什么意思?

齿轮加工及刀具中有一些特定名词或者叫法&#xff0c;不熟悉的小伙伴可能最开始会有一些困惑&#xff0c;这不&#xff0c;最近有小伙伴问了一个问题&#xff1a;顶切是说齿顶的倒角吗&#xff1f; 今天就给大家说说顶切和半顶切。 一、顶切 Topping 从字面上可以看到可以想到…

Swagger API 文档 | SpringCloudGateway 集成 SpringDoc

文章目录 工作原理方案 1:配置 swagger-ui.urls方案 2:通过路由定义动态配置具体案例第 1 步:导入代码第 2 步:配置 Swagger Url 列表第 3 步:启动程序第 4 步:查看注册中心第 5 步:访问网关 Swagger UI相关博文😎 本节目标: Spring Cloud Gateway 集成 SpringDoc,实…

MySQL的权限管理

MySQL的权限管理 在理解MySQL的权限管理之前&#xff0c;我们需要先了解其架构设计以及权限管理在该架构中的定位。 MySQL的架构设计 MySQL数据库系统采用了分层的架构设计&#xff0c;主要可以分为以下几个层级&#xff1a; 连接层&#xff1a;最外层&#xff0c;处理连接…

x264 8x8 水平预测汇编分析

C 语言代码 void s264_predict_8x8_h_c( pixel *src, pixel edge[36] ) { PREDICT_8x8_LOAD_LEFT #define ROW(y) MPIXEL_X4( srcy*FDEC_STRIDE0 ) \ MPIXEL_X4( srcy*FDEC_STRIDE4 ) PIXEL_SPLAT_X4( l##y ); ROW(0); ROW(1); ROW(2); ROW(3); ROW(4); ROW(5); ROW(6); ROW(7…

VUE3:自定义loading指令

一、效果描述 在一个div中使用该指令并绑定一个变量&#xff0c;通过修改变量实现Loading的显示与隐藏。 二、代码与使用方式 1.使用指令的vue组件 <template><div v-loading"showLoading"></div> </template> <script setup lang&q…

爬虫 selenium

爬虫 selenium 【一】介绍 【1】说明 Selenium是一款广泛应用于Web应用程序测试的自动化测试框架 它可以模拟用户再浏览器上的行为对Web应用进行自动化测试 主要作用&#xff1a; 浏览器控制&#xff1a;启动、切换、关闭不同浏览器元素定位于操作&#xff1a;通过CSS选择器…

vscode中运行js

vscode中运行js 目前vscode插件运行js都是基于node环境&#xff0c;vscode控制台打印有些数据不方便等缺点。 每次调试在浏览器中运行js&#xff0c;需要创建html模板、插入js。期望能够直接运行js可以打开浏览器运行js&#xff0c;在vscode插件市场找到一款插件可以做到。 插…