【图像处理】opencv | 形态学运算:腐蚀,膨胀,开运算,闭运算| 二值图像处理

news2025/6/19 10:57:12

文章目录

  • 前言
  • 一、腐蚀和膨胀
    • 1.1腐蚀
    • 1.2膨胀
  • 二、开运算与闭运算
  • 三、礼帽与黑帽


前言

参考视频:opencv教学
参考教材:《数字图像处理基础》
我的代码基本是跟着B站的视频里面敲了一遍,然后结合教材对指定区域做了一些加强学习

一、腐蚀和膨胀

首先需要知道的是,形态学运算主要针对二值化图像。
所以在进行形态学操作前 ,我们首先应该将图像转为二值化图像

import numpy as np
X1=cv2.imread('xinpian.jpeg',0)
thresh,img = cv2.threshold(X1, thresh=128, maxval=255, type=cv2.THRESH_BINARY)

在这里插入图片描述
如图我是生成了一张芯片的二值化图像

1.1腐蚀

紧接着我们调用腐蚀命令进行操作,需要定义一个内核kernel

kernel=np.ones((5,5),np.uint8)
crosion=cv2.erode(img,kernel,iterations=1)

实现的效果如下:
在这里插入图片描述
可以看到很多较细的部分 被腐蚀掉了
1)接下来我们探讨一下不同大小的kernel对于图像的腐蚀效果差异是什么样子的?:
分别设置内核大小如下:

crosion2=cv2.erode(img,kernel2,iterations=1)
crosion3=cv2.erode(img,kernel3,iterations=1)
crosion4=cv2.erode(img,kernel4,iterations=1)
crosion5=cv2.erode(img,kernel5,iterations=1)

在这里插入图片描述
应该是内核越大,腐蚀的越狠。
整体代码:

import cv2
import numpy as np

X1=cv2.imread('xinpian.jpeg',0)
thresh,img = cv2.threshold(X1, thresh=128, maxval=255, type=cv2.THRESH_BINARY)

cv2.imshow('xinpian',img)
cv2.waitKey(0) #0为任意键位终止
cv2.destroyAllWindows()

kernel2=np.ones((2,2),np.uint8)
kernel3=np.ones((3,3),np.uint8)
kernel4=np.ones((4,4),np.uint8)
kernel5=np.ones((5,5),np.uint8)

crosion2=cv2.erode(img,kernel2,iterations=1)
crosion3=cv2.erode(img,kernel3,iterations=1)
crosion4=cv2.erode(img,kernel4,iterations=1)
crosion5=cv2.erode(img,kernel5,iterations=1)
cv2.imshow('fushi2',crosion2)
cv2.imshow('fushi3',crosion3)
cv2.imshow('fushi4',crosion4)
cv2.imshow('fushi5',crosion5)
cv2.waitKey(0) #0为任意键位终止
cv2.destroyAllWindows()

2)接下来我们探讨一下迭代次数的大小对于图像的腐蚀效果差异是什么样子的?:
分别设置迭代次数如下:

crosion1=cv2.erode(img,kernel,iterations=1)
crosion2=cv2.erode(img,kernel,iterations=2)
crosion3=cv2.erode(img,kernel,iterations=3)
crosion4=cv2.erode(img,kernel,iterations=4)

在这里插入图片描述
当然肯定是迭代次数越多,腐蚀越明显。
完整代码:

import cv2
import numpy as np

X1=cv2.imread('xinpian.jpeg',0)
thresh,img = cv2.threshold(X1, thresh=128, maxval=255, type=cv2.THRESH_BINARY)

cv2.imshow('xinpian',img)
cv2.waitKey(0) #0为任意键位终止
cv2.destroyAllWindows()

kernel=np.ones((2,2),np.uint8)


crosion1=cv2.erode(img,kernel,iterations=1)
crosion2=cv2.erode(img,kernel,iterations=2)
crosion3=cv2.erode(img,kernel,iterations=3)
crosion4=cv2.erode(img,kernel,iterations=4)
cv2.imshow('fushi1',crosion1)
cv2.imshow('fushi2',crosion2)
cv2.imshow('fushi3',crosion3)
cv2.imshow('fushi4',crosion4)
cv2.waitKey(0) #0为任意键位终止
cv2.destroyAllWindows()

1.2膨胀

膨胀运算和腐蚀运算就是反过来的

import cv2
import numpy as np

X1=cv2.imread('xinpian.jpeg',0)
thresh,img = cv2.threshold(X1, thresh=128, maxval=255, type=cv2.THRESH_BINARY)
cv2.imshow('xinpian',img)
cv2.waitKey(0) #0为任意键位终止
cv2.destroyAllWindows()

kernel=np.ones((5,5),np.uint8)
crosion=cv2.dilate(img,kernel,iterations=1)
cv2.imshow('fushi',crosion)
cv2.waitKey(0) #0为任意键位终止
cv2.destroyAllWindows()

