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

  • 1. 效果图
  • 2. 原理
  • 3. 源码
    • 3.1 直方图3种计算方法和2种绘制方法
    • 3.2 Mask遮罩图像直方图
  • 参考

这篇博客将介绍如何使用Python,OpenCV,Numpy函数计算直方图,并使用 OpenCV 和 Matplotlib 函数绘制直方图,并对直方图进行分析。

通过查看图像的直方图,可以直观地了解该图像的对比度、亮度、强度分布等。

1. 效果图

原始图如下:

灰度图直方图效果如下:

可以看到左侧区域显示图像中较暗像素的数量,右侧区域显示较亮像素的数量。从直方图中可以看到暗区、亮区均不多,并且中间色调(中间范围的像素值,例如 170/210 左右)的数量非常多。


BGR三通道的直方图效果图下:

原始图 VS Mask遮罩 VS Mask图像 VS 混合直方图如下:
在第4个直方图中,蓝线表示完整图像的直方图,红线表示遮罩区域的直方图。

2. 原理

直方图可以帮助全面了解图像的强度分布。 最基本的直方图是灰度图像直方图,在 X 轴上具有像素值(范围从 0 到 255)和 Y 轴上图像中相应像素数的图。

计算直方图的3种方式:

  • hist = cv2.calcHist([img],[0],None,[256],[0,256])
  • hist,bins = np.histogram(img.ravel(),256,[0,256])
  • np.bincount(img.ravel(),minlength=256)

其中cv2的方式比np.histogram快40倍;
np.bincount比np.histogram快10倍,因此优先使用cv2.calHist()方式;

绘制直方图的2种方式:

  • matplot计算直方图并绘制:plt.hist(img.ravel(),256,[0,256]); plt.show()
  • matplot的简单绘制方式:histr = cv2.calcHist([img],[i],None,[256],[0,256])
    plt.plot(histr,color = col)
    plt.xlim([0,256])

3. 源码

3.1 直方图3种计算方法和2种绘制方法

import cv2
import numpy as np
from matplotlib import pyplot as pltimg = cv2.imread('ml.jpg', 0)# cv计算直方图
# cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
# - img:要计算直方图的图像
# - channels:通道值,如果传入灰度图为0,彩色图[0][1][2]分别计算BGR通道
# - mask:蒙版,并非为整个图计算直方图
# - histSize:x轴分多少个范围
# - ranges: 值的范围,通常是[0,256]
hist = cv2.calcHist([img], [0], None, [256], [0, 256])# numpy计算直方图
#  np.bincount() 比 np.histogram() 大概快10倍
#  cv2.calHist() 比 np.histogram() 大概快40倍
hist, bins = np.histogram(img.ravel(), 256, [0, 256])
hist = np.bincount(img.ravel(), minlength=256)# 绘制直方图法1:matplot
img = cv2.imread('ml.jpg', 0)
plt.hist(img.ravel(), 256, [0, 256])
plt.show()# 绘制直方图法2:matplot普通绘制方式
img = cv2.imread('ml.jpg')
color = ('b', 'g', 'r')
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()

3.2 Mask遮罩图像直方图

import cv2
import numpy as np
from matplotlib import pyplot as pltimg = cv2.imread('ml.jpg', 0)# 构造一个mask
mask = np.zeros(img.shape[:2], np.uint8)
mask[100:300, 100:400] = 255
masked_img = cv2.bitwise_and(img, img, mask=mask)# 计算整个图直方图以及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, color='b'), plt.plot(hist_mask, color='r')
plt.xlim([0, 256])plt.show()

参考

  • https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_histograms/py_histogram_begins/py_histogram_begins.html#histograms-getting-started

