【opencv】教程代码 —ImgProc (5)提取图像中水平线和垂直线的opencv示例

3f83c1ffa3528761c8cd210dc501afdf.png

5. Morphology_3.cpp 提取图像中水平线和垂直线的opencv示例

7b9f2b913b52a95b1ac8da51d55e46fb.png

原图notes.png

87379c2b5c8899a65264dc544b2c6c26.png

灰度化

bf6c01b29efc1f41fa6c97b8194ac2e7.png

二值化

6867976d27f2aa3b196d2fa897515748.png

提取水平线

32f97ad9b41e9e0824c39f7f7ded14f4.png

提取垂直线

cbeced7931b09065a0d52e6d7c27abf9.png

对垂直图像取反

9dff0e3c3a256c75ae71ff85a01dcab2.png

提取边缘

f123a9a421faf48eef24faf9eae0d74a.png

使用膨胀操作处理边缘

eba58f261e8c7dce0b44f4189c3f7423.png

平滑处理:vertical.copyTo(smooth); blur(smooth, smooth, Size(2, 2)); smooth.copyTo(vertical, edges);

78d3ea1164d95381d58274b6170a5a06.png

5356dd4f7ad0fd9240e1fe7da7624971.png

4b57834bfd7d0bef9334ca67ac3d792f.png

2bd02467c868aaec25b57048430ade21.png

d43998ffe3ca3fa64142f53a7a9976bb.png

/*** @file Morphology_3(Extract_Lines).cpp* @brief 使用形态变换提取图片中的水平线和垂直线的示例代码* @author OpenCV team*/// 引入所需的库
#include <opencv2/core.hpp> // 查找、修改和复制矩阵
#include <opencv2/imgproc.hpp> // 图像处理
#include <opencv2/highgui.hpp> // 高级图像展示
#include <iostream> // 标准输入输出库void show_wait_destroy(const char* winname, cv::Mat img); // 创建一个函数,用于显示图像并在按键后销毁窗口// 使用标准库和OpenCV库
using namespace std;
using namespace cv;int main(int argc, char** argv)
{//! [load_image]CommandLineParser parser(argc, argv, "{@input | notes.png | 输入图片}");// 读取输入图像Mat src = imread( samples::findFile( parser.get<String>("@input") ), IMREAD_COLOR);if (src.empty()){// 若图像无法读取或无法找到,则打印出错误信息cout << "无法打开或找到图片!\n" << endl;cout << "用法: " << argv[0] << " < 输入图片 >" << endl;return -1;}// 展示原图像imshow("src", src);//! [加载图片]//! [灰度化]// 若原图像不是灰度图,将之转为灰度图Mat gray;if (src.channels() == 3){cvtColor(src, gray, COLOR_BGR2GRAY);}else{gray = src;}// 展示灰度图像show_wait_destroy("gray", gray);//! [灰度化]//! [二值化]// 在灰度图的反向图上应用自适应阈值化处理,注意此处需要用到~符号Mat bw;adaptiveThreshold(~gray, bw, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);// 展示二值化图像show_wait_destroy("binary", bw);//! [二值化]//! [初始化]// 创建两张图片,分别用于提取水平线和垂直线Mat horizontal = bw.clone();Mat vertical = bw.clone();//! [初始化]//! [提取水平线]// 指定水平轴上的大小int horizontal_size = horizontal.cols / 30;// 创建结构元素,通过形态操作来提取水平线Mat horizontalStructure = getStructuringElement(MORPH_RECT, Size(horizontal_size, 1));// 应用形态操作erode(horizontal, horizontal, horizontalStructure, Point(-1, -1));dilate(horizontal, horizontal, horizontalStructure, Point(-1, -1));// 展示提取出的水平线show_wait_destroy("horizontal", horizontal);//! [提取水平线]//! [提取垂直线]// 指定垂直轴上的大小int vertical_size = vertical.rows / 30;// 创建结构元素,通过形态操作来提取垂直线Mat verticalStructure = getStructuringElement(MORPH_RECT, Size(1, vertical_size));// 应用形态操作erode(vertical, vertical, verticalStructure, Point(-1, -1));dilate(vertical, vertical, verticalStructure, Point(-1, -1));// 展示提取出的垂直线show_wait_destroy("vertical", vertical);//! [提取垂直线]//! [平滑处理]// 对垂直图像取反bitwise_not(vertical, vertical);show_wait_destroy("vertical_bit", vertical);// 根据逻辑提取边缘和平滑图像// 1. 提取边缘// 2. 使用膨胀操作处理边缘// 3. 将原图像复制至平滑图像// 4. 对平滑图像进行模糊处理// 5. 将平滑图像复制至源图像,覆盖边缘部分// 步骤1Mat edges;adaptiveThreshold(vertical, edges, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 3, -2);show_wait_destroy("edges", edges);// 步骤2Mat kernel = Mat::ones(2, 2, CV_8UC1);dilate(edges, edges, kernel);show_wait_destroy("dilate", edges);// 步骤3Mat smooth;vertical.copyTo(smooth);// 步骤4blur(smooth, smooth, Size(2, 2));// 步骤5smooth.copyTo(vertical, edges);// 展示最终结果show_wait_destroy("smooth - final", vertical);//! [平滑处理]return 0;
}// 创建一个函数,用于显示图像并在按键后销毁窗口
void show_wait_destroy(const char* winname, cv::Mat img) {imshow(winname, img);moveWindow(winname, 500, 0);waitKey(0);destroyWindow(winname);
}

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

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

