树莓派4B_OpenCv学习笔记9:图片的腐蚀与膨胀

今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi)

 本人所用树莓派4B 装载的系统与版本如下:

 版本可用命令 (lsb_release -a) 查询:

 Opencv 版本是4.5.1:

图像的膨胀与腐蚀一般用于灰度图或者二值图,今日便来学习一下

文章提供测试代码讲解,整体代码贴出、测试效果图、整体工程下载

目录

结构元素:

OpenCv图像腐蚀:

图像腐蚀的目的:

 图像腐蚀的原理:

图像腐蚀的代码示例:

图像腐蚀的效果展示:

OpenCv图像膨胀:

图像膨胀的目的:

图像膨胀的原理:

图像膨胀的代码示例:

图像膨胀的相关展示:

整体代码与测试图片打包下载:

网上资料查阅:


结构元素:

结构元素是一个定义邻域内像素关系的矩阵,它决定了膨胀和腐蚀操作如何影响图像的像素。结构元素的形状和大小对操作结果有显著影响。

图像膨胀中的结构元素

  1. 作用:图像膨胀是通过将结构元素与图像进行逐像素的比较,只要结构元素与图像有任何一个相交的像素,输出图像对应像素即为前景(通常为白色),否则为背景(通常为黑色)。这可以使前景区域扩张,填充空洞和连接断裂的区域。
  2. 种类:结构元素的种类可以是正方形、十字形、椭圆形等。
  3. 尺寸:结构元素的尺寸大小可以用Size ksize参数来指定,例如一个3x3的结构元素。
  4. 中心点:结构元素的中心点位置可以用Point anchor参数来指定,默认参数为结构元素的几何中心点。

图像腐蚀中的结构元素

  1. 作用:图像腐蚀是通过将结构元素与图像进行逐像素的比较,只有当结构元素完全覆盖对应图像区域时,输出图像对应像素才为前景,否则为背景。这可以使前景区域缩小,去除细小的细节和孤立的像素。
  2. 种类与尺寸:结构元素的种类和尺寸与膨胀操作中的相同,可以是正方形、十字形、椭圆形等,尺寸大小可以用Size ksize参数来指定。
  3. 中心点:结构元素的中心点位置与膨胀操作中的相同,可以用Point anchor参数来指定,默认参数为结构元素的几何中心点。

结构元素生成函数

在OpenCV中,可以使用getStructuringElement()函数来生成图像形态学操作中常用的结构元素。该函数接受三个参数:

  • int shape:结构元素的种类,可以是矩形(MORPH_RECT)、椭圆形(MORPH_ELLIPSE)或交叉形(MORPH_CROSS)。
  • Size ksize:结构元素的尺寸大小。
  • Point anchor = Point(-1,-1):中心点的位置,默认参数为结构元素的几何中心点。

 

OpenCv图像腐蚀:

图像腐蚀的目的:

1、去除图像中微小物体

2、分离较近的俩个物体

3、减少一部分信息

 图像腐蚀的原理:

  • 原理描述
    • 腐蚀操作是通过一个结构元素(也称为卷积核或模板)对图像进行扫描,结构元素通常是一个小的矩形、十字形或椭圆形。
    • 对于二值图像(只有0和1两种像素值),腐蚀操作是检查结构元素覆盖的图像区域,取这些像素值中的最小值来替换结构元素中心位置处的像素值。
    • 由于在二值图像中,0通常代表黑色或背景,而1代表白色或前景,因此腐蚀操作实质上是一种“领域被蚕食”的过程,导致高亮区域(白色区域)变小。
  • 操作过程
    • 定义一个结构元素(例如3x3的正方形),并指定一个锚点(通常位于结构元素的中心)。
    • 将结构元素的锚点放置在图像的每个像素位置上,检查结构元素覆盖的图像区域。
    • 取结构元素覆盖区域内所有像素的最小值,用这个最小值替换锚点位置处的像素值。
    • 重复上述过程,直到扫描完整个图像。
  • 效果与用途
    • 经过腐蚀操作后,图像中的高亮区域会变小,毛刺和孤立的像素点会被消除,从而提取出图像的主要信息。
    • 腐蚀操作可以用于边缘检测,通过先膨胀后腐蚀可以使边缘更加明显。
    • 它也可以用于去噪,通过一定次数的腐蚀操作可以消除二值图像中的噪声点或孤立的像素点。
  • 参数与调整
    • 腐蚀操作的效果可以通过调整结构元素的大小、形状以及腐蚀的迭代次数来控制。
    • 结构元素的大小和形状决定了腐蚀的邻域范围和形状。
    • 迭代次数表示腐蚀操作的重复次数,次数越多,腐蚀效果越明显。
  • OpenCV实现
    • 在OpenCV中,可以使用cv2.erode()函数来实现腐蚀操作。
    • 该函数接受三个主要参数:输入图像、结构元素和迭代次数。
    • 结构元素可以使用cv2.getStructuringElement()函数来创建。

 