最后的膨胀效果:

在这里插入图片描述
改变参数效果和腐蚀运算类似,这就不单独再列出了。

二、开运算与闭运算

1)开运算简单的说,就是对图像先腐蚀再膨胀
直接上代码看看

import cv2
import numpy as np

X1=cv2.imread('xinpian.jpeg',0)
thresh,img = cv2.threshold(X1, thresh=128, maxval=255, type=cv2.THRESH_BINARY)
cv2.imshow('xinpian',img)
cv2.waitKey(0) #0为任意键位终止
cv2.destroyAllWindows()

kernel=np.ones((5,5),np.uint8)
crosion=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
cv2.imshow('fushi',crosion)
cv2.waitKey(0) #0为任意键位终止
cv2.destroyAllWindows()

在这里插入图片描述
2)闭运算简单的说,就是对图像先膨胀再腐蚀

import cv2
import numpy as np

X1=cv2.imread('xinpian.jpeg',0)
thresh,img = cv2.threshold(X1, thresh=128, maxval=255, type=cv2.THRESH_BINARY)
cv2.imshow('xinpian',img)
cv2.waitKey(0) #0为任意键位终止
cv2.destroyAllWindows()

kernel=np.ones((5,5),np.uint8)
crosion=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
cv2.imshow('fushi',crosion)
cv2.waitKey(0) #0为任意键位终止
cv2.destroyAllWindows()

在这里插入图片描述

三、礼帽与黑帽

礼帽运算:原始图像减去开运算图像
黑帽运算:闭运算图像减去原始图像
1)礼帽:

import numpy as np

X1=cv2.imread('xinpian.jpeg',0)
thresh,img = cv2.threshold(X1, thresh=128, maxval=255, type=cv2.THRESH_BINARY)

kernel=np.ones((5,5),np.uint8)
crosion=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
cv2.imshow('xinpian',img)
cv2.imshow('limao',crosion)
cv2.waitKey(0) #0为任意键位终止
cv2.destroyAllWindows()

在这里插入图片描述
2)黑帽:

import cv2
import numpy as np

X1=cv2.imread('xinpian.jpeg',0)
thresh,img = cv2.threshold(X1, thresh=128, maxval=255, type=cv2.THRESH_BINARY)


kernel=np.ones((5,5),np.uint8)
crosion=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)
cv2.imshow('xinpian',img)
cv2.imshow('heimao',crosion)
cv2.waitKey(0) #0为任意键位终止
cv2.destroyAllWindows()

在这里插入图片描述

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

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

相关文章

华为云APIArts:API全生命周期一体化解决方案,帮助您端到端呵护您的API

摘要:华为云API Arts是API设计、API开发、API测试、API托管、API运维、API变现一体化协作平台,通过维护API各开发阶段数据高度一致,支持开发者高效实现API全流程一站式体验。 伴随数字化浪潮的到来,应用编程接口(API)已经成为一个…

【MySQL】2.MySQL库操作

文章目录1.0 MySQL基本使用1.1 理解数据库操作2.0 MySQL数据库操作详解2.1创建数据库2.2 字符集和校验规则2.2修改数据库2.3删除数据库2.4查看数据库链接1.0 MySQL基本使用 1.1 理解数据库操作 查看数据库配置文件 指令: vim /etc/my.cnf 登录数据库 指令: mysql…

[第十三届蓝桥杯/java/算法]A——排列字母

🧑‍🎓个人介绍:大二软件生,现学JAVA、Linux、MySQL、算法 💻博客主页:渡过晚枫渡过晚枫 👓系列专栏:[编程神域 C语言],[java/初学者],[蓝桥杯] &#x1f4d6…

机器人开发--设计范式

机器人开发--设计范式1 概念范式特点2 三种范式2.1 机器人基元:感知(sense)、规划(plan)、执行(act)2.2 范式分类分级范式 hierarchical paradigm反应范式 reactive paradigm混合范式 hybrid pa…

程序的动态链接(5):使用动态库

前言 Linux下动态库文件的命名规范是以lib开头,紧接着是动态库名,以.so为后缀名,即lib 动态库名.so。 动态库查找过程 在Linux下,动态库的搜索的优先级顺序为: 编译目标代码时指定的动态库搜索路径,保…

达梦数据库(DM8)常用SQL学习

达梦产品手册 1.检查数据库版本及服务状态 1.1 查看达梦数据库运行状态 SELECT status$ as 状态 FROM v$instance;1.2 查看达梦数据库版本 SELECT banner as 版本信息 FROM v$version;2.创建用户并授权 2.1 创建用户 -- 使用 CREATE USER 语句创建 DM 用户,登…

Python爬虫详解

