图像基本处理——腐蚀和膨胀

2023-11-03

一、形态学——腐蚀

腐蚀就是通过卷积核,将边界部分向内部靠近,逐步腐蚀掉。

  1. opencv腐蚀函数

    def erode(src: Any,
              kernel: Any,
              dst: Any = None,
              anchor: Any = None,
              iterations: Any = None,
              borderType: Any = None,
              borderValue: Any = None)
    

    部分参数说明

    src:腐蚀图像对象
    kernel:卷积核,一般是全1矩阵
    anchor:结构元素的锚点位置,默认值为(-1,-1)表示位于结构元素中心位置
    iteration:迭代运算次数

  2. 腐蚀函数使用
    代码内容
    ①读取原始图片

    import cv2
    import numpy as np
    # 读取原始图片
    harriet = cv2.imread("harriet.png")
    cv2.imshow("Harriet", harriet)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    在这里插入图片描述
    ②进行腐蚀操作

    # 构造一个全1的5*5矩阵
    kernel = np.ones((5, 5), np.int)
    # 进行腐蚀操作
    erosion = cv2.erode(harriet, kernel, iterations=1)
    cv2.imshow("Harriet", erosion)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    在这里插入图片描述
    通过腐蚀结果可以看出,进行腐蚀过后,整个笔画变细了。腐蚀操作一般用于来去掉图片的毛刺

  3. 实例查看腐蚀函数参数
    代码内容

    import cv2
    import numpy as np
    circle = cv2.imread("circle.png")
    cv2.imshow("circle", circle)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    kernel = np.ones((30, 30), np.int)
    erosion1 = cv2.erode(circle, kernel, iterations=1)
    erosion2 = cv2.erode(circle, kernel, iterations=2)
    erosion3 = cv2.erode(circle, kernel, iterations=3)
    res = np.hstack((erosion1, erosion2, erosion3))
    cv2.imshow("res", res)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    在这里插入图片描述
    在这里插入图片描述
    通过腐蚀的最终结果可以发现,迭代次数越大,腐蚀效果越明显,同理可以验证卷积核越大,腐蚀效果也越明显。

二、形态学——膨胀

膨胀就是通过卷积核,将边界部分向外部靠近,逐步变粗。实际上膨胀就是腐蚀的逆过程。

  1. opencv膨胀函数
    def dilate(src: Any,
               kernel: Any,
               dst: Any = None,
               anchor: Any = None,
               iterations: Any = None,
               borderType: Any = None,
               borderValue: Any = None)
    
    其中,参数含义跟腐蚀参数一致。
  2. 实际举例
    harriet = cv2.imread("harriet.png")
    # 构造一个全1的5*5矩阵
    kernel = np.ones((5, 5), np.int)
    dilate = cv2.dilate(harriet, kernel, iterations=1)
    cv2.imshow("Harriet", dilate)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    circle = cv2.imread("circle.png")
    kernel = np.ones((30, 30), np.int)
    dilate1 = cv2.dilate(circle, kernel, iterations=1)
    dilate2 = cv2.dilate(circle, kernel, iterations=2)
    dilate3 = cv2.dilate(circle, kernel, iterations=3)
    res = np.hstack((dilate1, dilate2, dilate3))
    cv2.imshow("res", res)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    所用到的原始图片跟上面一致。
    膨胀后图片
    在这里插入图片描述
    在这里插入图片描述
    同理发现,迭代次数越大,膨胀效果越明显。

三、腐蚀和膨胀组合运算

开运算,闭运算和梯度运算都是进行了腐蚀和膨胀操作,开运算和闭运算主要在于进行的先后顺序。
opencv的开闭运算函数

def morphologyEx(src: Any,
                 op: Any,
                 kernel: Any,
                 dst: Any = None,
                 anchor: Any = None,
                 iterations: Any = None,
                 borderType: Any = None,
                 borderValue: Any = None)

主要在于op的参数选择

开运算
cv2.MORPH_OPEN
闭运算
cv2.MORPH_CLOSE
梯度运算
cv2.MORPH_GRADIENT

(一)开运算

开运算是先腐蚀,在闭运算。

  1. 实际举例
    harriet = cv2.imread("harriet.png")
    # 构造一个全1的5*5矩阵
    kernel = np.ones((5, 5), np.int)
    opening = cv2.morphologyEx(harriet, cv2.MORPH_OPEN, kernel)
    cv2.imshow("open", opening)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    在这里插入图片描述

(二)闭运算

