直方图的计算,绘制与分析

目标
 • 使用 OpenCV 或 Numpy 函数计算直方图
 • 使用 Opencv 或者 Matplotlib 函数绘制直方图
 • 将要学习的函数有:cv2.calcHist(),np.histogram()
 
原理
  什么是直方图呢?通过直方图你可以对整幅图像的灰度分布有一个整体的了解。直方图的 x 轴是灰度值(0 到 255),y 轴是图片中具有同一个灰度值的点的数目。
  
  直方图其实就是对图像的另一种解释。一下图为例,通过直方图我们可以对图像的对比度,亮度,灰度分布等有一个直观的认识。几乎所有的图像处理软件都提供了直方图分析功能。下图来自Cambridge in Color website,强烈推荐你到这个网站了解更多知识。

  让我们来一起看看这幅图片和它的直方图吧。(要记住,直方图是根据灰度图像绘制的,而不是彩色图像)。直方图的左边区域像是了暗一点的像素数量,右侧显示了亮一点的像素的数量。从这幅图上你可以看到灰暗的区域比两的区域要大,而处于中间部分的像素点很少。
  
统计直方图
  现在我们知道什么是直方图了,那怎样获得一副图像的直方图呢?OpenCV 和 Numpy 都有内置函数做这件事。在使用这些函数之前我们有必要想了解一下直方图相关的术语。
  BINS:上面的直方图显示了每个灰度值对应的像素数。如果像素值为 0 到 255,你就需要 256 个数来显示上面的直方图。但是,如果你不需要知道每一个像素值的像素点数目的,而只希望知道两个像素值之间的像素点数目怎么办呢?举例来说,我们想知道像素值在 0 到 15 之间的像素点的数目,接着是 16 到 31,…,240 到 255。我们只需要 16 个值来绘制直方图。OpenCV Tutorials on histograms中例子所演示的内容。
  那到底怎么做呢?你只需要把原来的 256 个值等分成 16 小组,取每组的总和。而这里的每一个小组就被成为 BIN。第一个例子中有 256 个 BIN,第二个例子中有 16 个 BIN。在 OpenCV 的文档中用 histSize 表示 BINS。
  
  DIMS:表示我们收集数据的参数数目。在本例中,我们对收集到的数据只考虑一件事:灰度值。所以这里就是 1。
  RANGE:就是要统计的灰度值范围,一般来说为 [0,256],也就是说所有的灰度值。
  
使用 OpenCV 统计直方图 函数 cv2.calcHist 可以帮助我们统计一幅图像
的直方图。我们一起来熟悉一下这个函数和它的参数:
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])

  1. images: 原图像(图像格式为 uint8 或 float32)。当传入函数时应该用中括号 [] 括起来,例如:[img]。
  2. channels: 同样需要用中括号括起来,它会告诉函数我们要统计那幅图像的直方图。如果输入图像是灰度图,它的值就是 [0];如果是彩色图像的话,传入的参数可以是 [0],[1],[2] 它们分别对应着通道 B,G,R。
  3. mask: 掩模图像。要统计整幅图像的直方图就把它设为 None。但是如果你想统计图像某一部分的直方图的话,你就需要制作一个掩模图像,并使用它。(后边有例子)
  4. histSize:BIN 的数目。也应该用中括号括起来,例如:[256]。
  5. ranges: 像素值范围,通常为 [0,256]

让我们从一副简单图像开始吧。以灰度格式加载一幅图像并统计图像的直方图。

img = cv2.imread('home.jpg',0)
# 别忘了中括号 [img],[0],None,[256],[0,256],只有 mask 没有中括号
hist = cv2.calcHist([img],[0],None,[256],[0,256])

hist 是一个 256x1 的数组,每一个值代表了与次灰度值对应的像素点数目。
  使用 Numpy 统计直方图 Numpy 中的函数 np.histogram() 也可以帮我们统计直方图。你也可以尝试一下下面的代码:

#img.ravel() 将图像转成一维数组,这里没有中括号。
hist,bins = np.histogram(img.ravel(),256,[0,256])

hist 与上面计算的一样。但是这里的 bins 是 257,因为 Numpy 计算bins 的方式为:0-0.99,1-1.99,2-2.99 等。所以最后一个范围是 255-255.99。为了表示它,所以在 bins 的结尾加上了 256。但是我们不需要 256,到 255就够了。

