Python从零到壹丨图像增强的顶帽运算和底帽运算
Posted 华为云开发者社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python从零到壹丨图像增强的顶帽运算和底帽运算相关的知识,希望对你有一定的参考价值。
摘要:这篇文章详细介绍了顶帽运算和底帽运算,它们将为后续的图像分割和图像识别提供有效支撑。
本文分享自华为云社区《[Python从零到壹] 四十九.图像增强及运算篇之顶帽运算和底帽运算》,作者:eastmount。
数学形态学(Mathematical Morphology)是一种应用于图像处理和模式识别领域的新方法。数学形态学(也称图像代数)表示以形态为基础对图像进行分析的数学工具,其基本思想是用具有一定形态的结构元素去量度和提取图像中对应形状以达到对图像分析和识别的目的。
一.图像顶帽运算
图像顶帽运算(top-hat transformation)又称为图像礼帽运算,它是用原始图像减去图像开运算后的结果,常用于解决由于光照不均匀图像分割出错的问题。其公式定义如下:
图像顶帽运算是用一个结构元通过开运算从一幅图像中删除物体,顶帽运算用于暗背景上的亮物体,它的一个重要用途是校正不均匀光照的影响。其效果图如图1所示。
在Python中,图像顶帽运算主要调用morphologyEx()实现,其中参数cv2.MORPH_TOPHAT表示顶帽处理,函数原型如下:
dst = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)
- src表示原始图像
- cv2.MORPH_TOPHAT表示图像顶帽运算
- kernel表示卷积核,可以用numpy.ones()函数构建
假设存在一张光照不均匀的米粒图像,如图2所示,我们需要调用图像顶帽运算解决光照不均匀的问题。
图像顶帽运算的Python代码如下所示:
# -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np #读取图片 src = cv2.imread(\'test01.png\', cv2.IMREAD_UNCHANGED) #设置卷积核 kernel = np.ones((10,10), np.uint8) #图像顶帽运算 result = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel) #显示图像 cv2.imshow("src", src) cv2.imshow("result", result) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
其运行结果如图3所示。
下图展示了“米粒”顶帽运算的效果图,可以看到顶帽运算后的图像删除了大部分非均匀背景,并将米粒与背景分离开来。
为什么图像顶帽运算会消除光照不均匀的效果呢?
通常可以利用灰度三维图来进行解释该算法。灰度三维图主要调用Axes3D包实现,对原图绘制灰度三维图的代码如下:
# -*- coding: utf-8 -*- # By:Eastmount import numpy as np import cv2 as cv import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm from matplotlib.ticker import LinearLocator, FormatStrFormatter #读取图像 img = cv.imread("test02.png") img = cv.cvtColor(img,cv.COLOR_BGR2GRAY) imgd = np.array(img) #image类转numpy #准备数据 sp = img.shape h = int(sp[0]) #图像高度(rows) w = int(sp[1]) #图像宽度(colums) of image #绘图初始处理 fig = plt.figure(figsize=(16,12)) ax = fig.gca(projection="3d") x = np.arange(0, w, 1) y = np.arange(0, h, 1) x, y = np.meshgrid(x,y) z = imgd surf = ax.plot_surface(x, y, z, cmap=cm.coolwarm) #自定义z轴 ax.set_zlim(-10, 255) ax.zaxis.set_major_locator(LinearLocator(10)) #设置z轴网格线的疏密 #将z的value字符串转为float并保留2位小数 ax.zaxis.set_major_formatter(FormatStrFormatter(\'%.02f\')) # 设置坐标轴的label和标题 ax.set_xlabel(\'x\', size=15) ax.set_ylabel(\'y\', size=15) ax.set_zlabel(\'z\', size=15) ax.set_title("surface plot", weight=\'bold\', size=20) #添加右侧的色卡条 fig.colorbar(surf, shrink=0.6, aspect=8) plt.show()
运行结果如图5所示,其中x表示原图像中的宽度坐标,y表示原图像中的高度坐标,z表示像素点(x, y)的灰度值。
从图像中的像素走势显示了该图受各部分光照不均匀的影响,从而造成背景灰度不均现象,其中凹陷对应图像中灰度值比较小的区域。
通过图像白帽运算后的图像灰度三维图如图6所示,对应的灰度更集中于10至100区间,由此证明了不均匀的背景被大致消除了,有利于后续的阈值分割或图像分割。
绘制三维图增加的顶帽运算核心代码如下:
二.图像底帽运算
图像底帽运算(bottom-hat transformation)又称为图像黑帽运算,它是用图像闭运算操作减去原始图像后的结果,从而获取图像内部的小孔或前景色中黑点,也常用于解决由于光照不均匀图像分割出错的问题。其公式定义如下:
图像底帽运算是用一个结构元通过闭运算从一幅图像中删除物体,常用于校正不均匀光照的影响。其效果图如图8所示。
在Python中,图像底帽运算主要调用morphologyEx()实现,其中参数cv2.MORPH_BLACKHAT表示底帽或黑帽处理,函数原型如下:
dst = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)
- src表示原始图像
- cv2.MORPH_BLACKHAT表示图像底帽或黑帽运算
- kernel表示卷积核,可以用numpy.ones()函数构建
Python实现图像底帽运算的代码如下所示:
# -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np #读取图片 src = cv2.imread(\'test02.png\', cv2.IMREAD_UNCHANGED) #设置卷积核 kernel = np.ones((10, 10), np.uint8) #图像黑帽运算 result = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel) #显示图像 cv2.imshow("src", src) cv2.imshow("result", result) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
其运行结果如图9所示:
三.总结
该系列主要讲解了图像数学形态学知识,结合原理和代码详细介绍了图像腐蚀、图像膨胀、图像开运算和闭运算、图像顶帽运算和图像底帽运算等操作。这篇文章详细介绍了顶帽运算和底帽运算,它们将为后续的图像分割和图像识别提供有效支撑。
参考文献:
- [1]冈萨雷斯著,阮秋琦译. 数字图像处理(第3版)[M]. 北京:电子工业出版社,2013.
- [2]阮秋琦. 数字图像处理学(第3版)[M]. 北京:电子工业出版社,2008.
- [3]毛星云,冷雪飞. OpenCV3编程入门[M]. 北京:电子工业出版社,2015.
- [4]Eastmount. [Python图像处理] 八.图像腐蚀与图像膨胀[EB/OL]. (2018-10-31). https://blog.csdn.net/Eastmount/article/details/83581277.
[Python从零到壹] 四十九.图像增强及运算篇之顶帽运算和底帽运算
欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习20篇、大数据分析20篇、图像识别30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的关注、点赞和转发就是对秀璋最大的支持,知识无价人有情,希望我们都能在人生路上开心快乐、共同成长。
该系列文章主要讲解Python OpenCV图像处理和图像识别知识,前期主要讲解图像处理基础知识、OpenCV基础用法、常用图像绘制方法、图像几何变换等,中期讲解图像处理的各种运算,包括图像点运算、形态学处理、图像锐化、图像增强、图像平滑等,后期研究图像识别、图像分割、图像分类、图像特效处理以及图像处理相关应用。
第二部分将讲解图像运算和图像增强,上一篇文章介绍介绍开运算、闭运算和梯度运算。这篇文章将继续介绍顶帽运算和底帽运算。数学形态学(Mathematical Morphology)是一种应用于图像处理和模式识别领域的新方法。数学形态学(也称图像代数)表示以形态为基础对图像进行分析的数学工具,其基本思想是用具有一定形态的结构元素去量度和提取图像中对应形状以达到对图像分析和识别的目的。希望文章对您有所帮助,如果有不足之处,还请海涵。
文章目录
下载地址:记得点赞喔 O(∩_∩)O
- https://github.com/eastmountyxz/Python-zero2one
- 开源600多页电子书:https://github.com/eastmountyxz/HWCloudImageRecognition
前文赏析:
第一部分 基础语法
- [Python从零到壹] 一.为什么我们要学Python及基础语法详解
- [Python从零到壹] 二.语法基础之条件语句、循环语句和函数
- [Python从零到壹] 三.语法基础之文件操作、CSV文件读写及面向对象
第二部分 网络爬虫
- [Python从零到壹] 四.网络爬虫之入门基础及正则表达式抓取博客案例
- [Python从零到壹] 五.网络爬虫之BeautifulSoup基础语法万字详解
- [Python从零到壹] 六.网络爬虫之BeautifulSoup爬取豆瓣TOP250电影详解
- [Python从零到壹] 七.网络爬虫之Requests爬取豆瓣电影TOP250及CSV存储
- [Python从零到壹] 八.数据库之MySQL基础知识及操作万字详解
- [Python从零到壹] 九.网络爬虫之Selenium基础技术万字详解(定位元素、常用方法、键盘鼠标操作)
- [Python从零到壹] 十.网络爬虫之Selenium爬取在线百科知识万字详解(NLP语料构造必备技能)
第三部分 数据分析和机器学习
- [Python从零到壹] 十一.数据分析之Numpy、Pandas、Matplotlib和Sklearn入门知识万字详解(1)
- [Python从零到壹] 十二.机器学习之回归分析万字总结全网首发(线性回归、多项式回归、逻辑回归)
- [Python从零到壹] 十三.机器学习之聚类分析万字总结全网首发(K-Means、BIRCH、层次聚类、树状聚类)
- [Python从零到壹] 十四.机器学习之分类算法三万字总结全网首发(决策树、KNN、SVM、分类算法对比)
- [Python从零到壹] 十五.文本挖掘之数据预处理、Jieba工具和文本聚类万字详解
- [Python从零到壹] 十六.文本挖掘之词云热点与LDA主题分布分析万字详解
- [Python从零到壹] 十七.可视化分析之Matplotlib、Pandas、Echarts入门万字详解
- [Python从零到壹] 十八.可视化分析之Basemap地图包入门详解
- [Python从零到壹] 十九.可视化分析之热力图和箱图绘制及应用详解
- [Python从零到壹] 二十.可视化分析之Seaborn绘图万字详解
- [Python从零到壹] 二十一.可视化分析之Pyechart绘图万字详解
- [Python从零到壹] 二十二.可视化分析之OpenGL绘图万字详解
- [Python从零到壹] 二十三.十大机器学习算法之决策树分类分析详解(1)
- [Python从零到壹] 二十四.十大机器学习算法之KMeans聚类分析详解(2)
- [Python从零到壹] 二十五.十大机器学习算法之KNN算法及图像分类详解(3)
- [Python从零到壹] 二十六.十大机器学习算法之朴素贝叶斯算法及文本分类详解(4)
- [Python从零到壹] 二十七.十大机器学习算法之线性回归算法分析详解(5)
- [Python从零到壹] 二十八.十大机器学习算法之SVM算法分析详解(6)
- [Python从零到壹] 二十九.十大机器学习算法之随机森林算法分析详解(7)
- [Python从零到壹] 三十.十大机器学习算法之逻辑回归算法及恶意请求检测应用详解(8)
- [Python从零到壹] 三十一.十大机器学习算法之Boosting和AdaBoost应用详解(9)
- [Python从零到壹] 三十二.十大机器学习算法之层次聚类和树状图聚类应用详解(10)
第四部分 Python图像处理基础
- [Python从零到壹] 三十三.图像处理基础篇之什么是图像处理和OpenCV配置
- [Python从零到壹] 三十四.OpenCV入门详解——显示读取修改及保存图像
- [Python从零到壹] 三十五.图像处理基础篇之OpenCV绘制各类几何图形
- [Python从零到壹] 三十六.图像处理基础篇之图像算术与逻辑运算详解
- [Python从零到壹] 三十七.图像处理基础篇之图像融合处理和ROI区域绘制
- [Python从零到壹] 三十八.图像处理基础篇之图像几何变换(平移缩放旋转)
- [Python从零到壹] 三十九.图像处理基础篇之图像几何变换(镜像仿射透视)
- [Python从零到壹] 四十.图像处理基础篇之图像量化处理
- [Python从零到壹] 四十一.图像处理基础篇之图像采样处理
- [Python从零到壹] 四十二.图像处理基础篇之图像金字塔向上取样和向下取样
第五部分 Python图像运算和图像增强
- [Python从零到壹] 四十三.图像增强及运算篇之图像点运算和图像灰度化处理
- [Python从零到壹] 四十四.图像增强及运算篇之图像灰度线性变换详解
- [Python从零到壹] 四十五.图像增强及运算篇之图像灰度非线性变换详解
- [Python从零到壹] 四十六.图像增强及运算篇之图像阈值化处理
- [Python从零到壹] 四十七.图像增强及运算篇之腐蚀和膨胀详解
- [Python从零到壹] 四十八.图像增强及运算篇之形态学开运算、闭运算和梯度运算
- [Python从零到壹] 四十九.图像增强及运算篇之顶帽运算和底帽运算
第六部分 Python图像识别和图像高阶案例
第七部分 NLP与文本挖掘
第八部分 人工智能入门知识
第九部分 网络攻防与AI安全
第十部分 知识图谱构建实战
扩展部分 人工智能高级案例
作者新开的“娜璋AI安全之家”将专注于Python和安全技术,主要分享Web渗透、系统安全、人工智能、大数据分析、图像识别、恶意代码检测、CVE复现、威胁情报分析等文章。虽然作者是一名技术小白,但会保证每一篇文章都会很用心地撰写,希望这些基础性文章对你有所帮助,在Python和安全路上与大家一起进步。
一.图像顶帽运算
图像顶帽运算(top-hat transformation)又称为图像礼帽运算,它是用原始图像减去图像开运算后的结果,常用于解决由于光照不均匀图像分割出错的问题。其公式定义如下:
图像顶帽运算是用一个结构元通过开运算从一幅图像中删除物体,顶帽运算用于暗背景上的亮物体,它的一个重要用途是校正不均匀光照的影响。其效果图如图1所示。
在Python中,图像顶帽运算主要调用morphologyEx()实现,其中参数cv2.MORPH_TOPHAT表示顶帽处理,函数原型如下:
dst = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)
- src表示原始图像
- cv2.MORPH_TOPHAT表示图像顶帽运算
- kernel表示卷积核,可以用numpy.ones()函数构建
假设存在一张光照不均匀的米粒图像,如图2所示,我们需要调用图像顶帽运算解决光照不均匀的问题。
图像顶帽运算的Python代码如下所示:
# -*- coding: utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
#读取图片
src = cv2.imread('test01.png', cv2.IMREAD_UNCHANGED)
#设置卷积核
kernel = np.ones((10,10), np.uint8)
#图像顶帽运算
result = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)
#显示图像
cv2.imshow("src", src)
cv2.imshow("result", result)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
其运行结果如图3所示。
下图展示了“米粒”顶帽运算的效果图,可以看到顶帽运算后的图像删除了大部分非均匀背景,并将米粒与背景分离开来。
为什么图像顶帽运算会消除光照不均匀的效果呢?
通常可以利用灰度三维图来进行解释该算法。灰度三维图主要调用Axes3D包实现,对原图绘制灰度三维图的代码如下:
# -*- coding: utf-8 -*-
# By:Eastmount
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
#读取图像
img = cv.imread("test02.png")
img = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
imgd = np.array(img) #image类转numpy
#准备数据
sp = img.shape
h = int(sp[0]) #图像高度(rows)
w = int(sp[1]) #图像宽度(colums) of image
#绘图初始处理
fig = plt.figure(figsize=(16,12))
ax = fig.gca(projection="3d")
x = np.arange(0, w, 1)
y = np.arange(0, h, 1)
x, y = np.meshgrid(x,y)
z = imgd
surf = ax.plot_surface(x, y, z, cmap=cm.coolwarm)
#自定义z轴
ax.set_zlim(-10, 255)
ax.zaxis.set_major_locator(LinearLocator(10)) #设置z轴网格线的疏密
#将z的value字符串转为float并保留2位小数
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
# 设置坐标轴的label和标题
ax.set_xlabel('x', size=15)
ax.set_ylabel('y', size=15)
ax.set_zlabel('z', size=15)
ax.set_title("surface plot", weight='bold', size=20)
#添加右侧的色卡条
fig.colorbar(surf, shrink=0.6, aspect=8)
plt.show()
运行结果如图5所示,其中x表示原图像中的宽度坐标,y表示原图像中的高度坐标,z表示像素点(x, y)的灰度值。
从图像中的像素走势显示了该图受各部分光照不均匀的影响,从而造成背景灰度不均现象,其中凹陷对应图像中灰度值比较小的区域。
通过图像白帽运算后的图像灰度三维图如图6所示,对应的灰度更集中于10至100区间,由此证明了不均匀的背景被大致消除了,有利于后续的阈值分割或图像分割。
绘制三维图增加的顶帽运算核心代码如下:
二.图像底帽运算
图像底帽运算(bottom-hat transformation)又称为图像黑帽运算,它是用图像闭运算操作减去原始图像后的结果,从而获取图像内部的小孔或前景色中黑点,也常用于解决由于光照不均匀图像分割出错的问题。其公式定义如下:
图像底帽运算是用一个结构元通过闭运算从一幅图像中删除物体,常用于校正不均匀光照的影响。其效果图如图8所示。
在Python中,图像底帽运算主要调用morphologyEx()实现,其中参数cv2.MORPH_BLACKHAT表示底帽或黑帽处理,函数原型如下:
dst = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)
- src表示原始图像
- cv2.MORPH_BLACKHAT表示图像底帽或黑帽运算
- kernel表示卷积核,可以用numpy.ones()函数构建
Python实现图像底帽运算的代码如下所示:
# -*- coding: utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
#读取图片
src = cv2.imread('test02.png', cv2.IMREAD_UNCHANGED)
#设置卷积核
kernel = np.ones((10, 10), np.uint8)
#图像黑帽运算
result = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)
#显示图像
cv2.imshow("src", src)
cv2.imshow("result", result)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
其运行结果如图9所示:
三.总结
该系列主要讲解了图像数学形态学知识,结合原理和代码详细介绍了图像腐蚀、图像膨胀、图像开运算和闭运算、图像顶帽运算和图像底帽运算等操作。这篇文章详细介绍了顶帽运算和底帽运算,它们将为后续的图像分割和图像识别提供有效支撑。
感谢在求学路上的同行者,不负遇见,勿忘初心。图像处理系列主要包括三部分,分别是:
祝大家端午节快乐!最近是真的忙,期待博士毕业能好好写点系列博客,加油!
(By:Eastmount 2022-07-24 夜于武汉 http://blog.csdn.net/eastmount/ )
参考文献:
- [1]冈萨雷斯著,阮秋琦译. 数字图像处理(第3版)[M]. 北京:电子工业出版社,2013.
- [2]阮秋琦. 数字图像处理学(第3版)[M]. 北京:电子工业出版社,2008.
- [3]毛星云,冷雪飞. OpenCV3编程入门[M]. 北京:电子工业出版社,2015.
- [4]Eastmount. [Python图像处理] 八.图像腐蚀与图像膨胀[EB/OL]. (2018-10-31). https://blog.csdn.net/Eastmount/article/details/83581277.
以上是关于Python从零到壹丨图像增强的顶帽运算和底帽运算的主要内容,如果未能解决你的问题,请参考以下文章
[Python从零到壹] 四十九.图像增强及运算篇之顶帽运算和底帽运算