闭运算先膨胀,后腐蚀

  1. 实际举例
    harriet = cv2.imread("harriet.png")
    # 构造一个全1的5*5矩阵
    kernel = np.ones((5, 5), np.int)
    closeing = cv2.morphologyEx(harriet, cv2.MORPH_CLOSE, kernel)
    cv2.imshow("close", closeing)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    在这里插入图片描述
    通过两种运算的对比发现,图像存在毛刺的时候,采用闭运算并一定能够去掉毛刺部分,反而可能导致毛刺变粗。

(三)梯度运算

梯度运算是用膨胀后的内容减去腐蚀后的内容,得到边界内容或者是轮廓。

  1. 实际举例
    circle = cv2.imread("circle.png")
    # 构造一个全1的5*5矩阵
    kernel = np.ones((5, 5), np.int)
    gradient = cv2.morphologyEx(circle, cv2.MORPH_GRADIENT, kernel)
    cv2.imshow("gradient", gradient)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    在这里插入图片描述

四、礼帽和黑帽

opencv使用的函数同上面的腐蚀和膨胀运算使用到的函数。
op参数说明

礼帽
cv2.MORPH_TOHAT
黑帽
cv2.MORPH_BLACKHAT

(一)礼帽

礼帽结果为原始图像减去开运算结果,得到结果应该为多余的毛刺部分。

  1. 实际举例
    harriet = cv2.imread("harriet.png")
    # 构造一个全1的5*5矩阵
    kernel = np.ones((5, 5), np.int)
    tohat = cv2.morphologyEx(harriet, cv2.MORPH_TOHAT, kernel)
    cv2.imshow("tohat", tohat)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    在这里插入图片描述

(二)黑帽

黑帽结果为闭运算结果减去原始图像,得到结果应该为原始图像的大概轮廓。

  1. 实际举例
    harriet = cv2.imread("harriet.png")
    # 构造一个全1的5*5矩阵
    kernel = np.ones((5, 5), np.int)
    blackhat = cv2.morphologyEx(harriet, cv2.MORPH_BLACKHAT, kernel)
    cv2.imshow("tohat", blackhat)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    在这里插入图片描述
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图像基本处理——腐蚀和膨胀 的相关文章

  • 下载 PyQt6 的 Qt Designer 并使用 pyuic6 将 .ui 文件转换为 .py 文件

    如何下载 PyQt6 的 QtDesigner 如果没有适用于 PyQt6 的 QtDesigner 我也可以使用 PyQt5 的 QtDesigner 但是如何将此 ui 文件转换为使用 PyQt6 库而不是 PyQt5 的 py 文件
  • 如何收集列表、字典等中重复计算的结果(或制作修改每个元素的列表的副本)?

    There are a great many existing Q A on Stack Overflow on this general theme but they are all either poor quality typical
  • 导入错误:没有名为 _ssl 的模块

    带 Python 2 7 的 Ubuntu Maverick 我不知道如何解决以下导入错误 gt gt gt import ssl Traceback most recent call last File
  • Flask 和 uWSGI - 无法加载应用程序 0 (mountpoint='')(找不到可调用或导入错误)

    当我尝试使用 uWSGI 启动 Flask 时 出现以下错误 我是这样开始的 gt cd gt root localhost uwsgi socket 127 0 0 1 6000 file path to folder run py ca
  • 如何等到 Excel 计算公式后再继续 win32com

    我有一个 win32com Python 脚本 它将多个 Excel 文件合并到电子表格中并将其另存为 PDF 现在的工作原理是输出几乎都是 NAME 因为文件是在计算 Excel 文件内容之前输出的 这可能需要一分钟 如何强制工作簿计算值
  • 为 pandas 数据透视表中的每个值列定义 aggfunc

    试图生成具有多个 值 列的数据透视表 我知道我可以使用 aggfunc 按照我想要的方式聚合值 但是如果我不想对两列求和或求平均值 而是想要一列的总和 同时求另一列的平均值 该怎么办 那么使用 pandas 可以做到这一点吗 df pd D
  • Python tcl 未正确安装

    我刚刚为 python 安装了graphics py 但是当我尝试运行以下代码时 from graphics import def main win GraphWin My Circle 100 100 c Circle Point 50
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • Python 中的二进制缓冲区

    在Python中你可以使用StringIO https docs python org library struct html用于字符数据的类似文件的缓冲区 内存映射文件 https docs python org library mmap
  • 在pyyaml中表示具有相同基类的不同类的实例

    我有一些单元测试集 希望将每个测试运行的结果存储为 YAML 文件以供进一步分析 YAML 格式的转储数据在几个方面满足我的需求 但测试属于不同的套装 结果有不同的父类 这是我所拥有的示例 gt gt gt rz shorthand for
  • Numpy 优化

    我有一个根据条件分配值的函数 我的数据集大小通常在 30 50k 范围内 我不确定这是否是使用 numpy 的正确方法 但是当数字超过 5k 时 它会变得非常慢 有没有更好的方法让它更快 import numpy as np N 5000
  • 如何将 PIL 图像转换为 NumPy 数组?

    如何转换 PILImage来回转换为 NumPy 数组 这样我就可以比 PIL 进行更快的像素级转换PixelAccess允许 我可以通过以下方式将其转换为 NumPy 数组 pic Image open foo jpg pix numpy
  • 在Python中重置生成器对象

    我有一个由多个yield 返回的生成器对象 准备调用该生成器是相当耗时的操作 这就是为什么我想多次重复使用生成器 y FunctionWithYield for x in y print x here must be something t
  • 检查所有值是否作为字典中的键存在

    我有一个值列表和一本字典 我想确保列表中的每个值都作为字典中的键存在 目前我正在使用两组来确定字典中是否存在任何值 unmapped set foo set bar keys 有没有更Pythonic的方法来测试这个 感觉有点像黑客 您的方
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • 如何使用google colab在jupyter笔记本中显示GIF?

    我正在使用 google colab 想嵌入一个 gif 有谁知道如何做到这一点 我正在使用下面的代码 它并没有在笔记本中为 gif 制作动画 我希望笔记本是交互式的 这样人们就可以看到代码的动画效果 而无需运行它 我发现很多方法在 Goo
  • 在 Python 类中动态定义实例字段

    我是 Python 新手 主要从事 Java 编程 我目前正在思考Python中的类是如何实例化的 我明白那个 init 就像Java中的构造函数 然而 有时 python 类没有 init 方法 在这种情况下我假设有一个默认构造函数 就像
  • 您可以在 Python 类型注释中指定方差吗?

    你能发现下面代码中的错误吗 米皮不能 from typing import Dict Any def add items d Dict str Any gt None d foo 5 d Dict str str add items d f
  • Python - 字典和列表相交

    给定以下数据结构 找出这两种数据结构共有的交集键的最有效方法是什么 dict1 2A 3A 4B list1 2A 4B Expected output 2A 4B 如果这也能产生更快的输出 我可以将列表 不是 dict1 组织到任何其他数
  • PyAudio ErrNo 输入溢出 -9981

    我遇到了与用户相同的错误 Python 使用 Pyaudio 以 16000Hz 录制音频时出错 https stackoverflow com questions 12994981 python error audio recording

