数字图像处理(17): 直方图均衡化处理

数字图像处理(17): 直方图均衡化处理目录 1 直方图均衡化简介 1 1 直方图均衡化概念 1 2 直方图均衡化的理论基础 1 3 直方图均衡化的步骤 1 4 直方图均衡化应用场景 2 直方图均衡化 equalizeHist 3matplotlib pyplot subplot 函数 4matplotlib pyplot imshow 函数 5 直方图均衡化对比参考资料 1 直方图均衡

数字图像处理(17): 直方图均衡化处理

目录

1 直方图均衡化简介

1.1 直方图均衡化概念

1.2 直方图均衡化的理论基础

1.3 直方图均衡化的步骤

1.4 直方图均衡化应用场景

2 直方图均衡化-equalizeHist()

3 matplotlib.pyplot.subplot() 函数

4 matplotlib.pyplot.imshow() 函数

5 直方图均衡化对比

参考资料


 

1 直方图均衡化简介

1.1 直方图均衡化概念

直方图均衡化 (Histogram Equalization) 就是把一个已知灰度概率密度分布的图像经过一种变换,使之演变为一幅具有均匀灰度概率密度分布的新图像。

如下图所示,过暗过亮的图像 经过直方图均衡化,使得图像变得清晰。

数字图像处理(17): 直方图均衡化处理

数字图像处理(17): 直方图均衡化处理

 

1.2 直方图均衡化的理论基础

前提:如果一幅图像占有全部可能的灰度级,并且均匀分布。

结论:该图像具有高对比度和多变的灰色色调。

外观:图像细节丰富,质量更高。

 

1.3 直方图均衡化的步骤

(1)计算累计直方图;

(2)将累计直方图进行区间转换;

(3)在累计直方图中,概率相近的原始值,会被处理为相同的值。

 

具体的例子如下:

如下图所示,已知一幅图像的像素分布为 7\times7,根据像素值,则可以计算出统计直方图

数字图像处理(17): 直方图均衡化处理

 

根据统计直方图,可以算出归一化直方图和累计直方图,如下图所示:

数字图像处理(17): 直方图均衡化处理

 

将累计直方图进行区间转换,如下图所示:

数字图像处理(17): 直方图均衡化处理

 

由上图的结果可知,原先8个灰度级转变成6个灰度级,那么原始直方图和均衡直方图为:

数字图像处理(17): 直方图均衡化处理

 

上面的灰度级是8,那灰度级转变成256,计算方法类似,如下图所示:

数字图像处理(17): 直方图均衡化处理

 

同样的,原始直方图和均衡直方图为:

数字图像处理(17): 直方图均衡化处理

 

由上图可以看出,虽然二者相似,但右侧均衡化后的直方图分布更均匀,相邻像素级概率和与高概率近似相等。如果将两张图的灰度级放在同一区间,可以看出差别更大,如下图所示:

数字图像处理(17): 直方图均衡化处理

 

1.4 直方图均衡化应用场景

(1)医学图像处理

(2)车牌照识别

(3)人脸识别


 

2 直方图均衡化-equalizeHist()

OpenCV库下,直方图均衡化使用  equalizeHist() 函数,函数用法如下所示:

dst=cv2.equalizeHist(src)

其中,参数:

dst 表示处理结果

src 表示原始图像

 

代码如下所示:

#encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('zxp.jpg', cv2.IMREAD_GRAYSCALE) equ = cv2.equalizeHist(img) cv2.imshow("src", img) cv2.imshow("result", equ) plt.hist(img.ravel(), 256) plt.figure() plt.hist(equ.ravel(), 256) plt.show() cv2.waitKey(0) cv2.destroyAllWindows()

 

运行结果如下图所示:(左图为原始灰度图像,右图为均衡化后的图像

数字图像处理(17): 直方图均衡化处理

数字图像处理(17): 直方图均衡化处理


 

3 matplotlib.pyplot.subplot() 函数

matplotlib.pyplot.subplot() 函数可以将多张图像放在一个窗口内,Pyhton下需要导入 matplotlib.pyplot 绘图包,其用法和Matlab中的subplot()函数用法类似。matplotlib 是一个强大的绘图包subplot() 函数用法如下所示:

subplot(nrows, ncols, plot_number)

其中,参数:

nrows 表示行数;

ncols  表示列数;

plot_number 表示窗口序号。

例如:排列成两行三列的图像,如下图所示:

数字图像处理(17): 直方图均衡化处理

:在实际应用中,如果每一个参数都小于10,三个数字可以连着直接写,不加标点,如 subplot(2,3,4) 可以写成 subplot(234)

 

代码如下所示:

#encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('zxp.jpg', cv2.IMREAD_GRAYSCALE) equ = cv2.equalizeHist(img) plt.subplot(221),plt.imshow(img, 'gray'),plt.title('img'), plt.xticks([]),plt.yticks([]) plt.subplot(222),plt.imshow(equ, 'gray'),plt.title('equ'), plt.xticks([]),plt.yticks([]) plt.subplot(223),plt.hist(img.ravel(),256),plt.title('img_hist') plt.subplot(224),plt.hist(equ.ravel(),256),plt.title('equ_hist') plt.show() cv2.waitKey(0) cv2.destroyAllWindows()

 

运行结果如下图所示:

数字图像处理(17): 直方图均衡化处理

 


 

4 matplotlib.pyplot.imshow() 函数

imshow() 函数用法如下所示,同样的,Pyhton下需要导入 matplotlib.pyplot 绘图包。

imshow(X, cmap=None)

其中,参数:

X 表示要绘制的图像;

cmap 表示colormap,颜色图谱,默认为RGB(A)颜色空间:

    1)对于灰度图像,使用参数 “ cmap=plt.cm.gray ”;

    2)对于彩色图像,如果使用opencv读入的图像,默认空间为BRG,需要调整色彩空间为RGB。

 

