该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类、目标检测应用。
前一篇文章介绍图像形态学变换,包括图像开运算、图像闭运算和梯度运算。本篇文章继续讲解Python调用OpenCV实现图像形态学变换,包括图像顶帽运算和图像黑帽运算,基础性知识希望对您有所帮助。不足之处,还请海涵~
- 一.图像顶帽运算
- 二.图像黑帽运算
- 三.总结
文章参考自己以前系列图像处理文章及OpenCV库函数,同时部分参考网易云lilizong老师的视频,推荐大家去学习。同时,本篇文章涉及到《计算机图形学》基础知识,请大家下来补充。该系列在github所有源代码:
- https://github.com/eastmountyxz/ ImageProcessing-Python
数学形态学(Mathematical morphology)是一门建立在图论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。其基本的运算包括:腐蚀和膨胀、开运算和闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换等。
一. 图像顶帽运算
1.基本原理 图像顶帽(或图像礼帽)运算是原始图像减去图像开运算的结果,得到图像的噪声。如下图所示:
顶帽运算(img) = 原始图像(img) - 开运算(img)
2.函数原型 图像开运算主要使用的函数morphologyEx,它是形态学扩展的一组函数,其参数cv2.MORPH_TOPHAT对应开运算。其原型如下:
- dst = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)
参数dst表示处理的结果,src表示原图像,cv2.MORPH_TOPHAT表示顶帽运算,kernel表示卷积核。下图表示5*5的卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。
卷积如下图所示:
3.代码实现 完整代码如下所示:
代码语言:javascript复制#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_TOPHAT, kernel)
#显示图像
cv2.imshow("src", src)
cv2.imshow("result", result)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果如下图所示,可以看到外部噪声被提取出来。
如果想获取更多的细节,可以将卷积设置为10*10,如下图所示:
- kernel = np.ones((10,10), np.uint8)
- result = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)
二. 图像黑帽运算
1.基本原理 图像黑帽运算是图像闭运算操作减去原始图像的结果,得到图像内部的小孔,或者前景色中的小黑点。如下图所示:
黑帽运算(img) = 闭运算图像(img) - 原始图像(img)
2.函数原型 图像开运算主要使用的函数morphologyEx,它是形态学扩展的一组函数,其参数cv2.MORPH_BLACKHAT对应开运算。其原型如下:
- dst = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)
参数dst表示处理的结果,src表示原图像,cv2.MORPH_BLACKHAT表示黑帽运算,kernel表示卷积核。下图表示5*5的卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。
3.代码实现 完整代码如下所示:
代码语言:javascript复制#encoding:utf-8
import cv2
import numpy as np
#读取图片
src = cv2.imread('test02.png', cv2.IMREAD_UNCHANGED)
#设置卷积核
kernel = np.ones((5,5), np.uint8)
#图像黑帽运算
result = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)
#显示图像
cv2.imshow("src", src)
cv2.imshow("result", result)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果如下图所示,可以看到图像内部黑点被提取出来。
但内部比较大的四个黑点没有被提取,如果想获取更多的细节,可以将卷积设置为10*10,如下图所示:
- kernel = np.ones((10,10), np.uint8)
- result = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)
三.总结
本篇文章主要讲解Python调用OpenCV实现图像腐蚀和图像膨胀的算法,基础性知识希望对您有所帮助。
- 一.图像顶帽运算
- 二.图像黑帽运算
- 三.总结
源代码下载地址,记得帮忙点star和关注喔!
- https://github.com/eastmountyxz/ ImageProcessing-Python
参考文献,在此感谢这些大佬,共勉!
- [1] 冈萨雷斯. 数字图像处理(第3版)[M]. 电子工业出版社, 2013.
- [2] 罗子江. Python中的图像处理[M]. 科学出版社, 2020.
- [3] https://blog.csdn.net/Eastmount
- [4]《计算机图形学》基础知识
- [5] 部分内容参考网易云lilizong老师的视频