【OpenCV学习】第9课:形态学操作的应用-提取水平线丶垂直线

news2024/9/23 19:25:48

仅自学做笔记用,后续有错误会更改

理论
图像在进行形态学操作的时候, 可以通过自定义的结构元素实现结构元素对输入图像的一些对象敏感丶对另外一些对象不敏感, 这样就会让敏感的对象改变而不敏感的对象保留输出。 通过使用两个最基本的形态学操作 - 膨胀腐蚀 , 使用不同的结构元素实现对输入图像的操作,从而得到想要的结果。
这里再简单介绍一下 膨胀腐蚀 操作:

  • 膨胀: 输出的像素值, 是结构元素(核)覆盖下的输入图像的最大像素值
  • 腐蚀: 输出的像素值, 是结构元素(核)覆盖下的输入图像的最小像素值
    膨胀与腐蚀的具体原理与示例, 可以翻到第7课再看看。

上述中, 通过 膨胀腐蚀 来进行提取的操作, 其中的自定义结构元素, 也就是我们说的kernel(核), 常见的核的形状:矩形丶圆丶直线丶磁盘形状丶钻石形状以及各种自定义形状。

提取水平线与垂直线的操作流程:

  1. 输入图像(一般是彩色图像,imread)
  2. 转换为灰度图像(cvtColor)
  3. 转换为二值图像(adaptiveThreshold)
  4. 定义结构元素
  5. 开操作(先腐蚀,后膨胀)提取 水平线与垂直线

相关API
转换为二值图像 - 通过adaptiveThreshold这个接口去转换

  • adaptiveThreshold(
  • Mat src, //输入的灰度图像
  • Mat dst, //输出的二值图像
  • double maxValue, //超过阈值的部分取值是多少(对于cv.THRESH_BINARY而言)
  • int adaptiveMethod, //自适应阈值算法,只能选其中之一: ADAPTIVE_THRESH_MEAN_C,ADAPTIVE_THRESH_GAUSSIAN_C
  • int thresholdType, //阈值类型, 必须为THRESH_BINARY或THRESH_BINARY_INV
  • int blockSize, //核的大小
  • double C, //常量, 可以是正数,0,负数, 它是减去平均或加权平均值后的常数值,通常为正数
    );

代码示例

Mat src,dst;
src = imread(...);
// 先显示原图
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src);
// 再显示灰度图
Mat gray_dst;
cvtColor(src, gray_dst, CV_BGR2GRAY);
namedWindow("gray image", CV_WINDOW_AUTOSIZE);
imshow("gray image", gray_dst);
// 再显示二值图
Mat binImg_dst;
adaptiveThreshold(~gray_dst, binImg_dst, 255, ADAPTIVE_THRESH_MEAN_C, THRSH_BINARY, 15, -2); //注意这个gray_dst有个取反符号,表示先取反再进行二值转换, 如果是白色背景的图, 就会变为黑色
namedWindow("binary image", CV_WINDOW_AUTOSIZE);
imshow("binary image", binImg_dst);
// 再显示开操作之后的图
Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols / 16, 1), Point(-1, -1));	//横线, 核的y轴为1
Mat vline = getStructuringElement(MORPH_RECT, Size(1, src.rows / 16), Point(-1, -1));	//纵线, 核的x轴为1
// 提取水平线
// Mat temp;
// erode(binImg_dst, temp, hline);	 // 先腐蚀
// dilate(temp, dst, hline);					 // 再膨胀
// bitwise_not(dst, dst); // 图像取反操作, 将黑色背景再转为白色
// namedWindow("hline image", CV_WINDOW_AUTOSIZE);
// imshow("hline image", dst);
// 提取垂直线
// morphologyEx(binImg, dst, CV_MOP_OPEN, vline);	// 直接进行开操作
// bitwise_not(dst, dst); 
// namedWindow("vline image", CV_WINDOW_AUTOSIZE);
// imshow("vline image", dst);
// 提取水平线, 并使用均值滤波对结果进行优化显示
Mat temp;
erode(binImg_dst, temp, hline);	 // 先腐蚀
dilate(temp, dst, hline);			     // 再膨胀
bitwise_not(dst, dst); 					 // 图像取反操作, 将黑色背景再转为白色
blur(dst, dst, Size(3, 3), Point(-1, -1));		// 均值滤波,进行边缘处理, 使图像更和谐一些
namedWindow("hline image", CV_WINDOW_AUTOSIZE);
imshow("hline image", dst);

效果截图:
原图:
在这里插入图片描述
灰度图:
在这里插入图片描述
取反过后的二值图:
在这里插入图片描述
提取水平线(再取反将背景变为白色):
在这里插入图片描述
提取垂直线(同上都是取反了的,背景一样变回为白色, 右下边那个几个短线是文字A的垂直部分,也被提取了)):
在这里插入图片描述
使用均值滤波过后的水平线提取
在这里插入图片描述

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

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

相关文章

华为云服务-运维篇-弹性负载均衡

文章目录一、什么是负载均衡二、我们为什么需要负载均衡1、生活中需要它的类似场景2、生活场景中协调者(负载均衡)作用3、协调者(负载均衡)引入后的变化三、华为云平台-如何做负载均衡弹性负载均衡-ELB四、总结一、什么是负载均衡 负载均衡构建在原有网…

【数据挖掘】薪酬分段对应工作经验/学历画柱状图【招聘网站的职位招聘数据预处理】

文章目录一.需求背景1.1 需求分析二.数据处理(对给定职位,汇总薪酬分段对应工作经验要求数据,画柱状图;)2.1 事前准备2,1 处理开始三.数据处理(对给定职位,汇总薪酬分段对应学历要求数据,画柱状图;)四.附源…