图像腐蚀的代码示例:

以下代码读取一张图片,先以127为阈值进行二值化处理得到二值图,在进行腐蚀得到腐蚀图的过程,每种操作都展示图片:

# coding: utf-8 import cv2
import numpy as np#创建窗口并调整大小:用于显示原图
cv2.namedWindow("Original image",cv2.WINDOW_NORMAL)
cv2.resizeWindow("Original image",360,360)
#创建窗口并调整大小:用于显示原图转化的二值图
cv2.namedWindow("Binary Image",cv2.WINDOW_NORMAL)
cv2.resizeWindow("Binary Image",360,360)
#创建窗口并调整大小:用于显示腐蚀后的样子
cv2.namedWindow("Eroded image",cv2.WINDOW_NORMAL)
cv2.resizeWindow("Eroded image",360,360)#从指定目录读取一张图片
image=cv2.imread('/home/pi/Pictures/Eroded_image_test2.jpg',0)
#定义腐蚀操作的结构元素
kernel=np.ones((2,2),np.uint8)#图像二值化处理:使用127作为阈值  
_, binary_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)  #进行图像腐蚀操作(对二值图进行腐蚀),iterations表示腐蚀次数
eroded_image=cv2.erode(binary_image,kernel,iterations=1)while True:#显示原始图\二值图\腐蚀后的图cv2.imshow('Original image',image)cv2.imshow('Eroded image',eroded_image)cv2.imshow('Binary Image', binary_image)  #等待按下‘q’退出key=cv2.waitKey(1)if key&0XFF==ord('q'):break
#释放所有资源
cv2.destroyAllWindows()

图像腐蚀的效果展示:

这里提供了俩张图片进行腐蚀实验,一张白底黑字,一张黑底白字,名称分别是Eroded_image_test1.jpg和Eroded_image_test2.jpg,只需更改17行代码即可测试俩种图片

对于黑底白字的图像的腐蚀如下:

对于白底黑字的图像的腐蚀如下:

OpenCv图像膨胀:

图像膨胀的目的:

1、膨胀操作主要是使图像中高亮部分扩张,使得膨胀后的图像拥有比原图更大的高亮区域。

2、将有价值的信息放大

图像膨胀的原理:

  • 膨胀过程

    • 膨胀的过程类似于卷积操作。使用一个结构元素(通常称为核或卷积核)在图像上滑动,并取结构元素覆盖区域的最大值来替换中心像素的值。
    • 结构元素可以是正方形、十字形、圆形等形状,大小也可以根据需要进行调整。
  • 膨胀的作用

    • 物体连接:当图像中的物体有一些小的断裂或缝隙时,膨胀操作有助于将它们连接成一个整体。
    • 填充小孔:膨胀可以填充物体内的小孔或空洞,使物体更加连续。
    • 增加物体大小:膨胀操作会扩大图像中的物体,这在需要增加物体大小或加强物体边缘时很有用。
    • 去除小物体:膨胀可以用于去除图像中一些小的噪声或不相关的物体。通过膨胀操作,较小的物体可能会被合并到周围较大的物体中,从而减小图像中不必要的小结构。
    • 去除噪声:对于二值图像中的噪声点或孤立的像素点,通过膨胀操作可以填充小的噪声点。
    • 提取信息:通过膨胀和腐蚀操作可以提取文本区域或其他感兴趣的区域。
  • 膨胀操作的参数

    • src:源图像,即要进行膨胀操作的图像。
    • kernel:膨胀操作的结构元素,定义了膨胀操作的形状和大小。
    • iterations:膨胀操作的迭代次数,即结构元素在图像上滑动的次数。较大的迭代次数会产生更明显的膨胀效果。

图像膨胀的代码示例:

以下代码读取一张图片,先以127为阈值进行二值化处理得到二值图,在进行膨胀得到膨胀图的过程,每种操作都展示图片:

# coding: utf-8 import cv2
import numpy as np#创建窗口并调整大小:用于显示原图
cv2.namedWindow("Original image",cv2.WINDOW_NORMAL)
cv2.resizeWindow("Original image",360,360)
#创建窗口并调整大小:用于显示原图转化的二值图
cv2.namedWindow("Binary Image",cv2.WINDOW_NORMAL)
cv2.resizeWindow("Binary Image",360,360)
#创建窗口并调整大小:用于显示膨胀后的样子
cv2.namedWindow("Dilated image",cv2.WINDOW_NORMAL)
cv2.resizeWindow("Dilated image",360,360)#从指定目录读取一张图片
image=cv2.imread('/home/pi/Pictures/Dilate_image_test1.jpg',0)
#定义膨胀操作的结构元素
kernel=np.ones((3,3),np.uint8)#图像二值化处理:使用127作为阈值  
_, binary_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)  #进行图像膨胀操作(对二值图进行膨胀),iterations表示膨胀次数
dilated_image=cv2.dilate(binary_image,kernel,iterations=1)while True:#显示原始图\二值图\腐蚀后的图cv2.imshow('Original image',image)cv2.imshow('Dilated image',dilated_image)cv2.imshow('Binary Image', binary_image)  #等待按下‘q’退出key=cv2.waitKey(1)if key&0XFF==ord('q'):break
#释放所有资源
cv2.destroyAllWindows()

 

图像膨胀的相关展示:

 这里提供了俩张图片进行腐蚀实验,一张白底黑字,一张黑底白字,名称分别是Dilate_image_test1.jpg和Dilate_image_test2.jpg,只需更改17行代码即可测试俩种图片

 对于黑底白字的图像的膨胀如下:

对于白底黑字的图像的膨胀如下:

整体代码与测试图片打包下载:

https://download.csdn.net/download/qq_64257614/89437741

网上资料查阅:

图像的腐蚀与膨胀_腐蚀膨胀-CSDN博客

 OpenCV(二十九):图像腐蚀_cv::getstructuringelement-CSDN博客

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

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

相关文章

湘潭大学软件工程数据库2(题型,复习资源和计划)

文章目录 选择题关系范式事务分析E-R 图sql作业题答案链接(仅限有官方答案的版本)结语 现在实验全部做完了,实验和作业占比是百分之 40 ,通过上图可以看出来,重点是 sql 语言 所以接下来主要就是学习 sql 语句怎么书写…

软考 系统架构设计师系列知识点之杂项集萃(36)

接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(35) 第58题 对软件体系结构风格的研究和实践促进了对设计的复用。Garlan和Shaw对经典体系结构风格进行了分类。其中,( )属于数据流体系结构风格&am…

孝子黄香与颍川□董超

“香九龄,能温席,孝于亲,所当执。”家喻户晓、妇孺皆知的《三字经》让孝子黄香名扬千秋,成为“二十四孝”中闻名于世的“扇枕温衾”故事的主角。 黄香(公元68—122年),字文强,东汉江…

【Apache Doris】Compaction 原理 | 实践全析

