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简单实现计算过期时间的方法
Jun 09 Python
python使用opencv读取图片的实例
Aug 17 Python
python tkinter canvas 显示图片的示例
Jun 13 Python
Python使用循环神经网络解决文本分类问题的方法详解
Jan 16 Python
Macbook安装Python最新版本、GUI开发环境、图像处理、视频处理环境详解
Feb 17 Python
利用 Python ElementTree 生成 xml的实例
Mar 06 Python
Python利用matplotlib绘制散点图的新手教程
Nov 05 Python
Python爬虫之Selenium设置元素等待的方法
Dec 04 Python
python 装饰器重要在哪
Feb 14 Python
Python爬虫UA伪装爬取的实例讲解
Feb 19 Python
python实现学生通讯录管理系统
Feb 25 Python
Python办公自动化之教你如何用Python将任意文件转为PDF格式
Jun 28 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
SONY SRF-40W电路分析
2021/03/02 无线电
CI(CodeIgniter)框架介绍
2014/06/09 PHP
php模拟用户自动在qq空间发表文章的方法
2015/01/07 PHP
PHP下SSL加密解密、验证、签名方法(很简单)
2020/06/28 PHP
Firefox下提示illegal character并出现乱码的原因
2010/03/25 Javascript
基于jquery的页面划词搜索JS
2010/09/14 Javascript
js中如何复制一个对象并获取其所有属性和属性对应的值
2013/10/24 Javascript
JavaScript DOM操作表格及样式
2015/04/13 Javascript
jQuery简单实现遍历数组的方法
2015/04/14 Javascript
JS实现的简洁二级导航菜单雏形效果
2015/10/13 Javascript
JavaScript如何动态创建table表格
2020/08/02 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)
2016/02/16 Javascript
分享JS代码实现鼠标放在输入框上输入框和图片同时更换样式
2016/09/01 Javascript
详谈jQuery中的一些正则匹配表达式
2017/03/08 Javascript
详谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/25 Javascript
Angular2生命周期钩子函数的详细介绍
2017/07/10 Javascript
Vue组件中slot的用法
2018/01/30 Javascript
Vue页面骨架屏注入方法
2018/05/13 Javascript
React中嵌套组件与被嵌套组件的通信过程
2018/07/11 Javascript
JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解
2018/12/12 Javascript
JavaScript中的函数申明、函数表达式、箭头函数
2019/12/06 Javascript
vue项目实现多语言切换的思路
2020/09/17 Javascript
python解析html开发库pyquery使用方法
2014/02/07 Python
python使用socket远程连接错误处理方法
2015/04/29 Python
详解PyCharm配置Anaconda的艰难心路历程
2018/08/13 Python
pycharm通过ssh连接远程服务器教程
2020/02/12 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
2020/05/20 Python
python Cartopy的基础使用详解
2020/11/01 Python
塑料制成的可水洗的编织平底鞋和鞋子:Rothy’s
2018/09/16 全球购物
香港中原电器网上商店:Chung Yuen
2019/06/26 全球购物
新闻发布会活动策划方案
2014/09/15 职场文书
2014年光棍节活动策划方案(创意集锦)
2014/09/29 职场文书
学生乘坐校车安全责任书
2015/05/11 职场文书
2016关于学习党章的心得体会
2016/01/15 职场文书
Nginx解决前端访问资源跨域问题的方法详解
2021/03/31 Servers
Java数组详细介绍及相关工具类
2022/04/14 Java/Android