当前位置: 首页 > news >正文

树莓派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博客

相关文章:

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

今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi) 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1: 图像的膨胀与腐蚀一般用于灰度图或者二值图,今日便来学习…...

Perplexity AI — 探索网络,发掘知识,沟通思想

体验地址:Perplexity AI (国外网站访问需要梯子) Perplexity AI是一款功能强大的人工智能搜索引擎,其特点和优势主要体现在以下几个方面: 功能: 自然语言搜索:Perplexity AI可以理解用户的自然…...

RPC知识

一、为什么要有RPC: HTTP协议的接口,在接口不多、系统与系统交互较少的情况下,解决信息孤岛初期常使用的一种通信手段;优点就是简单、直接、开发方便,利用现成的HTTP协议进行传输。 但是,如果是一个大型的网…...

【爬虫】requests 结合 BeautifulSoup抓取网页数据

一、BeautifulSoup使用步骤 BeautifulSoup 是一个用于从 HTML 或 XML 文件中提取数据的 Python 库。以下是如何使用 BeautifulSoup 来解析 HTML 并提取信息的基本步骤: 1、安装: 如果你还没有安装 BeautifulSoup,你可以使用 pip 来安装它。…...

安全测试框架 二

使用安全测试框架进行测试,可以遵循以下步骤进行,以确保测试的全面性和系统性: 一、明确测试目标和需求 确定测试的范围和重点,明确要测试的系统或应用的安全性方面的关键点和重要性。根据业务需求和安全标准,制定详…...

安徽京准-NTP网络授时服务器助力助力甘南州公共资源交易

安徽京准-NTP网络授时服务器助力助力甘南州公共资源交易 安徽京准-NTP网络授时服务器助力助力甘南州公共资源交易 2024年5月中旬,我安徽京准科技生产研发的NTP时钟服务器成功投运甘南州公共资源交易中心,为该中心的计算机网络系统及其他各业务子系统提供…...

大数据—什么是大数据?

大数据是指所涉及的资料量规模巨大到无法透过主流软件工具,在合理时间内达到撷取、管理、处理、并整理成为帮助企业经营决策更积极目的的资讯。想要更加全面地了解大数据的概念,可以从以下几个维度进行介绍: 大数据的定义: 基本…...

德克萨斯大学奥斯汀分校自然语言处理硕士课程汉化版(第十一周) - 自然语言处理扩展研究

自然语言处理扩展研究 1. 多语言研究2. 语言锚定3. 伦理问题 1. 多语言研究 多语言(Multilinguality)是NLP的一个重要研究方向,旨在开发能够处理多种语言的模型和算法。由于不同语言在语法、词汇和语义结构上存在差异,这成为一个复杂且具有挑战性的研究…...

支持向量机(SVM)中核函数的本质意义

本质上在做什么? 内积是距离度量,核函数相当于将低维空间的距离映射到高维空间的距离,并非对特征直接映射。 为什么要求核函数是对称且Gram矩阵是半正定? 核函数对应某一特征空间的内积,要求①核函数对称;②…...

SpringBoot使用jasypt实现数据库信息的脱敏,以此来保护数据库的用户名username和密码password(容易上手,详细)

1.为什么要有这个需求? 一般当我们自己练习的时候,username和password直接是爆露出来的 假如别人路过你旁边时看到了你的数据库账号密码,他跑到他的电脑打开navicat直接就是一顿连接,直接疯狂删除你的数据库,那可就废…...

Python日志配置策略

1 三种情况下都能实现日志打印: 被库 A 调用,使用库 A 的日志配置。被库 B 调用,使用库 B 的日志配置。独立运行,使用自己的日志配置。 需要实现一个灵活的日志配置策略,使得日志记录器可以根据调用者或运行环境自动…...

想学编程,什么语言最好上手?