使用OpenCV,Numpy计算直方图,Matplot绘制直方图及分析相关推荐

  1. 【机器视觉学习笔记】直方图的绘制及直方图均衡化(C++)

    目录 概念 直方图定义 直方图均衡化 为什么要选用累积分布函数 如何运用累积分布函数使得直方图均衡化 C++ 源码 直方图均衡化 绘制直方图 主函数 效果 完整源码 平台:Windows 10 20H ...

  2. matplotlib绘制直方图之基本配置——万能模板案例

    目录 直方图介绍 绘制直方图的参数(plt.hist()) 连接数据库进行直方图绘制案例 使用dataframe里面的plot函数进行绘制(万能模板) 绘制多个子图(多子图直方图案例模板) 概率分布直 ...

  3. OpenCV基础(17)基于OpenCV、scikit-image和Python的直方图匹配

    在本教程中,您将学习如何使用OpenCV和scikit-image进行直方图匹配. 上周我们讨论了直方图均衡化,这是一种基本的图像处理技术,可以提高输入图像的对比度. 但是,如果你想自动匹配两幅图像的 ...

  4. python绘制直方图plt_Python:matplotlib绘制直方图

    使用hist方法来绘制直方图: 绘制直方图,最主要的是一个数据集data和需要划分的区间数量bins,另外你也可以设置一些颜色.类型参数: plt.hist(np.random.randn(1000) ...

  5. Matlab数字图像处理 02 灰度变化(图像直方图、直方图均衡化、直方图匹配)

    第二章 灰度变化 2.1 图像的亮度.对比度和动态范围 2.1.1 亮度 2.1.2 对比度 2.1.3 动态范围 2.2 线性灰度变换 2.2.1 具有饱和处理的线性灰度变换 2.2.2 分段线性灰 ...

  6. 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. ...

  7. 【Opencv入门】RGB三通道直方图的计算与绘制

    文章目录 一. 直方图概述 Overview of histogram 二.直方图的建立 Establishment of histogram 三.直方图的作用 The function of his ...

  8. python绘制灰度图片直方图-opencv+python 统计及绘制直方图

    灰度直方图概括了图像的灰度级信息,简单的来说就是每个灰度级图像中的像素个数以及占有率,创建直方图无外乎两个步骤,统计直方图数据,再用绘图库绘制直方图. 统计直方图数据 首先要稍微理解一些与函数相关的术 ...

  9. opencv 绘制图像直方图,实现直方图均衡化

    直方图 直方图简单来说就是图像中每个像素值的个数统计,比如说一副灰度图中像素值为0的有多少个,1的有多少个--直方图是一种分析图像的手段: 直方图计算 opencv库计算直方图 使用 cv.calcH ...

最新文章

  1. 【机器视觉案例】(6) AI视觉,距离测量,自制AI小游戏,附python完整代码
  2. 灰度值怎么降级_快速提取照片中间调 用灰度蒙版为照片调色 得到更柔和的后期效果...
  3. Android之Toast---消息提示
  4. OpenShift 4 之在不同的项目之间推送Image
  5. Win10电脑如何批量修改文件名
  6. linux数据库redis主从配置,redis介绍及主从配置
  7. 练字在现代社会的意义还大不大,尤其是电脑普及的情况下,花费大量的时间去练字还值得么?
  8. %3c大自然的语言%3e竺可桢题目,大自然的语言竺可桢阅读答案
  9. 如何用maxdos网刻,MAXDOS网刻教程(转)
  10. PacBio English 经典语句
  11. Red5服务器搭建,流媒体rtmp推流实现H5在线直播以及遇到的坑
  12. matlab求解常微分方程的实验,实验五__用matlab求解常微分方程
  13. 重度抑郁症患者的脑龄
  14. 区块链技术在食品供应链领域的应用
  15. 微信内嵌H5网页 解决js倒计时失效
  16. 写一手好SQL很有必要
  17. 再见了 SELECT * !大厂的 MySQL 查询优化方案,确实牛逼!
  18. Redission实现分布式锁完美方案 以及 Lua 脚本浅谈
  19. 如何绘制公司组织结构图
  20. Win 10操作系统与艾字节大数据的密切关系

热门文章

  1. 斯坦福大学李飞飞团队图像分类课程笔记
  2. python 获取打印的内容并保存到记事本里面
  3. jquery 监听的案例
  4. 金额阿拉伯数字转换为中文大写
  5. MAC OS X的ACL扩展权限设置
  6. YTU 2899: D-险恶逃生 I
  7. Kinect V1读取图像数据(For Windows)
  8. 视觉惯性SLAM: VI ORB-SLAM
  9. C++负数、小数如何保存
  10. 《OpenCV3编程入门》学习笔记5 Core组件进阶(六)输入输出XML和YAML文件