《OpenCV计算机视觉》—— 图像形态学(腐蚀、膨胀等)

文章目录

  • 一、图像形态学基本概念
  • 二、基本运算
    • 1.简单介绍
    • 2.代码实现
  • 三、高级运算
    • 1.简单介绍
    • 2.代码实现

一、图像形态学基本概念

  • 图像形态学是图像处理科学的一个独立分支,它基于集合论和数学形态学的理论,专门用于分析和处理图像中的形状和结构
  • 图像形态学处理主要关注的是二值图像(黑白图像或是灰度图),其基本思想是用具有一定形态特征的结构元素去量度和提取图像中的对应形状,以实现图像分析和识别的目的。与传统的基于线性理论的空域或频域图像处理技术相比,图像形态学具有不模糊图像边界和细节、对噪声不敏感、提取的图像边缘平滑、骨架较连续、易于并行处理等特点

二、基本运算

1.简单介绍

  • 图像形态学的基本运算主要包括四种:膨胀、腐蚀、开运算和闭运算。

    • 腐蚀(Erosion):通过结构元素与图像进行卷积,将结构元素包含的图像区域缩小,以去除图像中小的细节和噪声。这一操作可以用于细化边缘、分离紧密相连的物体等。
    • 膨胀(Dilation):与腐蚀相反,膨胀操作通过结构元素与图像进行卷积,将结构元素包含的图像区域扩大,以填充图像中的空洞和连接图像中的断线。这有助于填充小的空洞、连接断裂的物体等。
    • 开运算(Opening):先进行腐蚀操作,再进行膨胀操作的组合。这种操作可以去除图像中的小噪声和细小物体,同时保留图像中的主要结构。
    • 闭运算(Closing):与开运算相反,闭运算是先进行膨胀操作,再进行腐蚀操作的组合。它可以用于填充图像中的小空洞,连接图像中的断裂结构,并平滑图像边缘。

2.代码实现

  • 基本运算代码实现

    import cv2
    import numpy as np# 读取图像(这里所给的图片已经是黑白图,直接读取,不需要进行二值化操作)
    image = cv2.imread('zhiwen.png')# 定义结构元素
    # 这里使用3x3的正方形结构元素
    kernel = np.ones((3, 3), np.uint8)# 腐蚀操作 cv2.erode()
    eroded_image = cv2.erode(image, kernel, iterations=1)  # iterations 为迭代次数(执行了多少次操作)# 膨胀操作 cv2.dilate()
    dilated_image = cv2.dilate(image, kernel, iterations=1)# cv2.morphologyEx() 函数用于执行更复杂的形态学操作,如开运算和闭运算
    # 开运算:先腐蚀后膨胀  cv2.MORPH_OPEN()
    opening_image = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)# 闭运算:先膨胀后腐蚀  cv2.MORPH_CLOSE()
    closing_image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)# 显示结果
    cv2.imshow('Original Image', image)
    cv2.imshow('Eroded Image', eroded_image)
    cv2.imshow('Dilated Image', dilated_image)
    cv2.imshow('Opening Image', opening_image)
    cv2.imshow('Closing Image', closing_image)# 等待任意键按下后关闭所有窗口
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
  • 原图如下
    在这里插入图片描述

  • 腐蚀图(左)与膨胀图(右)
    在这里插入图片描述

  • 开运算图(左)与闭运算图(右)
    在这里插入图片描述

三、高级运算

1.简单介绍

  • 基于上述基本运算,还可以推导出多种高级形态学运算方法,如形态学梯度、顶帽变换、底帽变换等。

    • 形态学梯度(Morphological Gradient):通过膨胀和腐蚀操作的差异,可以得到图像边缘的强度信息,有助于边缘检测
    • 顶帽变换:先将图像进行开运算(先腐蚀后膨胀),然后将原始图像与开运算结果相减,作用与应用如下:
      • 顶帽变换能够突出原始图像中比周围区域更明亮的小尺度细节或亮度变化。
      • 常用于增强图像的局部对比度,以突出微小的细节,如血管、细胞核等。
      • 在医学图像分析(如血管和细胞核分割)以及纹理分析中发挥重要作用。
    • 黑帽变换:先将图像进行闭运算(先膨胀后腐蚀),然后用闭运算结果减去原始图像 ,作用与应用如下:
      • 黑帽变换能够突出原始图像中比周围区域更暗的小尺度细节或亮度变化。
      • 常用于检测图像中的小暗斑点或小暗物体,以及用于凸显亮背景上的暗物体。
      • 在图像增强、缺陷检测、文字识别等领域有广泛应用。