随机推荐

  • 计算机网络不完全整理(下)--春招实习

    HTTP 从输入url到显示主页的过程 参考 segmentfault com a 119000000 DNS解析 网址到ip地址的转换 TCP连接 HTTP协议使用TCP作为传输层协议 发送HTTP请求 服务器处理请求并返回HTTP报文
  • Flink Watermark分配策略

    Flink Watermark分配策略 WaterMark是Flink为了处理Event Time窗口计算提出的一种机制 本质上是一种时间戳 主要用来处理乱序数据或者延迟数据的 这里通常watermark机制结合window来实现 wate
  • Spring 单例 bean 的线程安全问题

    首先解释一下什么是单例 bean 单例的意思就是说在 Spring IoC 容器中只会存在一个 bean 的实例 无论一次调用还是多次调用 始终指向的都是同一个 bean 对象 用代码来解释单例 bean public class User
  • Cisco L2TP 配置实例

    1 在企业端配置L2TP ENT LNS config username cisco password 0 cisco ENT LNS config vpdn enable ENT LNS config vpdn group myl2tp
  • 创建小程序WePY项目过程报错指南

    笔者在第一次创建小程序 WePY 项目的时候 遇到了各种各样的问题 也在网上搜索了一番 终于也还是把 WePY 项目创建起来了 为了日后遇到问题更快的处理 笔者也把在创建过程的遇到的问题记录了下来 如下 1 在 WebStorm 中创建一个
  • 用Python实现的这五个小游戏,你真的学会了嘛?

    相关文件 源码分享 问题解答 关注小编 私信小编领取哟 当然别忘了一件三连哟 对了大家可以关注小编的公众号哟 有很多资源可以领取的哟 Python日志 游戏名称 五子棋 雷霆战机 贪吃蛇 坦克大战 俄罗斯方块 开发环境 Python版本 3
  • 区块链DAPP开发入门课程(PHP版)

    1 前言及环境部署 1 1 课程说明 为什么有这个课程 入门区块链开发已有些时日 走过的坑实在是太多了 对于像我这种从事互联网软件开发多事的老兵来说 上手都有些吃力 可想而知对于新手来说就更难了 尤其是完全靠自学又没有人指导的情况 可能一个
  • navicat导入sql文件_中级数据分析-SQL入门

    一 如何快速学会SQL 黄金圈原则 1 为什么 目的 很多公司数据存放在数据库当中 SQL是操作数据库的语言 所以目前SQL是数据分析岗位几乎必备的技能 也是面试当中必须考察的能力 2 如何做 方法 入门 什么是数据库 sql 表和数据的新
  • c++日志库实战——spdlog,是不是感觉log4cxx有点笨重,不妨试一试spdlog

    c 日志库实战 spdlog 是不是感觉log4cxx有点笨重 不妨试一试spdlog 背景 更新记录 spdlog是什么 spdlog快速入门 编译 CMake手动方式 Vcpkg全自动方式 推荐 原生用法 实战代码 SpdlogWarp
  • 【深度学习】 Python 和 NumPy 系列教程(十四):Matplotlib详解:1、2d绘图(下):箱线图、热力图、面积图、等高线图、极坐标图

    目录 一 前言 二 实验环境 三 Matplotlib详解 1 2d绘图类型 0 设置中文字体 1 5 折线图 散点图 柱状图 直方图 饼图 6 箱线图 Box Plot 7 热力图 Heatmap 8 面积图 Area Plot 9 等高
  • 接口自动化测试框架搭建【附详细搭建视频】

    如果遇到什么问题建议观看下面视频 敢称全站第一 B站最全的Python自动化测试深度学习教程 学完即就业 小白也能信手拈来 帮你少走99 的弯路 一 原理及特点 参数放在XML文件中进行管理 用httpClient简单封装一个httpUti
  • shell类型、添加PATH环境变量、.bashrc、.profile、/etc/profile、/etc/environment

    shell类型 使用 cat etc shells 查看用户的可用shell 使用 echo SHELL 查看当前正在使用的shell 打开terminal终端 shell等待用户输入 并执行输入的操作命令 这种方式叫做交互式模式 执行 s
  • C++ 并发指南 std::lock

    C 11 标准为我们提供了两种基本的锁类型 分别如下 std lock guard 与 Mutex RAII 相关 方便线程对互斥量上锁 std unique lock 与 Mutex RAII 相关 方便线程对互斥量上锁 但提供了更好的上
  • python(48): 进程,线程 ,协程

    区别 进程 拥有代码和打开的文件资源 数据资源 独立的内存空间 线程 线程从属于进程 是程序的实际执行者 一个进程至少包含一个主线程 也可以有更多的子线程 线程拥有自己的栈空间 对操作系统来说 线程是最小的执行单元 进程是最小的资源管理单元
  • Linux如何查找大文件或目录总结

    在Windows系统中 我们可以使用TreeSize工具查找一些大文件或文件夹 非常的方便高效 在Linux系统中 如何去搜索一些比较大的文件呢 下面我整理了一下在Linux系统中如何查找大文件或文件夹的方法 其实很多时候 你需要了解当前系
  • springboot jdbctemplate 实现多数据源

    1 简介 所谓多数据源 其实就是在一个项目中使用多个数据库实例中的数据库或者同一个数据库实例中多个不同的库 在大部分情况下会使用更加强大的持久化框架来访问数据库 比如MyBatis Hibernate或者Spring Data JPA等OR
  • 【论文笔记】GeneFace: Generalized and High-FidelityAudio-Driven 3D Talking Face Synthesis

    一 背景 1 1 挑战 这项工作泛化能力弱 存在的两个挑战 1 训练数据规模小 2 容易产生 平均脸 音频到其对应的面部运动是一对多映射 这意味着相同的音频输入可能具有多个正确的运动模式 使用基于回归的模型学习此类映射会导致过度平滑和模糊结
  • Ubuntu-14.04.5-server安装Tomcat7.0.52

    背景 部署项目需要安装的Tomcat版本为 apache tomcat 7 0 52 tar gz 本文记录安装Tomcat的步骤如下 1 下载Tomcat 访问官网 找到 apache tomcat 7 0 52 tar gz 下载tar
  • es6选择题(带答案)

    es6选择题 1 下面不属于ECMAScript规范的范围的是 A 数据类型 B 语法 C DOM事件 D 内置对象和函数的标准库 答案 C 解析 DOM事件不属于ECMAScript的部分 ECMAScript定义的内容 语法 类型 原型
  • 图像基本处理——腐蚀和膨胀

    文章目录 一 形态学 腐蚀 二 形态学 膨胀 三 腐蚀和膨胀组合运算 一 开运算 二 闭运算 三 梯度运算 四 礼帽和黑帽 一 礼帽 二 黑帽 一 形态学 腐蚀 腐蚀就是通过卷积核 将边界部分向内部靠近 逐步腐蚀掉 opencv腐蚀函数 d