python+opencv图像处理之七:直方图均衡化

目录

    • python+opencv图像处理之七:直方图均衡化
  • 一、直方图均衡化
  • 二、直方图绘制
  • 三、直方图均衡化
  • 四、有限对比适应性直方图均衡化

一、直方图均衡化

直方图(英语:Histogram)是一种对数据分布情况的图形表示,是一种二维统计图表,它的两个坐标分别是统计样本和该样本对应的某个属性的度量。把直方图上每个属性的计数除以所有属性的计数之和,就得到了归一化直方图。之所以叫“归一”,是因为归一化直方图的所有属性的计数之和为1,也就是说,每个属性对应计数都是0到1之间的一个数(百分比)。在图像处理中,直方图的横坐标为灰度级(0-255),纵坐标为每个灰度级的像素个数。
直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。
对比度是画面黑与白的比值,也就是从黑到白的渐变层次。比值越大,从黑到白的渐变层次就越多,从而色彩表现越丰富。对比度对视觉效果的影响非常关键,一般来说对比度越大,图像越清晰醒目,色彩也越鲜明艳丽;而对比度小,则会让整个画面都灰蒙蒙的。
高对比度对于图像的清晰度、细节表现、灰度层次表现都有很大帮助。在一些黑白反差较大的文本显示、CAD显示和黑白照片显示等方面,高对比度产品在黑白反差、清晰度、完整性等方面都具有优势。相对而言,在色彩层次方面,高对比度对图像的影响并不明显。

在直方图均衡化中我们需要将集中的像素分布分散开,使得图像更清晰醒目。

二、直方图绘制

在直方图绘制时我们通过调用matplotlib的子库pyplot实现,在pyplot库中给我们定义了一个hist()函数
hist()函数中有两个参数:
第一个参数为数据源,此处的数据源必须为一维数组,可以通过通过函数ravel()进行降维处理。
第二个参数为间隔数,即绘制的直方图中X轴的划分个数
图片灰度像素直方图绘制参考代码:

import cv2
import numpy as np
import matplotlib.pyplot as pltimage = cv2.imread("coinss.png")
#cv2.imshow("if imread successfully",image)#将图片转换为灰度图
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)#直方图绘制
plt.hist(gray.ravel(), 256)
plt.show()

该图片进行灰度处理后,灰度像素分布直方图绘制如下:

三、直方图均衡化

在opencv中为我们提供了直方图均衡化函数:cv2.equalizeHist(src, dst)
其中两个参数分别表示:

参数 参数意义
src 输入的灰度图像
dst 输出直方图均衡化后的图像

直方图均衡化参考代码:

import cv2
import numpy as np
import matplotlib.pyplot as pltimage = cv2.imread("coinss.png")
#cv2.imshow("if imread successfully",image)#将图片转换为灰度图
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)#直方图绘制
gray1 = plt.hist(gray.ravel(), 256)
plt.show(gray1)#应用直方图均衡化
dst = cv2.equalizeHist(gray)
#直方图绘制
gray2 = plt.hist(dst.ravel(), 256)
plt.show(gray2)

均衡化处理前,图片与灰度像素分布直方图显示如下:


均值化处理后图片与像素灰度分布直方图如下:

四、有限对比适应性直方图均衡化

cv2.equalizeHist(src, dst)直方图均衡化会改变整个图像的对比度,但在cv2.createCLAHE(clipLimit, tileGridSize)中整幅图像会被分成很多小块,这些小块被称为 “tiles”(在 OpenCV 中 tiles 的大小默认是 8x8),然后再对每一个小块分别进行直方图均衡化(跟前面类似)。 所以在每一个的区域中,直方图会集中在某一个小的区域中(除非有噪声干扰)。如果有噪声的话,噪声会被放大。为了避免这种情况的出现要使用对比度限制。对于每个小块来说,如果直方图中的 bin 超过对比度的上限的话,就把其中的像素点均匀分散到其他 bins 中,然后在进行直方图均衡化。最后,为了去除每一个小块之间“人造的”(由于算法造成)边界,再使用双线性差值,对小块进行缝合。
cv2.createCLAHE(clipLimit, tileGridSize)中参数分别表示:

参数 参数意义
clipLimit 对比度限制的阈值
tileGridSize 图像分割每块的尺寸,默认8x8

有限对比适应性直方图均衡化参考代码:

import cv2
import numpy as np
import matplotlib.pyplot as pltimage = cv2.imread("coinss.png")#将图片转换为灰度图
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imshow("gray",gray)#直方图绘制
gray1 = plt.hist(gray.ravel(), 256)
plt.show(gray1)#应用直方图均衡化
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
dst = clahe.apply(gray)
cv2.imshow("gray1",dst)#直方图绘制
gray2 = plt.hist(dst.ravel(), 256)
plt.show(gray2)