2.代码实现

  • 形态学梯度运算代码实现

    """梯度运算"""
    # 读取图片
    wenzi = cv2.imread('wenzi.png')# 定义结构元素
    # 这里使用2x2的正方形结构元素
    kernel = np.ones((2, 2), np.uint8)# 膨胀
    pz_wenzi = cv2.dilate(wenzi, kernel, iterations=2)
    # 腐蚀
    fs_wenzi = cv2.erode(wenzi, kernel, iterations=2)# 膨胀 - 腐蚀  cv2.MORPH_GRADIENT
    TiDu_wenzi = cv2.morphologyEx(wenzi, cv2.MORPH_GRADIENT, kernel)# 显示图片
    cv2.imshow('yuantu_wenzi', wenzi)
    cv2.imshow('pz_wenzi', pz_wenzi)
    cv2.imshow('fs_wenzi', fs_wenzi)
    cv2.imshow('TiDu_wenzi', TiDu_wenzi)# 等待任意键按下后关闭所有窗口
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
  • 原图
    在这里插入图片描述

  • 膨胀(左)、腐蚀(中)、形态学梯度运算(膨胀 - 腐蚀)(右)
    在这里插入图片描述

  • 顶帽和黑帽代码实现

    """顶帽和黑帽"""
    # 顶帽 = 原始图片 - 开运算结果(先腐蚀后膨胀)
    # 黑帽 = 原始图片 - 闭运算结果(先膨胀后腐蚀)# 读取图片
    sun = cv2.imread('sun.png')# 定义结构元素
    # 这里使用3x3的正方形结构元素
    kernel = np.ones((3, 3), np.uint8)# 开运算
    sun_open = cv2.morphologyEx(sun, cv2.MORPH_OPEN, kernel)
    # 闭运算
    sun_close = cv2.morphologyEx(sun, cv2.MORPH_CLOSE, kernel)# 顶帽  cv2.MORPH_TOPHAT
    tophat = cv2.morphologyEx(sun, cv2.MORPH_TOPHAT, kernel)# 黑帽  cv2.MORPH_BLACKHAT
    blackhat = cv2.morphologyEx(sun, cv2.MORPH_BLACKHAT, kernel)# 显示图片
    cv2.imshow('sun_yuantu', sun)
    cv2.imshow('sun_open', sun_open)
    cv2.imshow('sun_close', sun_close)
    cv2.imshow('TOPHAT', tophat)
    cv2.imshow('blackhat', blackhat)# 等待任意键按下后关闭所有窗口
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
  • 原图
    在这里插入图片描述

  • 开运算(左)与顶帽(右)
    在这里插入图片描述

  • 闭运算(左)与黑帽(右)
    在这里插入图片描述

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

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

相关文章

linux学习之线程2:线程控制与使用

