查看原文
其他

[Python图像处理] 十.形态学之图像顶帽运算和黑帽运算

Eastmount 娜璋AI安全之家 2022-11-30

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类、目标检测应用。

前一篇文章介绍图像形态学变换,包括图像开运算、图像闭运算和梯度运算。本篇文章继续讲解Python调用OpenCV实现图像形态学变换,包括图像顶帽运算和图像黑帽运算,基础性知识希望对您有所帮助。不足之处,还请海涵~

  • 一.图像顶帽运算

  • 二.图像黑帽运算

  • 三.总结


文章参考自己以前系列图像处理文章及OpenCV库函数,同时部分参考网易云lilizong老师的视频,推荐大家去学习。同时,本篇文章涉及到《计算机图形学》基础知识,请大家下来补充。该系列在github所有源代码:

  • https://github.com/eastmountyxz/
    ImageProcessing-Python


前文回顾(下面的超链接可以点击喔):


学Python近八年,认识了很多大佬和朋友,感恩。由于在外求学且需要养娃,故在CSDN设置成了最低价收费专栏,觉得不错的可以购买抬爱;但作者的本意是帮助更多初学者入门,因此在github开源了所有代码,也在公众号同步更新。深知自己很菜,得拼命努力前行,编程也没有什么捷径,干就对了。希望未来能更透彻学习和撰写文章,同时非常感谢参考文献中的大佬们的文章和分享,共勉。

- https://blog.csdn.net/eastmount

数学形态学(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.代码实现
完整代码如下所示:

#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.代码实现
完整代码如下所示:

#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实现图像腐蚀和图像膨胀的算法,基础性知识希望对您有所帮助。

  • 一.图像顶帽运算

  • 二.图像黑帽运算

  • 三.总结

这系列文章是当时2018年考博期间撰写的,感觉还不错。同时,回想2018年当时写这篇文章的感言,挺有意思的,每个阶段都有每个阶段的感受,并不断激励自己进步。

三尺讲台,三寸舌,
三千桃李,三杆笔。
再累再苦,站在讲台前就是最美的自己,几个月的烦恼和忧愁都已消失,真的好享受这种状态,仿佛散着光芒,终于给低年级的同学上课了越早培养编程兴趣越好,恨不能倾囊相授。即使当一辈子的教书匠,平平淡淡也喜欢,而且总感觉给学生讲课远不是课酬和职称所能比拟,这就是所谓的事业,所谓的爱好。

源代码下载地址,记得帮忙点star和关注喔!

  • https://github.com/eastmountyxz/

    ImageProcessing-Python

2020年8月18新开的“娜璋AI安全之家”,主要围绕Python大数据分析、网络空间安全、人工智能、Web渗透及攻防技术进行讲解,同时分享CCF、SCI、南核北核论文的算法实现。娜璋之家会更加系统,并重构作者的所有文章,从零讲解Python和安全,写了近十年文章,真心想把自己所学所感所做分享出来,还请各位多多指教,真诚邀请您的关注!谢谢。

(By:Eastmount 2021-05-24 夜于武汉 )


参考文献,在此感谢这些大佬,共勉!

  • [1] 冈萨雷斯. 数字图像处理(第3版)[M]. 电子工业出版社, 2013.

  • [2] 罗子江. Python中的图像处理[M]. 科学出版社, 2020.

  • [3] https://blog.csdn.net/Eastmount

  • [4]《计算机图形学》基础知识

  • [5] 部分内容参考网易云lilizong老师的视频

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存