【Apache Doris】Compaction 原理 | 实践全析 一、Compaction 前文概要二、Compaction 版本策略三、Compaction 类型说明四、Compaction 工程实现五、Compaction 生产实践 作者 | 俞剑波 一、Compaction 前文概要 LSM-Tree 简介 LSM-Tree( Log Structu…

【Vue】Pinia管理用户数据

Pinia管理用户数据 基本思想:Pinia负责用户数据相关的state和action,组件中只负责触发action函数并传递参数 步骤1:创建userStore 1-创建store/userStore.js import { loginAPI } from /apis/user export const useUserStore defineStore(…

大众点评js逆向过程(未完)

1、这里mtgsig已经被拼到url中 2、进入后mtgsig已经计算完, ir he(this[b(4326)], !1), 就是加密函数 32 次 796 1143 ->508 -> 754 -> 1151 160 注意IC这个数组 控制流平坦化进行AST 解析 AST网址

uniapp开发微信小程序问题汇总

1. 自定义校验规则validateFunction失效 2. 微信小程序不支持<Br>换行 在 <text></text> 标签中使用\n(必须 text 标签&#xff0c;view 标签无效 ) 3. 微信小程序无法使用本地静态资源图片的解决方法 (1) 将图片上传到服务器&#xff0c;小程序访问该图片…

MySQL基础——函数和约束

目录 1函数 1.1字符串函数 1.2数值函数 1.3日期函数 1.4流程函数 2约束 2.1约束概述和演示 2.2外键约束&#xff08;表连接键&#xff09; 1函数 函数是指一段可以直接被另一段程序调用的程序或代码。 1.1字符串函数 MySQL中内置了很多字符串函数&#xff0c;常用的…

WPF界面设计

1、使用C#-WPF实现抽屉效果-炫酷漂亮的侧边栏导航菜单-SplitViewMD主题重绘原生控件的美观效果-提供源码Demo下载 码源地址&#xff1a;https://download.csdn.net/download/Prince999999/89424685 2、使用C#-WPF实现抽屉效果-菜单导航功能实现&#xff0c;常规的管理系统应该…

JVM 一些常见问题QA

GC Roots 虚拟机栈中引用的对象&#xff1b; 本地方法栈中JNI引用的对象&#xff1b; 方法区中类静态变量引用的对象&#xff1b; 方法区中常量引用的对象&#xff1b; Full GC是Minor GCMajor GC吗&#xff1f; Minor GC&#xff1a;回收年轻代&#xff1b; Major GC&…

【强化学习】gymnasium自定义环境并封装学习笔记

【强化学习】gymnasium自定义环境并封装学习笔记 gym与gymnasium简介gymgymnasium gymnasium的基本使用方法使用gymnasium封装自定义环境官方示例及代码编写环境文件__init__()方法reset()方法step()方法render()方法close()方法 注册环境创建包 Package&#xff08;最后一步&a…

Ubuntu启动之引导内核阶段

按照Linux系统从打开电源到进入系统的顺序&#xff0c;整个启动过程可分为以下阶段。 BIOS阶段&#xff0c;Ubuntu启动之BIOS阶段-CSDN博客引导程序阶段&#xff0c;Ubuntu启动之引导程序阶段-CSDN博客内核阶段&#xff0c;加载内核、初始化。进入系统&#xff0c;显示登录界面…

Tomcat基础详解

第一篇&#xff1a;Tomcat基础篇 lecture&#xff1a;邓澎波 一、构建Tomcat源码环境 工欲善其事必先利其器&#xff0c;为了学好Tomcat源码&#xff0c;我们需要先在本地构建一个Tomcat的运行环境。 1.源码环境下载 源码有两种下载方式&#xff1a; 1.1 官网下载 https://…

时序预测 | MATLAB实现TCN-Attention自注意力机制结合时间卷积神经网络时间序列预测

时序预测 | MATLAB实现TCN-Attention自注意力机制结合时间卷积神经网络时间序列预测 目录 时序预测 | MATLAB实现TCN-Attention自注意力机制结合时间卷积神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现TCN-Attention自注意力机制结合时…

拥抱数字世界|AI在娱乐行业的应用,娱乐新纪元已到来

在蓬勃发展的全球化趋势下&#xff0c;越来越多的厂商正在批量涌入娱乐赛道&#xff0c;期待能创造新的增长奇迹。随着科技的不断发展&#xff0c;人工智能技术正日益深入各行各业&#xff0c;其中媒体和娱乐行业更是迎来了一场革命性的变革。在媒体和娱乐领域展现出了巨大的潜…

模型 商业画布

说明&#xff1a;系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。九块拼图&#xff0c;构建商业模式。 1 商业画布的应用 1.1 商业画布用于明确“GreenCycle”初创企业&#xff08;虚构&#xff09;的商业模式 假设有一家名为“GreenCycle”的初创…

多线程中run()和start()的区别

我们知道&#xff0c;在多线程中 Thread thread new Thread(runnable); thread.start();以及 thread.run();都可以执行runnable中run方法下的代码&#xff0c;但是二者又有所不同 下面给出一段代码用以体现二者的区别&#xff1a; 以下代码中&#xff0c;通过thread.start()启…

Scala的高级特性

Scala的高级特性 ☀小白的Scala学习笔记 目录 Scala的高级特性 1.匿名函数 2.如何把方法转化为函数 3.柯里化 1&#xff09;柯里化 2&#xff09;实例 3&#xff09;柯里化应用&#xff1a;排序 4&#xff09;练习 Tea 1.匿名函数 Scala 中的匿名函数是一种没有命名的…

可视化剪辑,账号矩阵管理,视频分发,聚合私信多功能一体化营销工具 源代码开发部署方案

可视化剪辑&#xff0c;账号矩阵管理&#xff0c;视频分发&#xff0c;聚合私信多功能一体化营销工具 源代码开发部署方案 可视化剪辑&#xff1a; 可视化剪辑开发是一种通过图形化界面和拖放操作&#xff0c;以可视化的方式进行影片剪辑和编辑的开发方法。它可以让非专业用户…

小知识点快速总结:Batch Normalization Layer(BN层)的作用

本系列文章只做简要总结&#xff0c;不详细说明原理和公式。 目录 1. 参考文章2. 主要作用3. 具体分析3.1 正则化&#xff0c;降低过拟合3.2 提高模型收敛速度&#xff0c;加速训练3.3 减少梯度爆炸或者梯度消失的情况 4. 补充4.1 BN层做的是标准化不是归一化4.2 BN层的公式4.…