相关文章

【spring】@Component注解学习

Component介绍 Component 是 Spring 框架中的一个注解&#xff0c;用于将一个类标记为 Spring 上下文中的一个组件。当一个类被标记为 Component 时&#xff0c;Spring 容器会在启动时自动扫描并实例化这个类&#xff0c;并将其注册到 Spring 上下文中。 Component 注解可以用…

通过Appium和Xcode Accessibility Inspector获取iOS应用元素定位的方法

在 iOS 移动应用程序上使用选择器查找元素定位是我们在移动端 UI 自动化测试的先决条件。 但是&#xff0c;由于应用程序内容在原生 iOS 应用程序中的呈现方式&#xff0c;我们可以用来定位应用程序元素的选择器与 Web 浏览器元素有很大不同。 在本文中&#xff0c;我们将了解 …

wordcloud-1.9.2(1.9.3) for python 3.6/python3.X增强补丁

wordcloud-1.9.1开始无法在python3.6和海龟编辑器内正常使用&#xff0c;特做了一个whl 提供给python3.6使用。 另外我自己使用Python3.8 &#xff0c;因此wordcloud-1.9.2-cp36-cp36-win_amd64.whl 和wordcloud-1.9.3-cp38-cp38-win_amd64.whl&#xff0c;词云图上有前20个单…

未来制造:机器人行业新质生产力提升策略

机器人行业新质生产力提升咨询方案 一、机器人行业目前发展现状及特点&#xff1a; 创新活跃、应用广泛、成长性强。 二、机器人企业发展新质生产力面临的痛点&#xff1a; 1、高端人才匮乏 2、核心技术受限 3、竞争日益国际化 4、成本控制挑战 5、用户体验提升需求 三…

浅谈电商网络爬虫技术

摘 要 目前网络上存在着海量的数据资料&#xff0c;将这些数据爬取保存下来&#xff0c;并进行进一步操作&#xff0c;即可挖掘出数据的潜在价值。如今的互联网存在的缺陷是用户很难获得有用的数据资料&#xff0c;虽然传统的搜索引擎可以为用户返回大量信息&#xff0c;但是…

PyTorch----torch.nn.init.kaiming_normal_

神经网络为什么要进行权重初始化&#xff1f; 神经网络进行权重初始化的目的在于促进网络的有效训练和收敛。正确的权重初始化可以帮助缓解梯度消失或梯度爆炸等问题&#xff0c;并且有助于加速训练过程。以下是权重初始化的几个重要原因&#xff1a; 1. **避免梯度消失或梯度…

设计模式之组合模式解析

组合模式 1&#xff09;概述 1.定义 组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。 组合模式对单个对象&#xff08;即叶子对象&#xff09;和组合对象&#xff08;即容器对象&#xff09;的使用具有一致性&#xff0c;组合模式又称为“整体—部分”(…

SpringBoot整合Redis:缓存击穿--互斥锁解决

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏Redis实战与进阶 本专栏讲解Redis从原理到实践 …

数字时代的风向标:Facebook如何引领社交媒体的发展方向

