1、灰度直方图概念

灰度直方图反映一幅图像中各灰度级像素出现的频率与灰度级的关系,其中,灰度级为横坐标,频率为纵坐标。

灰度级:图像中不同灰度的最大数量,灰度级越大,图像亮度范围越大。

2、灰度直方图的性质

(1)   只反映图像灰度情况,不反映像素位置;

(2)一幅图像对应唯一的灰度直方图,但同一灰度直方图可能对应多幅图像;

(3)一幅图像划分多个区域,这些区域的直方图之和为原图像直方图。

3、灰度直方图的作用

(1)在使用轮廓线确定物体边界时,通过直方图更好地选择边界阈值,进行阈值化处理;

(2)对物体与背景有较强的对比的景物分割特别有用;

(3)简单物体的面积和综合光密度IOD可以通过直方图求得。

4、绘制灰度直方图的两种方法

方法1、matplotlib:hist(数据源,像素级)

注意:数据源必须是一维数组,因此需要使用ravel()函数将图像降为一维数组。

# 方法1:matplotlib——hist()
img = cv2.imread(r'F:\lovergos\OpenCV\Image\dog.jpg')
cv2.imshow('dog',img)
plt.hist(img.ravel(),256)
plt.show()
cv2.waitKey(0)

方法2:cv2.calcHist(images, channels, mask, histSize, ranges, accumulate)

常用参数说明:images表示输入原始图像;channels表示通道,对于灰度图为[0];彩色图B、G、R分别用[0]、[1]、[2]表示;mask表示掩码图像,没有则使用None;ranges表示像素值范围。

# 方法2 opencv——calHist()
img = cv2.imread(r'F:\lovergos\OpenCV\Image\ch.png')
img_b = cv2.calcHist(img,[0],None,[256],[0,255])  # B分量灰度图的直方图
img_g = cv2.calcHist(img,[1],None,[256],[0,255])  # G分量灰度图的直方图
img_r = cv2.calcHist(img,[2],None,[256],[0,255])  # R分量灰度图的直方图plt.plot(img_b,color='b',label='B')
plt.plot(img_g,color='g',label='G')
plt.plot(img_r,color='r',label='R')
plt.legend()
plt.show()

5、直方图均衡化

基本原理:对在图像中像素个数多的灰度值进行展宽,,而对像素个数少的灰度值进行归并,从而增大对比度,使图像更加清晰。

直方图均衡化的实现步骤:

本文以一个简单例子来实现直方图均衡化。假设以下图像的灰度级范围是[0,5]

[1    5    3]
 [2    4    5]
 [3    1    0]

(1)计算原始图像的灰度直方图:[1 , 2 , 2 , 1 , 1 , 2]

(2)计算原图总像素个数 N = 3 * 3 = 9

(3)计算原图灰度分布频率:[1/9 , 2/9 , 2/9 , 1/9 , 1/9 , 2/9]

(4)计算原图累计分布频率:[1/9 , 3/9 , 5/9 , 6/9 , 7/9 , 9/9]

(5)将累计分布中的元素乘以(L-1)(L-1为灰度级最大值,本例中L-1=5),再四舍五入,以使得均衡化后的图像的灰度级与原始图像一致。

s[0] = 1/9 * 5 = 0; s[1] = 3/9 * 5 = 2; s[2] = 5/9 * 5 = 3;

s[3] = 6/9 * 5 = 3; s[4] = 7/9 * 5 = 4; s[5] = 9/9 * 5 = 5;

s = [0 , 2 , 3 , 3 , 4 , 5]

注意:原图中的值作为s的下标,对应的值即为均衡化后的结果:

[2    5    3]
 [3    4    5]
 [3    2    0]

为了更好的演示算法原理,本文首先通过自行编码实现灰度图像的直方图均衡化,然后再对比opencv实现均衡化方法来验证。

(1)首先读取一张灰度图,并提取其高度和宽度

import cv2
import numpy as np
import matplotlib.pyplot as pltimg = cv2.imread(r'F:\lovergos\OpenCV\Image\dog.jpg',cv2.IMREAD_GRAYSCALE)  # 读取一张灰度图
height,width = img.shape  

灰度图像如下:

(2)统计每个灰度像素值的累计数目,构建初始灰度直方图

num_pixel = np.zeros(256)  # 创建长度为256的列表,用来保存每个像素值的数目,初始化为0# 统计列表中某个值出现的次数
for i in range(height):for j in range(width):k = img[i][j]  # 得到当前像素值num_pixel[k] = num_pixel[k]+1  # 当前像素值的个数增加1(k的大小对应num_pixel的下标)# 显示灰度直方图
# plt.bar(np.arange(0,256),num_pixel)
# plt.show()

(3)计算原图灰度分布频率

prob_pixel = np.zeros(256)
for i in range(0,256):prob_pixel[i] = num_pixel[i]/(height*width)  # 出现次数/总数

(4)计算原图累积分布频率:调用np.cumsum()

cum_pixel = np.cumsum(prob_pixel)

(5)将累计分布中的元素乘以(L-1)(此处为255),再四舍五入,以使得均衡化后的图像的灰度级与原始图像一致。

for i in range(len(cum_pixel)):cum_pixel[i] = int(cum_pixel[i]*255+0.5)  # python中直接取整不会四舍五入,因此先+0.5再取整表示四舍五入

(6)根据cum_pixel得到形式和原图相同的输出