Python是许多初学者的首选,因为它的语法简洁易懂,而且有丰富的资源和社区支持。我这里有一套编程入门教程,不仅包含了详细的视频 讲解,项目实战。如果你渴望学习编程,不妨点个关注,给个评论222,…...

binlog和redolog有什么区别

在数据库管理系统中,binlog(binary log)和 redolog(redo log)是两种重要的日志机制,它们在数据持久性和故障恢复方面扮演着关键角色。虽然它们都用于记录数据库的变化,但它们的目的和使用方式有…...

Linux笔记--ubuntu文件目录+命令行介绍

文件目录 命令行介绍 当我们在ubuntu中命令行处理位置输入ls后会显示出其所有目录,那么处理这些命令的程序就是shell,它负责接收用户的输入,并根据输入找到其他程序并运行 命令行格式 linux的命令一般由三部分组成:command命令、…...

71、最长上升子序列II

最长上升子序列II 题目描述 给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少。 输入格式 第一行包含整数N。 第二行包含N个整数,表示完整序列。 输出格式 输出一个整数,表示最大长度。 数据范围 1 ≤ N ≤ 100000…...

解决必剪电脑版导出视频缺斤少两的办法

背景 前几天将电脑重置了,今天想要剪辑一下视频,于是下载了必剪,将视频、音频都调整好,导出,结果15分钟的视频只能导出很短的时长,调整参数最多也只能导出10分钟,My God! 解决 首…...

新人学习笔记之(常量)

一、什么是常量 1.常量:在程序的执行过程中,其值不能发生改变的数据 二、常量的分类 常量类型说明举例整型常量整数、负数、0123 456实型常量所有带小数点的数字1.93 18.2字符常量单引号引起来的字母、数字、英文符号S B字符串常量双引号引起来的&…...

Lua解释器裁剪

本文目录 1、引言2、文件功能3、选择需要初始化的库4、结论 文章对应视频教程: 已更新。见下方 点击图片或链接访问我的B站主页~~~ Lua解释器裁剪,很简单~ 1、引言 在嵌入式中使用lua解释器,很多时候会面临资源紧张的情况。 同时&#xff0c…...

web前端设计nav:深入探索导航栏设计的艺术与技术

web前端设计nav:深入探索导航栏设计的艺术与技术 在web前端设计中,导航栏(nav)扮演着至关重要的角色,它不仅是用户浏览网站的指引,更是网站整体设计的点睛之笔。本文将从四个方面、五个方面、六个方面和七…...

分析解读NCCL_SHM_Disable与NCCL_P2P_Disable

在NVIDIA的NCCL(NVIDIA Collective Communications Library)库中,NCCL_SHM_Disable 和 NCCL_P2P_Disable 是两个重要的环境变量,它们控制着NCCL在多GPU通信中的行为和使用的通信机制。下面是对这两个环境变量的详细解读&#xff1…...

使用 Python 进行测试(6)Fake it...

总结 如果我有: # my_life_work.py def transform(param):return param * 2def check(param):return "bad" not in paramdef calculate(param):return len(param)def main(param, option):if option:param transform(param)if not check(param):raise ValueError(…...

Flink Watermark详解

Flink Watermark详解 一、概述 Flink Watermark是Apache Flink框架中为了处理乱序和延迟事件时间数据而引入的一种机制。在流处理中,由于数据可能不是按照事件产生的时间顺序到达的,Watermark被用来告知系统在该时间戳之前的数据已经全部到达&#xff…...

LeetCode538.把二叉搜索树转换为累加树

class Solution { public:int sum 0; TreeNode* convertBST(TreeNode* root) { if (root){convertBST(root->right);sum root->val;root->val sum;convertBST(root->left);}return root;}};...

关于编程思想

面向过程思想 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了 JS就是典型的面向过程的编程语言 优点: 性能比面向对象编程高,适合跟硬件联系很紧密的东西…...

521. 最长特殊序列 Ⅰ(Rust单百解法-脑筋急转弯)

