Python图像处理丨三种实现图像形态学转化运算模式
摘要:本篇文章主要讲解Python调用OpenCV实现图像形态学转化,包括图像开运算、图像闭运算和梯度运算
本文分享自华为云社区《[Python图像处理] 九.形态学之图像开运算、闭运算、梯度运算》,作者:eastmount。
数学形态学(Mathematical morphology)是一门建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。其基本的运算包括:腐蚀和膨胀、开运算和闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换等。
本篇文章主要讲解Python调用OpenCV实现图像形态学转化,包括图像开运算、图像闭运算和梯度运算,基础性知识希望对您有所帮助。
- 1.图像开运算
- 2.图像闭运算
- 3.图像梯度运算
一. 图像开运算
1.基本原理
图像开运算是图像依次经过腐蚀、膨胀处理后的过程。图像被腐蚀后,去除了噪声,但是也压缩了图像;接着对腐蚀过的图像进行膨胀处理,可以去除噪声,并保留原有图像。如下图所示:
开运算(img) = 膨胀( 腐蚀(img) )

下图是hanshanbuleng博主提供的开运算效果图,推荐大家学习他的文章。
https://blog.csdn.net/hanshanbuleng/article/details/80657148

2.函数原型
图像开运算主要使用的函数morphologyEx,它是形态学扩展的一组函数,其参数cv2.MORPH_OPEN对应开运算。其原型如下:
dst = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)
参数dst表示处理的结果,src表示原图像,cv2.MORPH_OPEN表示开运算,kernel表示卷积核。下图表示5*5的卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。

运行结果如下图所示:

3.代码实现
完整代码如下所示:
#encoding:utf-8
import cv2
import numpy as np #读取图片
src = cv2.imread('test01.png', cv2.IMREAD_UNCHANGED) #设置卷积核
kernel = np.ones((5,5), np.uint8) #图像开运算
result = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel) #显示图像
cv2.imshow("src", src)
cv2.imshow("result", result) #等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果如下图所示,可以看到噪声已经被去除了。

但是结果result中仍然有部分噪声,如果想去除更彻底将卷积设置为10*10的。
kernel = np.ones((10,10), np.uint8)
result = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)

二. 图像闭运算
1.基本原理
图像闭运算是图像依次经过膨胀、腐蚀处理后的过程。图像先膨胀,后腐蚀,它有助于关闭前景物体内部的小孔,或物体上的小黑点。如下图所示:
闭运算(img) = 腐蚀( 膨胀(img) )

下图是hanshanbuleng博主提供的开运算效果图,推荐大家学习他的文章。

2.函数原型
图像闭运算主要使用的函数morphologyEx,其原型如下:
dst = cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel)
参数dst表示处理的结果,src表示原图像, cv2.MORPH_CLOSE表示闭运算,kernel表示卷积核。下图表示5*5的卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。

运行结果如下图所示:

3.代码实现
完整代码如下所示:
#encoding:utf-8
import cv2
import numpy as np #读取图片
src = cv2.imread('test03.png', cv2.IMREAD_UNCHANGED) #设置卷积核
kernel = np.ones((10,10), np.uint8) #图像闭运算
result = cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel) #显示图像
cv2.imshow("src", src)
cv2.imshow("result", result) #等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果如下图所示,可以看到中间的噪声去掉。

三. 图像梯度运算
1.基本原理
图像梯度运算是膨胀图像减去腐蚀图像的结果,得到图像的轮廓,其中二值图像1表示白色点,0表示黑色点。如下图所示:
梯度运算(img) = 膨胀(img) - 腐蚀(img)

2.函数原型
图像梯度运算主要使用的函数morphologyEx,参数为cv2.MORPH_GRADIENT。其原型如下:
dst = cv2.morphologyEx(src, cv2.MORPH_GRADIENT, kernel)
参数dst表示处理的结果,src表示原图像, cv2.MORPH_GRADIENT表示梯度运算,kernel表示卷积核。5*5的卷积核可以采用函数 np.ones((5,5), np.uint8) 构建。
运行结果如下图所示:

3.代码实现
完整代码如下所示:
#encoding:utf-8
import cv2
import numpy as np #读取图片
src = cv2.imread('test04.png', cv2.IMREAD_UNCHANGED) #设置卷积核
kernel = np.ones((10,10), np.uint8) #图像闭运算
result = cv2.morphologyEx(src, cv2.MORPH_GRADIENT, kernel) #显示图像
cv2.imshow("src", src)
cv2.imshow("result", result) #等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果如下图所示,可以看到中间的噪声去掉。