引言 在当今数字时代&#xff0c;社交媒体已经成为人们生活中不可或缺的一部分&#xff0c;而Facebook作为其中的领军者&#xff0c;不仅影响着亿万用户的生活&#xff0c;也在塑造着整个社交媒体行业的发展方向。本文将深入探讨Facebook在数字时代的地位、影响力以及对社交媒…

3d放上模型为什么渲染不出来---模大狮模型网

如果在3D软件中放置模型后无法正确渲染出来&#xff0c;可能有几个常见的原因导致这种情况发生&#xff1a; 材质设置问题&#xff1a;确保所放置的模型具有正确的材质和纹理&#xff0c;并且材质设置正确。如果材质设置有误&#xff0c;可能会导致模型无法正确显示。 光照设置…

Vue 二次封装组件的艺术与实践

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

备考ICA----Istio实验9---熔断Circuit Breaking 实验

备考ICA----Istio实验9—熔断Circuit Breaking 实验 1. 环境准备 创建httpbin环境 kubectl apply -f istio/samples/httpbin/httpbin.yaml kubectl get svc httpbin2. 创建测试用客户端 kubectl apply -f istio/samples/httpbin/sample-client/fortio-deploy.yaml3. 创建Ht…

Intellij IDEA 类注释模板设置

1、配置全局USER 在此配置全局USER&#xff0c;用于填充自动生成的注释中的作者author属性。 注释模板中的user参数是默认是获取系统的用户&#xff08;当然注释作者也可以直接写固定值&#xff09;&#xff0c;如果不想和系统用户用同一个信息&#xff0c;可以在IDEA中进行配…

【自我提升】一、Hyperledger Fabric 概念梳理

写在前面&#xff1a;最近因为业务需要&#xff0c;开始学习Hyperledger Fabric了&#xff0c;做java全栈工程师可真难搞。现在算是啥类型的都在涉及了&#xff0c;现在这个技术啥都不懂&#xff0c;就先开个学习专栏&#xff0c;记录记录。顺带也给各位道友参考参考。 目录 …

「媒体宣传」媒体邀约几种常见方法!-51媒体

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体邀约的常见方法确实包括电话邀约、邮件邀约、社交媒体邀约以及通过媒体公关公司代邀约等。 电话邀约&#xff1a;这是一种直接且高效的方式&#xff0c;可以通过电话与媒体记者沟通&…

HTTP请求走私!!!(一)

想都是问题&#xff0c;做才是答案 什么是请求走私&#xff1f; HTTP请求走私是针对于服务端处理一个或者多个接收http请求序列的方式&#xff0c;进行绕过安全机制&#xff0c;实施未授权访问一种攻击手段&#xff0c;获取敏感信息&#xff0c;并直接危害其他用户。 Web 应用…

大语言模型(LLM)token解读

1. 什么是token&#xff1f; 人们经常在谈论大模型时候&#xff0c;经常会谈到模型很大&#xff0c;我们也常常会看到一种说法&#xff1a; 参数会让我们了解神经网络的结构有多复杂&#xff0c;而token的大小会让我们知道有多少数据用于训练参数。 什么是token&#xff1f;比…

Hadoop+Spark大数据技术 第三次作业

第三次作业 1.简述HDFS Shell三种操作命令hadoop fs、hadoop dfs、hdfs dfs的异同点。 相同点 用于与 Hadoop 分布式文件系统&#xff08;HDFS&#xff09;交互。可以执行各种文件系统操作&#xff0c;如文件复制、删除、移动等。 不同点 hadoop fs、hadoop dfs已弃用&#xf…

使用vue构建一个简单实用的春节红包插件!

摘要&#xff1a;本文将介绍如何使用Vue.js构建一个简单实用的春节红包插件。该插件通过模拟红包的打开和关闭过程&#xff0c;以及金额的随机分配&#xff0c;为春节红包活动提供了一个有趣且互动的体验。 一、引言 在春节这个充满欢乐和祝福的时刻&#xff0c;红包成为了传递…

node.js项目初始化操作

项目环境Vscode 1.新建一个文件夹node.js(xx.js) 2.右键点击node.js&#xff0c;点击打开终端 我在VScode打开终端 输入npm init初始化项目没反应。 解决方法&#xff1a;进入文件夹node.js&#xff0c;出入cmd跳转到终端 重新输入npm init命令 正确结果如下图 后续命令按下…