其 他:Numpy 还 有 一 个 函 数 np.bincount(), 它 的 运 行 速 度 是np.histgram 的 十 倍。 所 以 对 于 一 维 直 方 图, 我 们 最 好 使 用 这 个函 数。 使 用 np.bincount 时 别 忘 了 设 置minlength=256。 例 如,hist=np.bincount(img.ravel(),minlength=256)

注意:OpenCV 的函数要比 np.histgram() 快 40 倍。所以坚持使用 OpenCV 函数。

现在是时候学习绘制直方图了。

绘制直方图

有两种方法来绘制直方图:

  1. Short Way(简单方法):使用 Matplotlib 中的绘图函数。
  2. Long Way(复杂方法):使用 OpenCV 绘图函数

使用 Matplotlib Matplotlib 中有直方图绘制函数:matplotlib.pyplot.hist()
它可以直接统计并绘制直方图。你应该使用函数 calcHist() 或 np.histogram()统计直方图。代码如下:

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('home.jpg',0)
plt.hist(img.ravel(),256,[0,256]);
plt.show()

你会得到下面这样一幅图:

  或者你可以只使用 matplotlib 的绘图功能,这在同时绘制多通道(BGR)的直方图,很有用。但是你首先要告诉绘图函数你的直方图数据在哪里。运行一下下面的代码:

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('home.jpg')
color = ('b','g','r') # 对一个列表或数组既要遍历索引又要遍历元素时
# 使用内置 enumerrate 函数会有更加直接,优美的做法
#enumerate 会将数组或列表组成一个索引序列。
# 使我们再获取索引和索引内容的时候更加方便
for i,col in enumerate(color):
histr = cv2.calcHist([img],[i],None,[256],[0,256])
plt.plot(histr,color = col)
plt.xlim([0,256])
plt.show()

结果:

  从上边的直方图你可以推断出蓝色曲线靠右侧的最多(很明显这些就是天空)
  使用 OpenCV  使用 OpenCV 自带函数绘制直方图比较麻烦,这里不作介绍,有兴趣可以自己研究。可以参考 OpenCV-Python2 的官方示例。
  
  使用掩模
  要统计图像某个局部区域的直方图只需要构建一副掩模图像。将要统计的部分设置成白色,其余部分为黑色,就构成了一副掩模图像。然后把这个掩模图像传给函数就可以了。

img = cv2.imread('home.jpg',0)
# create a mask
mask = np.zeros(img.shape[:2], np.uint8)
mask[100:300, 100:400] = 255
masked_img = cv2.bitwise_and(img,img,mask = mask)
# Calculate histogram with mask and without mask
# Check third argument for mask
hist_full = cv2.calcHist([img],[0],None,[256],[0,256])
hist_mask = cv2.calcHist([img],[0],mask,[256],[0,256])
plt.subplot(221), plt.imshow(img, 'gray')
plt.subplot(222), plt.imshow(mask,'gray')
plt.subplot(223), plt.imshow(masked_img, 'gray')
plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)
plt.xlim([0,256])
plt.show()

结果如下,其中蓝线是整幅图像的直方图,绿线是进行掩模之后的直方图。

