写点什么

Python 图像处理丨三种实现图像形态学转化运算模式

  • 2022 年 7 月 19 日
  • 本文字数:1944 字

    阅读完需:约 6 分钟

Python图像处理丨三种实现图像形态学转化运算模式

本文分享自华为云社区《[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图像处理及识别》


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 4
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
Python图像处理丨三种实现图像形态学转化运算模式_Python_华为云开发者联盟_InfoQ写作社区