铺垫 之前我们提到,Linux不直接对线程进行调度,而是对轻量级进程进行调度。但用户就想像Windows那样直接对线程进程控制。所以,就有了pthread库来封装了一层。 那么想要进行线程控制,要用pthread库。(pthread库是原生…

Java面试题-基础和框架-Java面试题三

JMM 8 Q1:JMM 的作用是什么? Java 线程的通信由 JMM 控制,JMM 的主要目的是定义程序中各种变量的访问规则。变量包括实例字段、静态字段,但不包括局部变量与方法参数,因为它们是线程私有的,不存在多线程竞…

Spire.PDF for .NET【文档操作】演示:创比较 PDF 文档

PDF 已成为跨不同平台共享和保存文档的标准格式,在专业和个人环境中都发挥着无处不在的作用。但是,创建高质量的 PDF 文档需要多次检查和修订。在这种情况下,了解如何有效地比较 PDF 文件并找出它们的差异变得至关重要,这使文档编…

《Python编程:从入门到实践》外星人入侵

一、规划 在游戏《外星人入侵》中,玩家控制着一艘最初出现在屏幕底部中央的飞船。玩家可以使用箭头键左右移动飞船,还可使用空格键进行射击。游戏开始时,一群外星人出现在天空中,他们在屏 幕中向下移动。玩家的任务是射杀这些外星…

潘多拉的盒子还是阿拉丁的神灯:揭示RAG噪声在大语言模型中的作用

一、结论写在前面 论文来自清华大学、北京国家信息科学与技术研究中心 论文标题:Pandora’s Box or Aladdin’s Lamp: A Comprehensive Analysis Revealing the Role of RAG Noise in Large Language Models 论文链接:https://arxiv.org/pdf/2408.135…

Prompt - 将图片的表格转换成Markdown

Prompt - 将图片的表格转换成Markdown 0. 引言1. 提示词2. 原始版本 0. 引言 最近尝试将图片中的表格转换成Markdown格式,需要不断条件和优化提示词。记录一下调整好的提示词,以后在继续优化迭代。 1. 提示词 英文版本: You are an AI as…

C/C++ let __DATE__ format to “YYYY-MM-DD“

C/C let DATE format to “YYYY-MM-DD” code&#xff1a; #include <iostream> #include <string>class compileDate {// 静态函数&#xff0c;用来格式化并返回编译日期 static std::string formatCompileDate() {// 编译时的日期&#xff0c;格式为 "MMM…

【包教包会】CocosCreator3.x拖尾MotionStreak威力加强版(支持3.x、支持原生、可合批)

将去年写的2.x拖尾升级到3.x 完美适配Web、原生平台&#xff08;其余平台没测过&#xff09;。 保留原版功能&#xff08;拖尾会跟随节点位移、缩放、受节点透明度影响&#xff0c;但不会跟随节点旋转&#xff09; 支持世界坐标 / 本地坐标切换&#xff08;至于为什么需要这…

10.Shell 截取字符串

Shell 截取字符串通常有两种方式&#xff1a;从指定位置开始截取和从指定字符&#xff08;子字符串&#xff09;开始截取。 从指定位置开始截取 这种方式需要两个参数&#xff1a;除了指定起始位置&#xff0c;还需要截取长度&#xff0c;才能最终确定要截取的字符串。 既然…

提升汽车行业软件质量:ASPICE培训的关键实践方法

ASPICE&#xff08;汽车行业软件过程改进和能力确定&#xff09;培训是一种针对汽车行业软件开发和维护过程的标准化培训。 该培训旨在帮助组织提高其软件开发和维护过程的质量和效率。以下是ASPICE培训的一些最佳实践方法&#xff1a; 1. 理解ASPICE框架&#xff1a;首先&…

[论文笔记]LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale

引言 今天带来第一篇量化论文LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale笔记。 为了简单&#xff0c;下文中以翻译的口吻记录&#xff0c;比如替换"作者"为"我们"。 大语言模型已被广泛采用&#xff0c;但推理时需要大量的GPU内…

Python存储与读写二进制文件

技术背景 一般情况下我们会选择使用明文形式来存储数据&#xff0c;如json、txt、csv等等。如果是需要压缩率较高的存储格式&#xff0c;还可以选择使用hdf5或者npz等格式。还有一种比较紧凑的数据存储格式&#xff0c;就是直接按照二进制格式存储。这种格式下&#xff0c;存储…

ArgoUML与StarUML的安装

ArgoUML与StarUML的安装 说明&#xff1a; 首次发表日期&#xff1a;2024-09-07ArgoUML 官网&#xff1a; https://argouml-tigris-org.github.io/tigris/argouml/StarUML 官网&#xff1a; https://staruml.io/ ArgoUML 以下内容基于&#xff1a; https://blog.csdn.net/h…

2024年智能录屏解决方案全攻略,从桌面到云端

如果你有过录屏经验那你一定遇到过被限制录制时长或者录制的画面比较模糊之类的情况。这次我我推荐几款免费录屏软件&#xff0c;让我们可以更自由的录制屏幕画面。 1.福晰REC大师 链接&#xff1a;www.foxitsoftware.cn/REC/ 这款软件便捷好操作&#xff0c;而且符合我这次…

post请求中有[]报400异常

序言 在和前端同学联调的时候&#xff0c;发现只要post请求参数里面有[]&#xff0c;就会报400的错误 可以看到日志中&#xff1a; The valid characters are defined in RFC 7230 and RFC 3986 解决办法&#xff1a; 参考了博客&#xff1a; spring boot 中解决post请求中有…

辽宁汇聚公益慈善力量,绿葆网络助力辽宁绿色生态建设,彰显企业大爱

9月5日&#xff0c;于辽宁省沈阳市隆重举行的“中华慈善日”主题宣传活动暨“山海有情 天辽地宁”即开型福利彩票发行、“生态公益林”项目启动仪式上&#xff0c;广州绿葆网络发展有限公司作为受邀企业之一&#xff0c;积极履行社会责任&#xff0c;向辽宁省慈善联合总会捐赠了…

Linxu系统:kill命令

1、命令详解&#xff1a; kill命令是用于向进程发送信号&#xff0c;通常用来终止某个指定PID服务进程&#xff0c;kill命令可以发送不同的信号给目标进程&#xff0c;来实现不同的操作&#xff0c;如果不指定信号&#xff0c;默认会发送 TERM 信号&#xff08;15&#xff09;&…

[论文笔记]Making Large Language Models A Better Foundation For Dense Retrieval

引言 今天带来北京智源研究院(BAAI)团队带来的一篇关于如何微调LLM变成密集检索器的论文笔记——Making Large Language Models A Better Foundation For Dense Retrieval。 为了简单&#xff0c;下文中以翻译的口吻记录&#xff0c;比如替换"作者"为"我们&quo…

Deploying Spring Boot Apps Tips

Java PaaS providers chatter command Efficient deployments See also spring-boot-reference.pdf https://docs.spring.io/spring-framework/reference/integration/checkpoint-restore.html

【拓扑系列】拓扑排序

【拓扑系列】拓扑排序 前言认识有向无环图认识AOV网&#xff1a;顶点活动图拓扑排序 1. 课程表1.1 题目来源1.2 题目描述1.3 题目解析 2. 课程表 II2.1 题目来源2.2 题目描述2.3 题目解析 3. LCR 114. 火星词典3.1 题目来源3.2 题目描述3.3 题目解析 前言 认识有向无环图 图中…