下面是分别使用函数读取灰度图像彩色图像例子。

(1)灰度图像

代码如下所示:

#encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('zxp.jpg') img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) plt.subplot(221),plt.imshow(img),plt.title('img'), plt.axis('off') #坐标轴关闭 plt.subplot(222),plt.imshow(img, cmap=plt.cm.gray),plt.title('img_cmap'), plt.axis('off') plt.subplot(223),plt.imshow(img_gray),plt.title('img_gray'), plt.axis('off') plt.subplot(224),plt.imshow(img_gray, cmap=plt.cm.gray),plt.title('img_gray_cmap'),plt.axis('off')#正确用法 plt.show() cv2.waitKey(0) cv2.destroyAllWindows() 

 

运行结果如下图所示:

数字图像处理(17): 直方图均衡化处理

 

 

(2)彩色图像

代码如下所示:

#encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('zxp.jpg') b,g,r=cv2.split(img) #通道分割 img_RGB=cv2.merge([r,g,b])#通道组合 plt.subplot(121),plt.imshow(img),plt.title('img_BGR'), plt.axis('off') #坐标轴关闭 plt.subplot(122),plt.imshow(img_RGB),plt.title('img_RGB'), plt.axis('off')

 

运行结果如下图所示:

数字图像处理(17): 直方图均衡化处理

 


 

5 直方图均衡化对比

直方图均衡化前后对比,使用前面提到的 matplotlib.pyplot.subplot() 函数 和 matplotlib.pyplot.imshow() 函数。

 

代码如下所示:

#encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt img_gray = cv2.imread('zxp.jpg', cv2.IMREAD_GRAYSCALE) equ = cv2.equalizeHist(img_gray) plt.subplot(221),plt.imshow(img_gray, cmap=plt.cm.gray),plt.title('img_gray'), plt.axis('off') #坐标轴关闭 plt.subplot(222),plt.imshow(equ, cmap=plt.cm.gray),plt.title('equ'), plt.axis('off') #坐标轴关闭 plt.subplot(223),plt.hist(img_gray.ravel(),256),plt.title('img_gray_hist') plt.subplot(224),plt.hist(equ.ravel(),256),plt.title('equ_hist') plt.show() cv2.waitKey(0) cv2.destroyAllWindows()

 

运行结果如下图所示:

数字图像处理(17): 直方图均衡化处理

 


 

参考资料

[1] Python+OpenCV图像处理

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/178270.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午5:39
下一篇 2026年3月26日 下午5:40


相关推荐

  • navicat激活2022【中文破解版】[通俗易懂]

    (navicat激活2022)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~1TCF2R91JZ-eyJsaWNlb…

    2022年3月31日
    309
  • 内存池组件以及根据nginx内存池源码设计实现简易内存池

    内存池组件以及根据nginx内存池源码设计实现简易内存池内存池组件以及根据 nginx 内存池源码设计实现简易内存池

    2026年3月18日
    3
  • iframe的高度自适应_div自适应高度

    iframe的高度自适应_div自适应高度Demo页面:主页面iframe_a.html,被包含页面iframe_b.htm和iframe_c.html下面开始讲:通过Google搜索iframe自适应高度,结果5W多条,搜索iframe高度自适应,结果2W多条。我翻了前面的几十条,刨去大量的转载,有那么三五篇是原创的。而这几篇原创里面,基本上只谈到如何自适应静的东西,就是没有考虑到JS操作DOM之后,如

    2022年10月12日
    6
  • 测试一下博客行吗

    测试一下博客行吗;;;;;;;;;——————-iK7VUYG0yF6lS3QNNmW4Gw==tRymiHsi9AbKpr3tTFXxup1GFhuX0czs73gSv/E7b5c=uk29oXxJxAg+D0WGWLg/LaJ5+a4y4SSHbrMB4JywbGg=eIWSkIow/vo+D0WGWLg/LaJ5+a4y4SSHbrMB4JywbGg=pcL609

    2022年7月11日
    20
  • 调整sqldeveloper界面字体和编辑器字体

    调整sqldeveloper界面字体和编辑器字体文章目录 1 更改界面字体 2 更改编辑器字体第一次打开 sqldeveloper 菜单字体都太小了 眼睛都要瞎了 网上搜索解决办法 前篇一律 都是修改编辑器字体 简直驴唇不对马嘴 人狠话不多 自己写一篇实用的 1 更改界面字体创建桌面快捷方式对快捷图标右键 gt 属性 gt 兼容性兼容模式选择 win7 我的系统 win10 也是选择的 win7 继续点击

    2026年3月19日
    2
  • 查看Android apk签名信息

    查看Android apk签名信息必须先安装jdk并配置好环境变量,然后运行->CMD->输入以下命令keytool-list-printcert-jarfileapp.apkWmImac-52:~fanyuanhua$keytool-list-printcert-jarfile/Users/fanyuanhua/2019-10/备忘录记事本/10.25/app-tencent-release-…

    2022年6月8日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号