吉林大学 超星慕课 高级语言程序设计 实验08 结构化程序设计(2022级)

本人能力有限,发出只为帮助有需要的人。 建议同学们自己写完后再进行讨论。 其中的代码均没能在oj上进行测试,因此可能有误,请谅解。 除此以外部分题目设计深度优先搜索,因此可以分别用递归和堆栈实现,堆栈方法为了…

JavaScript进阶教程——异步编程、封装Ajax

异步编程 什么是同步与异步: 同步:一件事没做完,只能等待,完成之后再去做另一件事 异步: 两件事可以同时进行 前端开发中最常见的两种异步情况: ajax: 向后台请求数据计时器: setInterval se…

Python学习基础笔记四十一——sys模块

sys模块是与Python解释器交互的一个接口。 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1) sys.version 获取Python解释程序的版本信息 sys.path 返…

ARM Cortex M3处理器概述

Cortex-M3概述 2004年ARM发布作为新型Corex处理器内核系列首款的Cortex-M3处理器。 STM32系列基于专为高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M内核。 STM32命名规则 STMF103xx系统结构 1.使用高性能的ARM Cortex-M3 32位RISC内核 2.工作频率为72MHZ 3.内…

shell脚本监控文件夹文件实现自动上传数据到hive表

sh createtb.sh “tablename;field1,field2,field3,field4,field5,field6,field7;partition1,partition2” 数据库名:observation (脚本里写死了) 表名:tablename 指定名:field1,field2,field3,field4,field5,field6,f…

分别使用Alpine、Docker制作jdk镜像

目录 制作 jdk 1.0 镜像 ——Docker 1.创建文件夹上传jdk的安装包,和在同级目录下编写Dockerfile文件 2.编写 Dockerfile 文件 3.执行Dockerfile文件,初次依赖镜像的时候会下载相应镜像 优化制作jdk镜像(缩小内存大小)——使用alpine …

【致敬世界杯】球迷(我)和足球的故事

目录 一、第一次接触足球 二、回味无穷的2018世界杯 三、致敬世界杯 3.1 源代码 3.2 思路 3.3 关于图片 一、第一次接触足球 踢足球是一项优秀的运动,它可以锻炼身体,增强团队合作精神,并为人们带来快乐和满足感。回忆起小学时候第一次…

OpenCV和RTSP的综合研究

一、RTSP是什么?用来干什么? RTSP(Real Time Streaming Protocol),RFC2326,实时流传输协议,是TCP/IP协议体系中的一个应用层协议,由哥伦比亚大学、网景和RealNetworks公司提交的IET…

四旋翼无人机学习第14节--PCB Editor简单绘制封装-1

文章目录1 前言1.1 网络获取1.2 封装软件生成1.3 立创商城封装转化1 前言 在之前的博客中,我们绘制了封装所需的焊盘,有了焊盘我们就可以绘制封装啦。当然封装的获取有很多途径,下面我来总结一下。 1.1 网络获取 (有需要的可以下载哦&…

华为eNSP模拟器配置MSTP多实例生成树

传统的stp、rstp有其必然的缺陷 1.统一局域网内所有的vlan共享一个生成树,无法在vlan间实现数据流量的负载均衡。 2.链路利用率低,被阻塞的冗余链路不承载任何流量,造成了带宽的浪费,还可能造成部分vlan报文无法转发。MSTP在它们…

计算机毕业设计springboot+vue基本微信小程序的学习资料共享小程序

项目介绍 前台为用户使用的,包括下面一些功能: ① 资料发布:用户可以将想要共享的资料发布到小程序,供他人购买。 ②搜索 :分为按名称搜索和分类搜索,用户可选择其中一种方式,检索自己所需要的资料。 ③ 查看资料详情:用户可以…

学委必备小工具——筛选未提交人数【python小工具】

问题描述 作为一个学委,通常的任务就是收取班级作业,然后向老师报告当前未交人员的名单 JS版本:实现以一个表格数据查询另一个表格【JS】 之前我已经尝试通过用JS实现了,本质上差别其实也不是很大,只是对于JS来说&…

Java基础之《netty(11)—netty模型》

一、简单说明 1、工作原理示意图 netty主要基于主从Reactors多线程模型做了一定的改进,其中主从Reactor多线程模型有多个Reactor。 2、说明 (1)BossGroup线程维护selector,只关注Accept事件。 (2)当接收到…

[附源码]Node.js计算机毕业设计出版社样书申请管理系统Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

第十一章 特征选择与稀疏学习

11.1 子集搜索与评价 我们将属性称为特征,对当前学习任务有用的属性称为相关特征、没什么用的属性称为无关特征。还有一类特征称为冗余特征,它们所包含的信息能从其他特征中推演出来,冗余特征在很多时候不起作用,去除它们会减轻学…

redis之如何应对并发访问问题

写在前面 本文一起看下Redis的并发访问控制。 1:单线程的Redis为什么会有并发问题 我们知道,Redis是单线程的,为什么还是会有并发问题呢?没错,如果是单命令操作的话肯定没有并发问题,但考虑事务的场景&a…

nodejs+vue人事管理系统30n9o

开发语言:nodejs 框架:Express 数据库:mysql 数据库工具:Navicat11 开发软件:VS code 浏览器:谷歌浏览器 目录 1 绪论 1 1.1课题背景 1 1.2课题研究现状 1 1.3初步设计方法与实施方案 2 1.4本文研究内容 …

使用VS2019开发调试Android动态库

1. 环境准备 1.1 安装JDK:jdk1.8.0_112 1.2 安装Android SDK SDK可以安装指定的platforms和ndk-bundle。为了兼容性考虑,单独安装了版本比较老的android-ndk-r10b 1.3 安装VS2019 安装VS2019并选择:使用C的移动开发。 1.4 连接开发手机…