使用OpenCV,Numpy计算直方图,Matplot绘制直方图及分析
使用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绘制直方图及分析相关推荐
- 【机器视觉学习笔记】直方图的绘制及直方图均衡化(C++)
目录 概念 直方图定义 直方图均衡化 为什么要选用累积分布函数 如何运用累积分布函数使得直方图均衡化 C++ 源码 直方图均衡化 绘制直方图 主函数 效果 完整源码 平台:Windows 10 20H ...
- matplotlib绘制直方图之基本配置——万能模板案例
目录 直方图介绍 绘制直方图的参数(plt.hist()) 连接数据库进行直方图绘制案例 使用dataframe里面的plot函数进行绘制(万能模板) 绘制多个子图(多子图直方图案例模板) 概率分布直 ...
- OpenCV基础(17)基于OpenCV、scikit-image和Python的直方图匹配
在本教程中,您将学习如何使用OpenCV和scikit-image进行直方图匹配. 上周我们讨论了直方图均衡化,这是一种基本的图像处理技术,可以提高输入图像的对比度. 但是,如果你想自动匹配两幅图像的 ...
- python绘制直方图plt_Python:matplotlib绘制直方图
使用hist方法来绘制直方图: 绘制直方图,最主要的是一个数据集data和需要划分的区间数量bins,另外你也可以设置一些颜色.类型参数: plt.hist(np.random.randn(1000) ...
- Matlab数字图像处理 02 灰度变化(图像直方图、直方图均衡化、直方图匹配)
第二章 灰度变化 2.1 图像的亮度.对比度和动态范围 2.1.1 亮度 2.1.2 对比度 2.1.3 动态范围 2.2 线性灰度变换 2.2.1 具有饱和处理的线性灰度变换 2.2.2 分段线性灰 ...
- 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. ...
- 【Opencv入门】RGB三通道直方图的计算与绘制
文章目录 一. 直方图概述 Overview of histogram 二.直方图的建立 Establishment of histogram 三.直方图的作用 The function of his ...
- python绘制灰度图片直方图-opencv+python 统计及绘制直方图
灰度直方图概括了图像的灰度级信息,简单的来说就是每个灰度级图像中的像素个数以及占有率,创建直方图无外乎两个步骤,统计直方图数据,再用绘图库绘制直方图. 统计直方图数据 首先要稍微理解一些与函数相关的术 ...
- opencv 绘制图像直方图,实现直方图均衡化
直方图 直方图简单来说就是图像中每个像素值的个数统计,比如说一副灰度图中像素值为0的有多少个,1的有多少个--直方图是一种分析图像的手段: 直方图计算 opencv库计算直方图 使用 cv.calcH ...
最新文章
- 【机器视觉案例】(6) AI视觉,距离测量,自制AI小游戏,附python完整代码
- 灰度值怎么降级_快速提取照片中间调 用灰度蒙版为照片调色 得到更柔和的后期效果...
- Android之Toast---消息提示
- OpenShift 4 之在不同的项目之间推送Image
- Win10电脑如何批量修改文件名
- linux数据库redis主从配置,redis介绍及主从配置
- 练字在现代社会的意义还大不大,尤其是电脑普及的情况下,花费大量的时间去练字还值得么?
- %3c大自然的语言%3e竺可桢题目,大自然的语言竺可桢阅读答案
- 如何用maxdos网刻,MAXDOS网刻教程(转)
- PacBio English 经典语句
- Red5服务器搭建,流媒体rtmp推流实现H5在线直播以及遇到的坑
- matlab求解常微分方程的实验,实验五__用matlab求解常微分方程
- 重度抑郁症患者的脑龄
- 区块链技术在食品供应链领域的应用
- 微信内嵌H5网页 解决js倒计时失效
- 写一手好SQL很有必要
- 再见了 SELECT * !大厂的 MySQL 查询优化方案,确实牛逼!
- Redission实现分布式锁完美方案 以及 Lua 脚本浅谈
- 如何绘制公司组织结构图
- Win 10操作系统与艾字节大数据的密切关系