从今天开始,给大家介绍Python爬虫相关知识,今天主要内容是爬虫的基础理论知识。 一、爬虫简介 爬虫是指通过编写程序,来模拟浏览器访问Web网页,然后通过一定的策略,爬取指定内容。因此,爬虫的编写通常分为…

Nature Communications:人类丘脑的基因结构及其与十种常见大脑疾病的重叠

丘脑是位于大脑中心的重要交流中枢,由不同的核组成,对意识和高级皮层功能至关重要。丘脑结构和功能的改变涉及到常见的大脑疾病的发病机制,但丘脑的遗传结构仍然很大程度上未知。在这里,使用来自30114个个体的大脑扫描和基因型数据…

【Linux】进程创建、进程终止、进程等待

目录 一、进程创建 1.1 深入 fork 函数 1.2 写时拷贝 二、进程终止 2.1 进程退出码 2.2 exit 与 _exit 三、进程等待 3.1 进程等待必要性 3.2 进程等待 3.2 wait 与 waitpid 3.3 获取子进程 status 3.4 非阻塞等待 一、进程创建 1.1 深入 fork 函数 在 Linux 中…

如何对图片进行旋转?这些工具能将图片进行旋转

大家平时在日常生活中有没有遇到这种情况:从网上保存下来的图片发现角度方向是错误的,或者是从相机导入拍摄的图片,打开图片发现它们的方向不统一,不方便我们进行观看。这时需要我们对图片进行旋转操作,才能将图片摆正…

图表控件LightningChart.NET 系列教程(四):安装

LightningChart.NET SDK 是一款高性能数据可视化插件工具,由数据可视化软件组件和工具类组成,可支持基于 Windows 的用户界面框架(Windows Presentation Foundation)、Windows 通用应用平台(Universal Windows Platfor…

Linux 内核网络栈分析: 接收数据

引言 对于内核网络栈的分析我在大二听了李勇大神来小组的讲座以后就想干了,但像很多主题的文章一样,始终没有勇气,也没有时间动手,我终究还是把这个话题从大二延到大三,从大三延到大四了。冥冥之中某种东西好像早已是…

Python 帮同事用pandas快速筛选Excel文件

同事正在为怎样处理一个18万行的全年财务Excel文件发愁,文件足足有30M,打开文件也要两三分钟,于是他就向我求助。大概意思就是要筛选出Data工作簿“源数据”Sheet中所有收款人对应的付款人及付款笔数、金额小计,于是我简化做了一个…

【RuoYi-Vue-Plus】学习笔记 45 - Spring 事件监听器 @EventListener 注解简单分析

文章目录前言参考目录测试方法配置说明测试方法功能调用流程分析事件监听器初始化事件发布流程前言 因为之前比较忙所以匿了一段时间,顺便当了神雕大侠(“阳过”)。前段时间框架已经发布了新版本 V4.4.0,而在最新的 dev 分支中使…

labelImg数据标注及yolov5的训练和测试

labelImg数据标注及yolov5的训练和测试 一、labelImg数据标注的使用 数据标注主要针对于哪个地方是什么,一般像隐私类的是不能标注的,如鲁迅的故居可以标,但是张三的住所就不能进行标注。 labelImg是数据标注主要使用的工具。 1、首先使用…

第十四章 概率图模型

14.1 隐马尔可夫模型 机器学习最重要的任务,是根据一些已观察到的证据(例如训练样本)来对感兴趣的未知变量(例如类别标记)进行估计和推测。概念模型提供了一种描述框架,将学习任务归结于计算变量的概率分布…

ffmpeg-AVPacket

目录 引子 翻译一下官方注释: 成员变量: AVBufferRef *buf pts dts data size stream_index flag side_data side_data_elems duration pos opaque opaque_ref time_base 引子 AVPacket是ffmpeg基础且非常重要的数据结构…

我国脐橙行业现状:种植面积、产量及市场规模不断增长 江西赣州是最大生产区

根据观研报告网发布的《2022年中国脐橙市场分析报告-市场全景评估与发展定位研究》显示,脐橙是芸香科,属柑橘亚科,是柑橘属植物甜橙的一类栽培品种,果皮难或稍易剥离,瓢囊9-12瓣,果心实或半充实&#xff0c…

ChatGPT

ChatGPT是由OpenAI开发的一个人工智能聊天机器人程序,于2022年11月推出。该程序使用基于GPT-3.5架构的大型语言模型并通过强化学习进行训练。目前,有部分地区(例如中国大陆、香港)无法使用此项服务,这里我就介绍一下中…

代码随想录训练营第55天|LeetCode 583. 两个字符串的删除操作、72. 编辑距离

参考 代码随想录 题目一:LeetCode 583. 两个字符串的删除操作 确定dp数组下标及其含义 为了方便dp数组的初始化,在整个分析问题的过程中在word1和word2的最前面添加空字符,注意,不是真正的添加,只是这么认为。 dp[i]…