out_img = img  # 保持和原图格式相同
for m in range(0,height):for n in range(0,width):k = img[m][n]out_img[m][n] = cum_pixel[img[m][n]]  # out_img中新的值,保存在cum_pixel中,由映射关系知,img[m][n]为对应下标

通过这种方式均衡化得到的新图为:

(7)验证:使用opencv中的函数 cv2.equalizeHist(image)

equ = cv2.equalizeHist(img)
print(equ)
cv2.imshow('out_img',equ)
cv2.waitKey(0)

通过观察,两种方法得到的结果是一致的。但不得不说opencv的方法还是简单太多。

参考文献

[1] 图像的灰度直方图_逸凌Time-CSDN博客_灰度直方图

[2] 数字图像处理(15): 灰度直方图(matplotlib 和OpenCV 绘制直方图)_TechArtisan6的博客-CSDN博客[3]【图像处理算法】直方图均衡化_GQ-CSDN博客_直方图均衡化

opencv图像处理进阶——灰度直方图相关推荐

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

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

  2. [Python图像处理] 十一.灰度直方图概念及OpenCV绘制直方图

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

  3. 数字图像处理(15): 灰度直方图(matplotlib 和OpenCV 绘制直方图)

    目录 1 灰度直方图简介 1.1 灰度直方图概念 1.2 灰度直方图作用 1.3 绘制的直方图 1.4 归一化直方图 2 matplotlib库 绘制直方图-hist() 3 OpenCV库 绘制直方 ...

  4. OpenCV下的灰度直方图生成及显示的源码,带详细注释

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 注:本文的源码来自博客  http://blog ...

  5. OpenCV:实现灰度直方图和单通道直方图拉伸

    原文链接:http://blog.csdn.net/xiaowei_cqu/article/details/7600666 本文略有修改,如有疑问或者版权问题,请移步原作者或者告知本人. 直接贴代码: ...

  6. C++OpenCV下绘制灰度直方图

    C++OpenCV下绘制直方图 直方图的定义:灰度直方图是对一幅灰度图像素分布的统计.对于一幅8Bit量化的图像来说.就是统计在0~255各个灰度级上,像素点的个数或者密度. 在OpenCV库提供了c ...

  7. java 灰度直方图_【数字图像处理】灰度直方图、直方图均衡化、直方图规定化...

    灰度直方图 一幅图像由不同灰度值的像素组成,图像中灰度的分布情况是该图像的一个重要特征.图像的灰度直方图就描述了图像中灰度分布情况,能够很直观的展示出图像中各个灰度级所占的多少. 图像的灰度直方图是灰 ...

  8. OpenCV下设置灰度直方图的阈值来对图像进行查找(查表)变换的源码

    如果图像的直方图集中在某一区间,画面表现现的是色彩单一,不利于观察分析,这个时候我们就可以通过对直方图设置上下两个阈值,找到这两个阈值对应的灰度级,分别记为iLow和iHigh,小于iLow的像素点的 ...

  9. 【第二部分 图像处理】第3章 Opencv图像处理进阶-【1 图像处理D-图像金字塔】(imgproc组件、feature2D组件)

    1.6图像金字塔 1.6.1关于图像金字塔 图像金字塔是图像中多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构. 图像金字塔最初用于机器视觉和图像压缩,一幅图像 ...

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

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

最新文章

  1. 中国对计算机科学与技术人才的需求,计算机科学与技术整体概况之人才需求分析_跨考网...
  2. maven-assembly-plugin和maven-shade-plugin打包区别及弊端
  3. 以太坊私链搭建、truffle项目开发
  4. 3_2 TemplateMethodMode 模板方法模式
  5. Lecture 9 Random built Binary Search Trees BSTs
  6. 六、Webpack详解学习笔记——webpack的安装、起步、配置、loader的使用、webpack中配置Vue、plugin的使用、搭建本地服务器、webpack配置的分离
  7. HTML+CSS+JS实现 ❤️酷炫的canvas全屏背景动画特效❤️
  8. 、简述global关键字的作用_在C#编程中global关键字的作用及其用法
  9. 【LeetCode刷题记录】LeetCode经典题目数组求和及哈希表的使用!
  10. vi中跳到文件的第一行和最后一行
  11. nvinfer1::cudnn::Engine::deserialize()出错的原因
  12. Qt:windows下Qt安装教程
  13. tmdb数据集_数据科学第2部分的数据管道tmdb api数据搜寻器
  14. Proteus仿真C51利用双定时器输出占空比可变的PWM
  15. 精辟!一文看懂layout与PCB的关系
  16. OligoGreen染料|花菁类(Cyanine系列)-引物、Oligo核酸、多肽标记染料
  17. 【Qt炫酷动画】demo04-仿Android旋转图标的等待对话框动画
  18. 软件设计师之朴素的模式匹配算法
  19. Microsoft Teams网络慢,卡顿,怎么办?
  20. 面试题:十瓶牛奶每天至少喝一瓶,直到喝完到底有多少种喝法

热门文章

  1. ccf csp 题目:工资计算
  2. zabbix 清理历史数据
  3. dubbo 在centos7下安装
  4. 用四叉树加速碰撞检测
  5. Oracle 函数编写
  6. oracle函数创建及调用
  7. 注册reg.html是什么,reg命令如何修改注册表?reg命令作用介绍
  8. java对接短信接口
  9. 如何免费编辑PDF文档?
  10. java-抽奖小程序