图片显示对比如下:
未均衡化处理之前的图片和灰度像素分布直方图如下:


有限对比适应性直方图均衡化处理后的图片和灰度像素分布直方图如下:

python+opencv图像处理之七:直方图均衡化相关推荐

  1. Python OpenCV 图像处理之直方图的应用,取经之旅第 26 天

    Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧. Python OpenCV 基础知识铺垫 cv2.compareHist 函数 橡皮擦的小节 基础知识铺垫 上篇博客 Py ...

  2. python绘制灰度图片直方图-python数字图像处理实现直方图与均衡化

    在图像处理中,直方图是非常重要,也是非常有用的一个处理要素. 在skimage库中对直方图的处理,是放在exposure这个模块中. 1.计算直方图 函数:skimage.exposure.histo ...

  3. Python+Opencv图像处理新手入门教程(二):颜色空间转换,图像大小调整,灰度直方图

    一步一步来吧 上一节:Python+Opencv图像处理新手入门教程(一):介绍,安装与起步 1.什么是图像 对于计算机而言,图像的本质是一个由像素点构成的矩阵. 例如我们用肉眼很容易分辨一辆汽车的后 ...

  4. Python+OpenCV图像处理(一篇全)

    参考:1.网易云课堂 Python+OpenCV图像处理 - 网易云课堂 2.[在水一方xym的博客]业精于勤荒于嬉,行成于思毁于随 - CSDN博客 https://blog.csdn.net/za ...

  5. Python OpenCV图像处理 理论 代码

    python opencv图像处理 GitHub - LeBron-Jian/ComputerVisionPractice OpenCV计算机视觉学习 & 代码 OpenCV计算机视觉学习(1 ...

  6. OpenCV-数字图像处理之直方图均衡化

    OpenCV-数字图像处理之直方图均衡化 从这篇博文开始,小生正式从一个毫不相干专业转投数字图像处理.废话不多说了,talk is cheap. show me the code. 直方图均衡化目的 ...

  7. Python+Opencv图像处理新手入门教程(三):阈值与二值化

    一步一步来吧 上一节: Python+Opencv图像处理新手入门教程(二):颜色空间转换,图像大小调整,灰度直方图 1.Intro 今天这节我们主要研究利用阈值处理图像.例如对于输入图像: 如何做一 ...

  8. 【Python OpenCV】图像直方图 calcHist方法 equalizeHist方法

    [Python OpenCV]图像直方图 calcHist方法 equalizeHist方法 (一)图像直方图 图像的构成是有像素点构成的,每个像素点的值代表着该点的颜色(灰度图或者彩色图).所谓直方 ...

  9. Python+Opencv图像处理新手入门教程(四):视频内容的读取与导出

    一步一步来吧 上一节: Python+Opencv图像处理新手入门教程(三):阈值与二值化 1.Intro 今天这节我们主要看怎么利用opencv读取并处理视频中的内容. 2.VideoCapture ...

最新文章

  1. 玩转OpenVswitch 简介
  2. loj2538 「PKUWC2018」Slay the Spire 【dp】
  3. reg怎样存取注册表信息
  4. linux 下 apache启动、停止、重启命令
  5. python os.system 512_python os.system os.popen 区别
  6. string index out of range_Java 12 骚操作, String居然还能这样玩!
  7. 中文BERT上分新技巧,多粒度信息来帮忙
  8. mfc oninitdialog 中的hwnd == null_在SOUI中使用动态多语言切换
  9. java调用shell脚本及注意事项
  10. Python数值特征转换
  11. 安卓平台中的动态加载技术分析
  12. 思科的雾计算对物联网有何推助力?
  13. anaconda离线安装pytorch
  14. 第4关国际标准书号校验python 头歌
  15. unity 场景背景替换2D图片方法
  16. 【中秋佳节】CSDN卷王们内卷--中秋节要不要休息呢?
  17. Excel 数据透视表小技巧之 06 使用 Excel 数据透视表作为另一个数据透视表的数据源
  18. 基于maven自动发布-Maven Wagon
  19. Nature子刊:中大骆观正组在RNA修饰方法学领域取得重要进展
  20. 常见的抓包检测及抓包方案

热门文章

  1. SIM900A模块开发:通过GPRS连接OneNet平台发送GPS信息
  2. 如何简单设计接口测试用例
  3. 30个令人捧腹的关于码农和编程的笑话
  4. 非标资产与标准资产_标准资产更新! 第二部分
  5. 设计模式综合实例分析之数据库同步系统(一)
  6. Mysql:报错:error while loading shared libraries: libaio.so.1:
  7. Git如何上传代码到远程仓库(GiteeGithub)
  8. nginx - nginx的安装部署
  9. DHCP协议详解及DHCP服务的配置
  10. xml和json转换的在线工具