直方图的计算,绘制与分析相关推荐

  1. opencv21:Histograms直方图-查找、绘制和分析

    目标 学会 使用OpenCV和Numpy函数查找直方图 使用OpenCV和Matplotlib函数绘制直方图 函数:cv2.calcHist(),np.histogram()等. 理论 直方图(His ...

  2. 使用OpenCV,Numpy计算直方图,Matplot绘制直方图及分析

    使用OpenCV,Numpy计算直方图,Matplot绘制直方图及分析 1. 效果图 2. 原理 3. 源码 3.1 直方图3种计算方法和2种绘制方法 3.2 Mask遮罩图像直方图 参考 这篇博客将 ...

  3. OpenCV学习笔记(八)——直方图的计算与绘制(cv.calcHist()、plt.hist()、plt.imshow())

    目录 1 直方图的计算 2 直方图的绘制 2.1 cv.line()和cv.polylines() 2.2 plt.hist() 3 2D 直方图 3.1 cv.calcHist() 3.2 plt. ...

  4. 《OpenCV3编程入门》学习笔记9 直方图与匹配(一二) 图像直方图概述直方图的计算与绘制

    第9章 直方图与匹配 9.1 图像直方图(Histogram)概述 1.作用:   在每个兴趣点设置一个有相近特征的直方图所构成的标签,通过标记帧与帧之间显著的边缘.颜色.角度等特征的统计变化,来检测 ...

  5. 使用Python,Opencv进行二维直方图的计算及绘制

    使用Python,Opencv进行二维直方图的计算及绘制 1. 效果图 2. 源码 参考 这篇博客将介绍如何使用Python,Opencv进行二维直方图的计算及绘制(分别用Opencv和Numpy计算 ...

  6. python画直方图代码-Python绘制直方图及子图的方法分析(代码示例)

    本篇文章给大家带来的内容是关于Python绘制直方图及子图的方法分析(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.直方图的绘制也需要用到matplotlib下的py ...

  7. OpenCV中直方图的计算和绘制

    OpenCV中直方图的计算和绘制 主要记录一下几个关键的API: cvRound(输入一个浮点数 );//返回一个整型数,取整的方法为四舍五入 split(输入多通道图像,数组或者vector变量. ...

  8. OpenCV Python教程(3)(4)(5): 直方图的计算与显示 形态学处理 初级滤波内

    OpenCV Python教程(3.直方图的计算与显示) 本篇文章介绍如何用OpenCV Python来计算直方图,并简略介绍用NumPy和Matplotlib计算和绘制直方图 直方图的背景知识.用途 ...

  9. 花老湿学习OpenCV:直方图、直方图的计算、均衡化、对比、反向投影

    直方图概述: 在统计学中,直方图是一种对数据分布情况的图形表示,是一种二维统计图表,他的两个坐标分别是统计样本(图像.视频帧)和样本的某种属性(亮度,像素值,梯度,方向,色彩等等任何特征). 也可以这 ...

最新文章

  1. jspstudy启动mysql失败_MySql启动数据库设置初始密码
  2. 连载《一个程序猿的生命周期》-27、新招的两位“高管”相继离职
  3. 前端--关于CSS盒模型
  4. go应用程序写kafka阻塞(大坑)
  5. java外围设计_Java 编程(23 种设计模式)
  6. JavaScript学习总结(14)——12个令人惊叹的JavaScript技巧
  7. 为什么eolinker发送老是等待_eolinker环境管理之开发、测试和生产环境
  8. 平行实境游戏设计——《家务战争》初稿
  9. 前端HTML(3)【带动图,便于理解】
  10. 主谓一致 | 谓语动词单复数使用讲解
  11. 并发编程笔记——第六章 Java并发包中锁原理剖析
  12. springboot2.7.X+es8 集成开发
  13. 牛顿迭代法求解多项式方程的近似解
  14. freecodecamp_freeCodeCamp如何使我成为最新的训练营毕业生
  15. 基恩士XG-XvisionEditor离线仿真
  16. 8、【蜗牛爬井】井里有一只蜗牛,他白天往上爬5米,晚上掉3.5 米,井深56.7米,计算蜗牛需要多少天才能从井底到爬出来。
  17. 3ds MAX次世代轮胎法线贴图制作教程
  18. Django中间件的使用
  19. Lua:深拷贝与浅拷贝,强引用与弱引用
  20. 计时器更新ui android,倒计时器在后台更新ui

热门文章

  1. centos7 完美适配QQ,TIM,微信,Foxmail,迅雷,有道云笔记,钉钉,金山词霸,爱奇艺,百度云盘,QQ音乐
  2. (转)Android单元测试
  3. IDEA报错private field “xxx“ is never assigned解决
  4. 作业辅导视频 SS2023-HW13:最小相位系统
  5. html中的函数怎么显示变量,css - 原生变量及使用函数 var()
  6. 学海灯塔新增课程文件点赞、下载、排序功能
  7. 中科大计算机科学技术导师周,中国科技大学计算机科学与技术学院导师教师师资介绍简介-周学海...
  8. 【机器学习】拟合优度度量和梯度下降(红酒数据集的线性回归模型sklearnRidge)
  9. elementui实现上传视频功能+预览
  10. 计算机网络中的网络安全