题目 给你两个字符串 a 和 b,请返回 这两个字符串中 最长的特殊序列 的长度。如果不存在,则返回 -1 。 「最长特殊序列」 定义如下:该序列为 某字符串独有的最长 子序列 (即不能是其他字符串的子序列) 。 字符串 s …...

【YashanDB知识库】PHP使用OCI接口使用数据库绑定参数功能异常

【问题分类】驱动使用 【关键字】OCI、驱动使用、PHP 【问题描述】 PHP使用OCI8连接yashan数据库,使用绑定参数获取数据时,出现报错 如果使用PDO_OCI接口连接数据库,未弹出异常,但是无法正确获取数据 【问题原因分析】 开启O…...

深入分析 Android BroadcastReceiver (三)

文章目录 深入分析 Android BroadcastReceiver (三)1. 广播消息的优缺点及使用场景1.1 优点1.2 缺点 2. 广播的使用场景及代码示例2.1. 系统广播示例:监听网络状态变化 2.2. 自定义广播示例:发送自定义广播 2.3. 有序广播示例:有序广播 2.4. …...

在java中使用Reactor 项目中的一个类Mono,用于表示异步单值操作

Mono 是 Reactor 项目中的一个类,用于表示异步单值操作。Reactor 是一个响应式编程库,广泛应用于 Java 中的异步编程和非阻塞 I/O 操作。Mono 可以类比为一个可能(或将来)包含零个或一个值的异步计算结果。与 Flux(另一…...

LabVIEW故障预测

在LabVIEW故障预测中,振动信号特征提取的关键技术主要包括以下几个方面: 时域特征提取:时域特征是直接从振动信号的时间序列中提取的特征。常见的时域特征包括振动信号的均值、方差、峰值、峰-峰值、均方根、脉冲指数等。这些特征能够反映振动…...

掌握JavaScript中的`async`和`await`:循环中的使用指南

引言 在JavaScript的异步编程中,async和await提供了一种更接近同步代码的写法,使得异步逻辑更加清晰易懂。然而,当它们与循环结合时,一些常见的陷阱和误区可能会出现。本文将通过代码示例,指导你如何在循环中正确使用…...

真做视频网站/百度推广登录页面

1、Python有两种提示符(>>>)和次提示符(…)。主提示符是解释器告诉你它在等待你输入下一个语句,次提示符告诉你解释器正在等待你输入当前语句的其他部分。 2、Python有两种主要的方式来完成你的要求&#xff…...

上海企业网站制作费用/广西壮族自治区在线seo关键词排名优化

Server at 0.0.0.0:27017 reports maximum wire version 5, but this version of the Node.js Driver requires at least 6 (MongoDB 3.6) 尝试使用更早版本的 mongodb-compass...

下载类网站做多久才有流量/福州网站优化

首先说一下 出于性能优化的角度 要尽量少用Activity,甚至只用1个,界面用碎片来承载,这样便于内存以及业务逻辑的管理single instance 适合整个安卓系统只有这样一个活动的情形,比如launcher,所以一般用不到single task…...

移动网上/陕西seo主管

如何让百度搜索结果显示您的网站logo、ico、官网?非指定网站logo:一般由百度蜘蛛智能抓取,文章列表页内容页、带上图片大于121*75即可,太大太小也不行指定logo:到百度站长平台添加即可,新网站有点点难度。官…...

杭州临平网站建设/广州关键词seo

jquery 缓存到浏览器这是您可能使用jQuery预加载图像以将图像添加到浏览器缓存 (作为隐藏的DOM div元素的一部分)的方式。 (function($,D,W) {var JQUERY4U {};JQUERY4U.UTIL {images:{loadingImage: ,ajaxImage: ,savingImage: },preloadImages: fun…...

什么是网站挂马/百度信息流广告代理

转载于:https://www.cnblogs.com/Crixus3714/p/9790884.html...