该系列在github所有源代码:https://github.com/eastmountyxz/ImageProcessing-Python
本文摘录自eastmount X华为云开发者社区联合出品的电子书《从零到一 • Python图像处理及识别》。点击免费下载电子书《从零到一 • Python图像处理及识别》
Python图像处理丨三种实现图像形态学转化运算模式的更多相关文章
- Python图像处理丨带你认识图像量化处理及局部马赛克特效
摘要:本文主要讲述如何进行图像量化处理和采样处理及局部马赛克特效. 本文分享自华为云社区<[Python图像处理] 二十.图像量化处理和采样处理及局部马赛克特效>,作者: eastmoun ...
- python中的三种输入方式
python中的三种输入方式 python2.X python2.x中以下三个函数都支持: raw_input() input() sys.stdin.readline() raw_input( )将 ...
- python—字符串拼接三种方法
python—字符串拼接三种方法 1.使用加号(+)号进行拼接 字符串拼接直接进行相加就可以,比较容易理解,但是一定要记得,变量直接相加,不是变量就要用引号引起来,不然会出错,另外数字是要转换为字 ...
- Python图像处理丨图像腐蚀与图像膨胀
摘要:本篇文章主要讲解Python调用OpenCV实现图像腐蚀和图像膨胀的算法. 本文分享自华为云社区<[Python图像处理] 八.图像腐蚀与图像膨胀>,作者: eastmount . ...
- Python图像处理丨基于OpenCV和像素处理的图像灰度化处理
摘要:本篇文章讲解图像灰度化处理的知识,结合OpenCV调用cv2.cvtColor()函数实现图像灰度操作,使用像素处理方法对图像进行灰度化处理. 本文分享自华为云社区<[Python图像处理 ...
- 跟我学Python图像处理丨何为图像的灰度非线性变换
摘要:本文主要讲解灰度线性变换,基础性知识希望对您有所帮助. 本文分享自华为云社区<[Python图像处理] 十六.图像的灰度非线性变换之对数变换.伽马变换>,作者:eastmount . ...
- Python图像处理丨认识图像锐化和边缘提取的4个算子
摘要:图像锐化和边缘提取技术可以消除图像中的噪声,提取图像信息中用来表征图像的一些变量,为图像识别提供基础. 本文分享自华为云社区<[Python图像处理] 十七.图像锐化与边缘检测之Rober ...
- 跟我学Python图像处理丨关于图像金字塔的图像向下取样和向上取样
摘要:本文讲述图像金字塔知识,了解专门用于图像向上采样和向下采样的pyrUp()和pyrDown()函数. 本文分享自华为云社区<[Python图像处理] 二十一.图像金字塔之图像向下取样和向上 ...
- 跟我学Python图像处理丨基于灰度三维图的图像顶帽运算和黑帽运算
摘要:本篇文章结合灰度三维图像讲解图像顶帽运算和图像黑猫运算,通过Python调用OpenCV函数实现. 本文分享自华为云社区<[Python图像处理] 十三.基于灰度三维图的图像顶帽运算和黑帽 ...
随机推荐
- python matplotlib在mac os x 中如何显示中文,完美解决
一. 下载相关的中文字体 simhei 文件: 下载地址 二.通过以下代码查找matplotlib的数据存放位置: import matplotlib print(matplotlib.matplot ...
- Django学习——Django settings 源码、模板语法之传值、模板语法之获取值、模板语法之过滤器、模板语法之标签、自定义过滤器、标签、inclusion_tag、模板的导入、模板的继承
Django settings 源码 """ 1.django其实有两个配置文件 一个是暴露给用户可以自定义的配置文件 项目根目录下的settings.py 一个是项目默 ...
- APP应用前端开发
1.开发手机APP前端要重视meta标签的编写: 2.注意HTML5标签在前端开发中的使用: 3.前端制作要舍弃CSS float属性(可flex布局),用绝对定位不利于页面布局的扩展: 4.APP前 ...
- 批量上传文件或者上传大文件时 gateWay报错DataBufferLimitException: Exceeded limit on max bytes to buffer : 262144
一.描述 最近在批量上传文件时网关出现了异常,后面发现上传大文件也会出现文件超过256发生异常,异常信息如下: org.springframework.core.io.buffer.DataBuffe ...
- jQuery前端第三方框架
计时器 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- JWT 访问令牌
JWT 访问令牌 更为详细的介绍jwt 在学习jwt之前我们首先了解一下用户身份验证 1 单一服务器认证模式 一般过程如下: 用户向服务器发送用户名和密码. 验证服务器后,相关数据(如用户名,用户角色 ...
- Java 15 新特性:隐藏类
什么是隐藏类 隐藏类,是一种不能被其他类直接使用的类.引入隐藏类的主要目的是给框架来使用,使得框架可以在运行时生成类,并通过反射间接使用它们.可能有点抽象,不要紧,下面我们通过一个例子来直观的认识它! ...
- 【多线程】线程礼让 Thread.yield()
线程礼让 Thread.yield() 礼让线程,让当前正在执行的线程暂停,但不阻塞 : 将线程从运行状态转为就绪状态 : 让cpu重新调度,礼让不一定成功!看CPU心情. 代码示例: /** * @ ...
- 每日一题20180401-Linux
一.题目 1.1 在mysql命令行临时开启自动补全 1.2 通过shell脚本打印乘法口诀表 二.答案 2.1 # auto-rehash:读取表信息和列信息,可以在连上终端后开启tab补齐功能 # ...
- Python汉诺塔求解
1 def hanoi(n,a,b,c): 2 3 if(n>0): 4 5 hanoi(n-1,a,b,c) 6 7 print("Move disc no:%d from pile ...