python OpenCV学习笔记之绘制直方图的方法


Posted in Python onFebruary 08, 2018

本篇文章主要介绍了python OpenCV学习笔记之绘制直方图的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

官方文档 ? https://docs.opencv.org/3.4.0/d1/db7/tutorial_py_histogram_begins.html

直方图会让你对图像的强度分布有一个全面的认识。它是一个在x轴上带有像素值(从0到255,但不总是),在y轴上的图像中对应的像素数量的图。

这只是理解图像的另一种方式。通过观察图像的直方图,你可以直观地看到图像的对比度、亮度、强度分布等。现在几乎所有的图像处理工具都提供了直方图的特性。下面是剑桥彩色网站的图片,建议去访问这个网站,了解更多细节。

python OpenCV学习笔记之绘制直方图的方法

你可以看到图像和它的直方图。(这个直方图是用灰度图像绘制的,而不是彩色图像)。直方图的左边部分显示了图像中较暗像素的数量,右边区域显示了更明亮的像素。从直方图中可以看到,深色区域的像素数量比亮色区域更多,而中间色调的数量(中值大约在127左右)则少得多。

直方图

现在我们已经知道了什么是直方图,我们可以看看如何找到它。OpenCV和Numpy都有内置的功能。在使用这些函数之前,我们需要了解一些与直方图相关的术语。

BINS:上面的直方图显示了每个像素值的像素数,从0到255。您需要256个值来显示以上的直方图。但是,考虑一下,如果您不需要单独查找所有像素值的像素数量,而是在一个像素值区间内的像素数量,该怎么办?例如,你需要找到介于0到15之间的像素数,然后是16到31……240到255。您只需要16个值来表示这个直方图。OpenCV Tutorials on histograms中展示了这个例子。

所以你要做的就是把整个直方图分成16个子部分,每个子部分的值是所有像素数的和。每个子部分都被称为“BIN”。在第一种情况下,BINS的数量是256(每个像素一个),而在第二种情况下,它只有16个。在OpenCV文档中,用术语 histSize 表示 BINS。

DIMS:它是我们收集数据的参数的个数。在这种情况下,我们收集的数据只有一件事,强度值。所以这里是1。

RANGE:它是你想测量的强度值的范围。通常,它是 [ 0,256 ],也就是所有的强度值。

OpenCV中直方图的计算

现在我们使用cv.calcHist()函数来找到直方图。让我们熟悉一下这个函数及其参数:
cv.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])

images:它是uint8类型或float32的源图像。它应该用方括号括起来,也就是”[img]”。

channels:它也用方括号括起来。它是我们计算直方图的信道的索引。例如,如果输入是灰度图像,它的值是0。对于颜色图像,您可以通过0、1或2来分别计算蓝色、绿色或红色通道的直方图。

mask:遮罩图。为了找到完整图像的直方图,它被指定为“None”。但如果你想找到图像的特定区域的直方图,你必须为它创建一个遮罩图,并将其作为遮罩。

histSize:这代表了我们的BINS数。需要用方括号来表示。在整个范围内,我们通过了256。

ranges:强度值范围,通常是 [ 0,256 ]

让我们从一个样本图像开始。只需在灰度模式下加载图像并找到其完整的直方图。

img = cv.imread('home.jpg', 0)
hist = cv.calcHist([img], [0], None, [256], [0,256])

hist是一个256x1阵列,每个值对应于该图像中的像素值及其对应的像素值。

Numpy中直方图的计算

Numpy中提供了np.histogram()方法

hist, bins = np.histogram(img.ravel(), 356, [0,256])

hist和之前计算的一样。但是bins有257个元素,因为Numpy计算bins是以0-0.99,1-1.99等,所以最后一个是255-255.99。为了表示这一点,他们还在bins的末端添加了256。但我们不需要256。到255就足够了。

Numpy还有另一个函数,np.bincount(),比np.histograme()要快得多(大约10X)。对于一维直方图,你可以试一下。不要忘记在np.bincount中设置minlength=256。例如,hist=np.bincount(img.ravel(),minlength=256)

OpenCV函数比np.histogram()快(大约40X)。所以坚持用OpenCV函数。

绘制直方图

1、使用Matplotlib

Matplotlib有一个绘制直方图的函数:matplotlib.pyplot.hist()

它直接找到了直方图并绘制了它。您不需要使用calcHist()np.histogram()函数来找到直方图。看下面的代码:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

img = cv.imread('home.jpg', 0)
plt.hist(img.ravel(), 256, [0,256])
plt.show()

python OpenCV学习笔记之绘制直方图的方法

或者你可以用正常的matplotlib,这对BGR的情节很有帮助。为此,您需要首先找到直方图数据。试试下面的代码:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

img = cv.imread('home.jpg')
color = ('b', 'g', 'r')
for i, col in enumerate(color):
  histr = cv.calcHist([img], [i], None, [256], [0,256])
  plt.plot(histr, color=col)
  plt.xlim([0,256])
plt.show()

