本文分享自华为云社区《[Python 图像处理] 九。形态学之图像开运算、闭运算、梯度运算》,作者:eastmount。
数学形态学(Mathematical morphology)是一门建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。其基本的运算包括:腐蚀和膨胀、开运算和闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat 变换、颗粒分析、流域变换等。
本篇文章主要讲解 Python 调用 OpenCV 实现图像形态学转化,包括图像开运算、图像闭运算和梯度运算,基础性知识希望对您有所帮助。

  • 1. 图像开运算
  • 2. 图像闭运算
  • 3. 图像梯度运算
  
一。图像开运算

  1. 基本原理
图像开运算是图像依次经过腐蚀、膨胀处理后的过程。图像被腐蚀后,去除了噪声,但是也压缩了图像;接着对腐蚀过的图像进行膨胀处理,可以去除噪声,并保留原有图像。如下图所示:
开运算 (img) = 膨胀 ( 腐蚀 (img) )
v2-03897a028fbdbf422dc40d1439c6bd45_720w.jpg
下图是 hanshanbuleng 博主提供的开运算效果图,推荐大家学习他的文章。
https://blog.csdn.net/hanshanbuleng/article/details/80657148
v2-0fbb2c07960af71b95c1631338bed047_720w.jpg

  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) 构建。
v2-5d4ab7c2b12f3564026ba29cde7e6c7f_720w.jpg
运行结果如下图所示:
v2-16d2f4d13f70e2d708ead5d3996144d3_720w.jpg

  3. 代码实现
完整代码如下所示:
  
  1. #encoding:utf-8
  2. import cv2  
  3. import numpy as np  
  4. #读取图片
  5. src = cv2.imread('test01.png', cv2.IMREAD_UNCHANGED)
  6. #设置卷积核
  7. kernel = np.ones((5,5), np.uint8)
  8. #图像开运算
  9. result = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)
  10. #显示图像
  11. cv2.imshow("src", src)
  12. cv2.imshow("result", result)
  13. #等待显示
  14. cv2.waitKey(0)
  15. cv2.destroyAllWindows()

输出结果如下图所示,可以看到噪声已经被去除了。
v2-b73d861f028140277c5081656eeb3bf6_720w.jpg
但是结果 result 中仍然有部分噪声,如果想去除更彻底将卷积设置为 10*10 的。
  1. kernel = np.ones((10,10), np.uint8)
  2. result = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)
v2-3d8d6f284c4c56be9dd23fc43e4e6e71_720w.jpg

  二。图像闭运算
  1. 基本原理
图像闭运算是图像依次经过膨胀、腐蚀处理后的过程。图像先膨胀,后腐蚀,它有助于关闭前景物体内部的小孔,或物体上的小黑点。如下图所示:
闭运算 (img) = 腐蚀 ( 膨胀 (img) )
v2-faed54e06bc79ed73220b09b2f0e1f55_720w.jpg
下图是 hanshanbuleng 博主提供的开运算效果图,推荐大家学习他的文章。
v2-6d2f2d6a20bd869cf785db3e84ad3610_720w.jpg

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

  3. 代码实现
完整代码如下所示:
  
  1. #encoding:utf-8
  2. import cv2  
  3. import numpy as np  
  4. #读取图片
  5. src = cv2.imread('test03.png', cv2.IMREAD_UNCHANGED)
  6. #设置卷积核
  7. kernel = np.ones((10,10), np.uint8)
  8. #图像闭运算
  9. result = cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel)
  10. #显示图像
  11. cv2.imshow("src", src)
  12. cv2.imshow("result", result)
  13. #等待显示
  14. cv2.waitKey(0)
  15. cv2.destroyAllWindows()

输出结果如下图所示,可以看到中间的噪声去掉。
v2-c008f24b9f2ac47d8faf025a6b0c8f75_720w.jpg

  三。图像梯度运算
  1. 基本原理
图像梯度运算是膨胀图像减去腐蚀图像的结果,得到图像的轮廓,其中二值图像 1 表示白色点,0 表示黑色点。如下图所示:
梯度运算 (img) = 膨胀 (img) - 腐蚀 (img)
v2-c4abd762a09c5de9206bcf551e8b421f_720w.jpg
  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) 构建。
运行结果如下图所示:
v2-5f9fef122d157893690d8efc4139e2fa_720w.jpg
  3. 代码实现
完整代码如下所示:
  
  1. #encoding:utf-8
  2. import cv2  
  3. import numpy as np  
  4. #读取图片
  5. src = cv2.imread('test04.png', cv2.IMREAD_UNCHANGED)
  6. #设置卷积核
  7. kernel = np.ones((10,10), np.uint8)
  8. #图像闭运算
  9. result = cv2.morphologyEx(src, cv2.MORPH_GRADIENT, kernel)
  10. #显示图像
  11. cv2.imshow("src", src)
  12. cv2.imshow("result", result)
  13. #等待显示
  14. cv2.waitKey(0)
  15. cv2.destroyAllWindows()

输出结果如下图所示,可以看到中间的噪声去掉。
v2-3b62d1eaaa27ef895afbfbcfe703753c_720w.jpg
该系列在 github 所有源代码:https://github.com/eastmountyxz/ImageProcessing-Python
本文摘录自 eastmount X 华为云开发者社区联合出品的电子书《从零到一・Python 图像处理及识别》。点击免费下载电子书《从零到一・Python 图像处理及识别》