[Python从零到壹] 五十三.图像增强及运算篇之直方图均衡化处理
首先,祝大家教师节和中秋节快乐!
欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习20篇、大数据分析20篇、图像识别30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的关注、点赞和转发就是对秀璋最大的支持,知识无价人有情,希望我们都能在人生路上开心快乐、共同成长。
该系列文章主要讲解Python OpenCV图像处理和图像识别知识,前期主要讲解图像处理基础知识、OpenCV基础用法、常用图像绘制方法、图像几何变换等,中期讲解图像处理的各种运算,包括图像点运算、形态学处理、图像锐化、图像增强、图像平滑等,后期研究图像识别、图像分割、图像分类、图像特效处理以及图像处理相关应用。
第二部分将讲解图像运算和图像增强,上一篇文章介绍了图像直方图相关知识点。这篇文章将进入图像增强系列,首先我们介绍图像增强基础知识和直方图均衡化处理方法。希望文章对您有所帮助,如果有不足之处,还请海涵。
下载地址:记得点赞喔 O(∩_∩)O
前文赏析:
第一部分 基础语法
第二部分 网络爬虫
第三部分 数据分析和机器学习
- [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从零到壹] 五十.图像增强及运算篇之图像直方图理论知识和绘制实现
- [Python从零到壹] 五十一.图像增强及运算篇之图像灰度直方图对比分析万字详解
- [Python从零到壹] 五十二.图像增强及运算篇之图像掩膜直方图和HS直方图
- [Python从零到壹] 五十三.图像增强及运算篇之直方图均衡化处理
第六部分 Python图像识别和图像高阶案例
第七部分 NLP与文本挖掘
第八部分 人工智能入门知识
第九部分 网络攻防与AI安全
第十部分 知识图谱构建实战
扩展部分 人工智能高级案例
图像增强(Image Enhancement)是指按照某种特定的需求,突出图像中有用的信息,去除或者削弱无用的信息。图像增强的目的是使处理后的图像更适合人眼的视觉特性或易于机器识别。在医学成像、遥感成像、人物摄影等领域,图像增强技术都有着广泛的应用。图像增强同时可以作为目标识别、目标跟踪、特征点匹配、图像融合、超分辨率重构等图像处理算法的预处理算法[1]。
随着消费型和专业型数码相机的日益普及,海量的图像数据正在被产生但由于场景条件的影响,很多在高动态范围场景、昏暗环境或特殊光线条件下拍摄的图像视觉效果不佳,需要进行后期增强处理压缩或拉伸动态范围或提取一致色感才能满足显示和印刷的要求。图1所示是需要进行增强处理的图像的举例。
图1(a)为一幅在高动态范围的场景中拍摄的照片,图中左上角天空区域亮度很高,但右侧大半边的树所在区域却很暗,细节几乎不可见,需采用色调映射方法进行增强,以压缩动态范围增强暗处细节;图1(b)为一幅在水下拍摄的图像,整体动态范围很低,细节辨识不清,全图都需要进行对比度增强[2]。
图像增强通常划分为如图2所示的分类,其中最重要的是图像平滑和图像锐化处理,接下来也会分别进行详细介绍。
图像增强按其变换处理所在的作用域不同而被分为空间域方法和频率域方法两大类。而由于具体的应用目的不同,其图像实际增强处理所用到的方法和增强的内容有一定的差异,但图像增强处理的各目标和方法并不互相排斥,某些应用中需要同时联合几种方法来实现最好的增强效果[3]。
空间域增强通常包含图像灰度级变换、图像直方变换、直方均衡以及使用模糊逻辑和基于优化的增强算法,如使用遗传算法和细菌觅食等算法进行优化处理以达到图像增强的目的。空间域图像增强方法的一般定义如公式(1)。
其中,为输入的待增强的图像,为处理后的增强图像,为空间域变换函数,表示对原图像在像素空间所进行的各种变换操作。当操作定义在单个像素点上时,称该操作为点操作;而空间滤波指操作作用于像素点的邻域上时的相应处理。
直方图均衡是图像增强处理中对比度变换调整中最典型的方法。该方法是空域增强中最常用、最简单有效的方法之一,其采用灰度统计特征,将原始图像中的灰度直方图从较为集中的某个灰度区间转变为均匀分布于整个灰度区域范围的变换方法。空间域增强方法按处理策略的差异,又可分为:
- 全局一致性处理
全局一致性方法较为简单,仅对图像空间像素值进行统一的调整,则未考虑像素点在空间中的分布特性。全局直方图均衡方法的主要优点是算法简单、速度快,可自动增强图像。全局直方图均衡方法的缺点是对噪声敏感、细节信息易失,在某些结果区域产生过增强问题,且对对比度增强的力度相对较低。 - 局部自适应处理
局部自适应方法较复杂,主要针对图像局部对比度、边缘等特殊区域信息进行增强。局部直方图均衡的主要优点是局部自适应,可最大限度的增强图像细节;其缺点是增强图像质量操控困难,并会随之引入噪声[4]。
基于频域的图像增强算法基础为卷积理论,该方法把图像视为波,然后利用信号处理手段来处理图像。其通用的数学表示如下公式(2)所示。
由上式逆变换后,产生增强后的图像,其表达如下公式(3)所示:
其中,为增强后的图像,为原图像的傅立叶变换,为滤波变换函数,通过大量的实验研究,发现增强处理后的图像具有比原图像更加清晰的细节。常用的滤波方法有低通、高通、带阻及同态滤波等。
频域图像增强方法从本质上是一种间接对图像进行变换处理的方法,其最早的变换理论,由傅立叶的《热分析理论》指出的周期函数表达可由不同频率和不同倍乘系数表达的正/余弦和形式表征。
随着图像处理应用不断发展,频率域变换方法近年来在小波变换基础上发展了具有更高精度和更好稀疏表达特性的方法,更加适合于表达图像的边缘轮廓信息,如 Curvelet 和 Contourlet 变换。这些超小波变换都是基于变换域的新型的多尺度分析方法,在图像对比度增强、降噪、图像融合与分割等方面得到了广泛地应用[5]。
直方图均衡化是图像灰度变化的一个重要处理,被广泛应用于图像增强领域。它是指通过某种灰度映射将原始图像的像素点均匀地分布在每一个灰度级上,其结果将产生一幅灰度级分布概率均衡的图像。
直方图均衡化的中心思想是把原始图像的灰度直方图从比较集中的某个灰度区间转变为全范围均匀分布的灰度区间,通过该处理,增加了像素灰度值的动态范围,从而达到增强图像整体对比度的效果。直方图均衡化包括三个核心步骤:
- 统计直方图中每个灰度级出现的次数;
- 计算累计归一化直方图;
- 重新计算像素点的像素值。
直方图均衡化示意图如图4所示,左边的像素值集中于中心部分,通过均衡化处理后,图像峰值不再这么高,同时0-50、200-255灰度值部分存在像素值。简单理解就是将图像的灰度值进行拉伸。
图5将左边像素偏暗的原始图像进行直方图均衡化处理,得到右边的图像色彩更均衡。
直方图均衡化算法的详细处理过程如下:
第一步,计算原始图像直方图的概率密度。
如公式(3)所示。其中,rk表示第k个灰度级(k=0,1,2,…,L-1),L最大值为256;nk表示图像中灰度级为rk的像素个数;N表示图像中像素的总个数;P(rk)为图像中第k个灰度级占总像素数的比例。
第二步,通过灰度变换函数T计算新图像灰度级的概率密度。
新图像灰度级的概率密度是原始图像灰度级概率密度的累积,如公式(4)所示。其中,k是新图像的灰度级,k=0,1,2,…,L-1;表示原始图像的第k个灰度级;为直方图均衡化处理后的第k个灰度级。
第三步,计算新图像的灰度值。
由于公式(4)计算所得的sk位于0至1之间,需要乘以图像的最大灰度级L,转换为最终的灰度值res,如公式(5)所示。
图6(a)表示原始图像,图6(b)表示其对应的直方图,x轴表示256个灰度级,y轴表示各个灰度级出现的频数。
图7(a)表示直方图均衡化处理后的图像,图7(b)表示其对应的直方图。从效果图可以看出,经过直方图均衡化处理,图像变得更加清晰,图像的灰度级分布也更加均匀[6]。
下面举一个简单的例子说明直方图均衡化的算法流程。假设存在如公式(6)所示的7×7个像素点的图像。
首先,通过各像素值出现的次数。
其统计结果如表1所示,其中像素值0出现了9次,像素值1出现了9次,依次类推,像素值7出现了8次。
接着,将表1的结果进行归一化处理。
即当前像素值出现的次数除以总的像素个数(总个数为49),比如像素值0的归一化结果为0.18,像素值1的归一化结果为0.18,依次类推,像素值7的归一化结果为0.16。
然后,统计各像素值的累计直方图。
比如像素值0的累计直方图百分比为0.18,像素值1的累计直方图百分比为像素值0(百分比为0.184)加上像素值1(百分比为0.184),最终结果四舍五入为0.37,依次类推,像素值7的累计直方图百分比为1.00。
最后,将各像素值的累计直方图百分比乘以像素范围的最大值。
此处的范围为0到7,故乘以最大值7,得到一个新的结果,即为直方图均衡化处理的结果,如表4所示。
表4将原始像素级的8个结果(0、1、2、3、4、5、6、7)直方图均衡化为6个新的结果(1、3、4、5、6、7),生成如图8所示的直方图。其中图8(a)是原始图像各像素级的直方图,图8(b)是直方图均衡化处理后的各像素级的直方图,最终结果更加均衡。
直方图均衡化可以让色彩细节更丰富,获取更多的信息,常用于人脸识别、车牌识别、医疗图像处理等领域。
Python调用OpenCV中的cv2.equalizeHist()函数实现直方图均衡化处理,并且为全局直方图均衡化。其函数原型如下所示,输出的dst图像与输入图像src具有相同的大小和类型。
dst = cv2.equalizeHist(src)
- src表示输入图像,即原图像
- dst表示目标图像,直方图均值化处理的结果
下面的代码是调用cv2.equalizeHist()函数实现图像直方图均衡化处理。
# -*- coding: utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图片
img = cv2.imread('luo.png')
#灰度转换
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#直方图均衡化处理
result = cv2.equalizeHist(gray)
#显示图像
cv2.imshow("Input", gray)
cv2.imshow("Result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果如图9所示。
下图是风景图的直方图均衡化处理,左边为原始图像,右边为直方图均衡化处理图像,它有效提升了图像的亮度及细节。
下面代码调用函数ravel()绘制了对应的直方图,并进行直方图均衡化处理前后的图像对比。
# -*- coding: utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图片
img = cv2.imread('lena.bmp')
#灰度转换
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#直方图均衡化处理
result = cv2.equalizeHist(gray)
#显示图像
plt.subplot(221)
plt.imshow(gray, cmap=plt.cm.gray), plt.axis("off"), plt.title('(a)')
plt.subplot(222)
plt.imshow(result, cmap=plt.cm.gray), plt.axis("off"), plt.title('(b)')
plt.subplot(223)
plt.hist(img.ravel(), 256), plt.title('(c)')
plt.subplot(224)
plt.hist(result.ravel(), 256), plt.title('(d)')
plt.show()
输出结果如图11所示,图11(a)为原始图像,对应的直方图为图11©,图11(b)和图11(d)为直方图处理后的图像及对应直方图,它让图像的灰度值分布更加均衡。
如果需要对彩色图片进行全局直方图均衡化处理,则需要分解RGB三色通道,分别进行处理后再进行通道合并。完整代码如下所示:
# -*- coding: utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图片
img = cv2.imread('yxz.jpg')
# 彩色图像均衡化 需要分解通道 对每一个通道均衡化
(b, g, r) = cv2.split(img)
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
# 合并每一个通道
result = cv2.merge((bH, gH, rH))
cv2.imshow("Input", img)
cv2.imshow("Result", result)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
#绘制直方图
plt.figure("Hist")
#蓝色分量
plt.hist(bH.ravel(), bins=256, normed=1, facecolor='b', edgecolor='b', hold=1)
#绿色分量
plt.hist(gH.ravel(), bins=256, normed=1, facecolor='g', edgecolor='g', hold=1)
#红色分量
plt.hist(rH.ravel(), bins=256, normed=1, facecolor='r', edgecolor='r', hold=1)
plt.xlabel("x")
plt.ylabel("y")
plt.show()
输出结果如图12所示,左边为彩色原始图像,右边为直方图均衡化处理图像,它有效提升了图像的亮度及细节。
对应的直方图如图13所示,其中x轴表示图像的灰度级,y轴表示各灰度级所对应的直方图。
同样,小珞珞图像直方图均衡化的效果如下图所示,总体而言原图图像比较偏黄,更偏近于人肤色;处理后的效果图增强了暗处和面部表情饱和度。
本章主要讲解图像增强和直方图均衡化原理知识,接着通过OpenCV实现图像均衡化处理,并显示对应的直方图显示处理前后的效果。直方图均衡化被广泛应用于图像增强领域,通过某种灰度映射将原始图像的像素点均匀地分布在每一个灰度级上,其结果将产生一幅灰度级分布概率均衡的图像。直方图均衡化的中心思想是把原始图像的灰度直方图从比较集中的某个灰度区间转变为全范围均匀分布的灰度区间,通过该处理,增加了像素灰度值的动态范围,从而达到增强图像整体对比度的效果。
感谢在求学路上的同行者,不负遇见,勿忘初心。作者在华为云社区开放了Python图像处理系列书籍,图像处理系列主要包括三部分,分别是:
感恩能与大家在华为云遇见!
希望能与大家一起在华为云社区共同成长,原文地址:https://blog.csdn.net/Eastmount/article/details/126799744
(By:Eastmount 2022-09-25 夜于武汉)
参考文献:
- [1]冈萨雷斯. 数字图像处理(第3版)[M]. 北京:电子工业出版社, 2013.
- [2]张恒博, 欧宗瑛. 一种基于色彩和灰度直方图的图像检索方法[J]. 计算机工程, 2004.
- [3]Eastmount. [数字图像处理] 四.MFC对话框绘制灰度直方图[EB/OL]. (2015-05-31). https://blog.csdn.net/eastmount/article/details/46237463.
- [4]ZJE_ANDY. python3+opencv 利用灰度直方图来判断图片的亮暗情况[EB/OL]. (2018-06-20). https://blog.csdn.net/u014453898/article/details/80745987.
- [5]阮秋琦. 数字图像处理学(第3版)[M]. 北京:电子工业出版社, 2008.
- [6]Eastmount. [Python图像处理] 十一.灰度直方图概念及OpenCV绘制直方图[EB/OL]. (2018-11-06). https://blog.csdn.net/Eastmount/article/details/83758402.
- 点赞
- 收藏
- 关注作者
评论(0)