python OpenCV学习笔记之绘制直方图的方法 

你可以从上面的图中扣除,蓝色在图像中有一些高值区域(很明显,它应该是由天空引起的)

2、使用OpenCV

这里,你可以调整直方图的值和它的bin值,让它看起来像x,y坐标,这样你就可以用cv.line()或cv.polyline()函数来绘制它,从而生成与上面相同的图像。这已经是OpenCV-Python2官方的样本了。检查sampl/python/hist.py的代码。

应用遮罩

我们用cv.calcHist()函数来找一张完整的图片的直方图。但是我们只要图片的一部分的直方图呢?在你想要找到的区域中,创建一个带有白色的遮罩图像。然后把它作为遮罩。

img = cv.imread('home.jpg', 0)

# create a mask
mask = np.zeros(img.shape[:2], np.uint8)
mask[100:300, 100:400] = 255
masked_img = cv.bitwise_and(img, img, mask=mask)

#Calculate histogram with mask and without mask
Check third argument for mask
hist_full = cv.calcHist([img], [0], None, [256], [0,256])
hist_mask = cv.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()

蓝线表示完整图片的直方图

绿线表示遮罩之后的直方图

python OpenCV学习笔记之绘制直方图的方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python写入CSV文件的方法
Jul 08 Python
详解Tensorflow数据读取有三种方式(next_batch)
Feb 01 Python
Python 实现12306登录功能实例代码
Feb 09 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
May 25 Python
python脚本实现验证码识别
Jun 07 Python
python引用(import)某个模块提示没找到对应模块的解决方法
Jan 19 Python
详解Python中is和==的区别
Mar 21 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
Apr 11 Python
python实现简单成绩录入系统
Sep 19 Python
Python谱减法语音降噪实例
Dec 18 Python
python与js主要区别点总结
Sep 13 Python
基于Python中Remove函数的用法讨论
Dec 11 Python
Python列表推导式与生成器表达式用法示例
Feb 08 #Python
详解python OpenCV学习笔记之直方图均衡化
Feb 08 #Python
python OpenCV学习笔记实现二维直方图
Feb 08 #Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
Feb 08 #Python
Python编程argparse入门浅析
Feb 07 #Python
PyQt5主窗口动态加载Widget实例代码
Feb 07 #Python
学习python中matplotlib绘图设置坐标轴刻度、文本
Feb 07 #Python
You might like
php注入实例
2006/10/09 PHP
如何获知PHP程序占用多少内存(memory_get_usage)
2012/09/23 PHP
php.ini修改php上传文件大小限制的方法详解
2013/06/17 PHP
php-msf源码详解
2017/12/25 PHP
Yii框架连表查询操作示例
2019/09/06 PHP
Nigma vs Alliance BO5 第二场2.14
2021/03/10 DOTA
为指定元素增加样式的js代码
2009/12/09 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(三)情景对话中仿打字机输出文字
2013/01/23 Javascript
Jquery多选下拉列表插件jquery multiselect功能介绍及使用
2013/05/24 Javascript
jquery插件开发之实现jquery手风琴功能分享
2014/03/10 Javascript
用html5 js实现点击一个按钮达到浏览器全屏效果
2014/05/28 Javascript
js实现模拟银行卡账号输入显示效果
2015/11/18 Javascript
JavaScript编写检测用户所使用的浏览器的代码示例
2016/05/05 Javascript
关于JS Lodop打印插件打印Bootstrap样式错乱问题的解决方案
2016/12/23 Javascript
js 颜色选择插件
2017/01/23 Javascript
微信小程序 chooseImage选择图片或者拍照
2017/04/07 Javascript
详解原生js实现offset方法
2017/06/15 Javascript
详解Vue底部导航栏组件
2019/05/02 Javascript
layer.open 获取不到表单信息的解决方法
2019/09/26 Javascript
微信小程序转发事件实现解析
2019/10/22 Javascript
如何使用vue slot创建一个模态框的实例代码
2020/05/24 Javascript
html中创建并调用vue组件的几种方法汇总
2020/11/17 Javascript
vue 实现click同时传入事件对象和自定义参数
2021/01/29 Vue.js
Python中的rfind()方法使用详解
2015/05/19 Python
python 用opencv调用训练好的模型进行识别的方法
2018/12/07 Python
详解如何用python实现一个简单下载器的服务端和客户端
2019/10/28 Python
python使用pygame实现笑脸乒乓球弹珠球游戏
2019/11/25 Python
Anaconda 查看、创建、管理和使用python环境的方法
2019/12/03 Python
Jupyter Notebook输出矢量图实例
2020/04/14 Python
OpenCV+Python3.5 简易手势识别的实现
2020/12/21 Python
Nike法国官方网站:Nike.com FR
2018/07/22 全球购物
高中学生期末评语
2014/04/25 职场文书
计划生育标语
2014/06/23 职场文书
瘦西湖导游词
2015/02/03 职场文书
2015年行风建设工作总结
2015/05/15 职场文书
党员理论学习心得体会
2016/01/21 职场文书