OpenCV-Python : 直方图
啥叫直方图
直方图简单来说就是图像中每个像素值的个数统计,比如一副灰度图中像素值为0的有多少个,1的有多少个...

在计算直方图之前,先了解几个术语:
- dims:要计算的通道数,对于灰度图dims=1,普通彩色图dims=3
- range:要计算的像素值范围,一般为[0,255]
- bins:子区段数目,如果我们统计0~255每个像素值,bins=256;如果划分区间,比如0~15,16~31...240~255这样16个区间,bins=16
计算直方图
OpenCV和Numpy中提供了计算直方图的函数,我们对比一下他们的性能
OpenCV中直方图计算
在OpenCV中使用 cv2.calcHist(images,channels,mask,histSize,ranges) 计算,其中:
- 参数1:要计算的原图,以方括号的传入,如:[img]
- 参数2:类似前面提到的dims,灰度图写[0]就行,彩色图B、G、R分别传入[0]、[1]、[2]
- 参数3:要计算的区域,计算整幅图的话,写None
- 参数4:前面提到的bins
- 参数5:前面提到的range
import cv2
import numpy as np
import matplotlib.pyplot as plt
start = cv2.getTickCount()
img = cv2.imread('hist.jpg', 0)
hist = cv2.calcHist([img], [0], None, [256], [0, 256])
end = cv2.getTickCount()
print((end - start) / cv2.getTickFrequency())
这里我使用到了评估代码运行时间,且并没有给出最初最后print()函数输出的结果,其实这个结果一直在变化。这里简单的介绍一下获取代码运行时间的两种方式
第一种:
import cv2
start = cv2.getTickCount()
# 这里写测试代码...
end = cv2.getTickCount()
print((end - start) / cv2.getTickFrequency())
这段代码就是用来测量程序运行时间(单位:s),其中cv2.getTickCount()函数得到电脑启动以来的时钟周期数,cv2.getTickFrequency()返回你电脑的主频,前后相减再除以主频就是你代码的运行时间。我这里就是使用的第一种
第二种:使用Python中的time模块计时:
import time
start = time.clock()
# 这里写测试代码...
end = time.clock()
print(end - start)
Numpy中直方图计算
也可用Numpy的函数计算,使用 ravel() 函数 将二维矩阵展平变成一维数组,
hist, bins = np.histogram(img.ravel(), 256, [0, 256])
还有一种更高效的的方式:
hist = np.bincount(img.ravel(), minlength=256)
绘制直方图
其实Matplotlib自带了一个计算并绘制直方图的功能,不需要用到上面的函数
plt.hist(img.ravel(), 256, [0, 256])
plt.show()

从直方图上可以看出图片的像素点集中子150附近,图片偏灰白,效果不好。接下来我们来看看如何来改善它。
当然,我们也可以用前面计算出来的结果绘制:
plt.plot(hist)
plt.show()

直方图的均衡化
一幅效果好的图像通常在直方图上的分布比较均匀,直方图均衡化就是用来改善图像的全局亮度和对比度的。

OpenCV中用cv2.equalizeHist()实现均衡化,我们把两张图片并排显示一下,对比一下:
equ = cv2.equalizeHist(img)
cv2.imshow('equalization', np.hstack((img, equ))) # 并排显示
cv2.waitKey(0)

均衡后的直方图:
plt.hist(equ.ravel(), 256, [0, 256])
plt.show()

可以看出均衡后的直方图明显好于原图。均衡后的图片的亮度和对比度效果明显好于原图
自适应均衡化
直方图均衡化是应用于整幅图片的,那是不是所有图片都适合?会不会出现什么问题?看下图:

很明显,因为全局调整亮度和对比度的原因,脸部太亮,大部分细节都丢失了。
自适应均衡化就是解决这一问题的:它在每一个小区域内(默认8x8)进行直方图均衡化。当然,如果有噪点的话,噪点会被放大,需要对小区域的对比度进行了限制,所以这个算法全称叫:对比度受限的自适应直方图均衡化 CLAHE (Contrast Limited Adaptive Histogram Equalization)
# 自适应均衡化,参数可选
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
cl1 = clahe.apply(img)
cv2.imshow('equalization', np.hstack((equ, cl1))) # 并排显示
cv2.waitKey(0)

效果比均衡化效果要好,至少脸部的细节保留了
使用掩膜
要统计图像某个局部区域的直方图只需要构建一副掩膜图像。将要统计的部分设置为白色,其余部分为黑色,就构成了一副掩膜图像。然后把这个掩膜图像传给函数就可以了。
img = cv2.imread('home.jpg', 0)
# 创建一个掩膜
mask = np.zeros(img.shape[:2], np.uint8) # 取彩色通道的长宽
mask[0 : 200, 0 : 200] = 255
masked_img = cv2.bitwise_and(img, img, mask = mask)
Original_Hist = cv2.calcHist([img], [0], None, [256], [0, 256])
masked_img_Hist = cv2.calcHist([img], [0], mask, [256], [0, 256])
plt.subplot(231), plt.imshow(img, 'gray')
plt.subplot(232), plt.imshow(mask, 'gray')
plt.subplot(233), plt.imshow(masked_img, 'gray')
plt.subplot(234), plt.plot(Original_Hist)
plt.subplot(235), plt.plot(masked_img_Hist)
plt.subplot(236), plt.plot(Original_Hist), plt.plot(masked_img_Hist)
plt.show()

其中在混合的那副直方图中,蓝色为原图的直方图,橙色为进行掩膜之后的直方图。
OpenCV-Python : 直方图的更多相关文章
- OpenCV Python教程(3、直方图的计算与显示)
转载请详细注明原作者及出处,谢谢! 本篇文章介绍如何用OpenCV Python来计算直方图,并简略介绍用NumPy和Matplotlib计算和绘制直方图 直方图的背景知识.用途什么的就直接略过去了. ...
- OpenCV + python 实现人脸检测(基于照片和视频进行检测)
OpenCV + python 实现人脸检测(基于照片和视频进行检测) Haar-like 通俗的来讲,就是作为人脸特征即可. Haar特征值反映了图像的灰度变化情况.例如:脸部的一些特征能由矩形特征 ...
- opencv+python视频实时质心显示
利用opencv+python实现以下功能: 1)获取实时视频,分解帧频: 2)将视频做二值化处理: 3) 将视频做滤波处理(去除噪点,获取准确轮廓个数): 4)识别图像轮廓: 5)计算质心: 6)描 ...
- Erlang/Elixir: 使用 OpenCV, Python 搭建图片缩略图服务器
这篇文章是在OSX上测试和运行的的, Ubuntu下的安装和配置请移步到这里 应用程序进程树, 默认 Poolboy 中初始化10个用于处理图片的 Python 工作进程(Worker) 首先安装Op ...
- opencv python实用操作
画多边形 fillConvexPloy与fillConvexPloy的区别 fillConvexPloy 用来画单个凸多边形: 如果点集的连线不是凹多边形,则会找一个最小的凸多边形把该凹多边形包住画出 ...
- Win7 64bit+Anaconda(3-5.0.1,Python3.6)+Pycharm(community-2017.3.3)+OpenCV(python‑3.4.0‑cp36‑cp36m)(转载)
Anaconda(3-5.0.1,Python3.6)下载链接:https://pan.baidu.com/s/1bqFwLMB 密码:37ih Pycharm(community-2017.3.3) ...
- 解决Windows Server 2012 R2 Datacenter云服务器无法运行opencv python程序的问题
写了个基于opencv的python程序,pyinstaller 32位机打包后在win7/win10 32/64正常运行,在Windows Server 2012 R2 Datacenter云服务器 ...
- 【计算机视觉】OpenCV中直方图处理函数简述
计算直方图calcHist 直方图是对数据集合的统计 ,并将统计结果分布于一系列提前定义的bins中.这里的数据不只指的是灰度值 ,统计数据可能是不论什么能有效描写叙述图像的特征. 如果有一个矩阵包括 ...
- OpenCV Python 4.0安装
1.安装OpenCV-Python 如果你是第一次使用OpenCV Python开发包,想要安装OpenCV Python4.0只要执行如下命令行即可: pip install opencv-pyth ...
- Ubuntu系统---安装Caffe (+OpenCV+Python+CPU-only)
安装配置Ubuntu14.04+Caffe (+OpenCV+Python+CPU-only) 记录 [作者:Wu Ping.时间:20180428.] 本人已经安装很多次的Caffe了:从开始的初探 ...
随机推荐
- BackGround
- Exp5 MSF基础应用
一.实践内容 1.主动攻击实践 [1]MS08-067 MS08-067 漏洞是2008 年年底爆出的一个特大漏洞,存在于当时的所有微软系统,杀伤力超强.其原理是攻击者利用受害主机默认开放的SMB 服 ...
- crm 一级菜单排序,二级菜单选中并且展开,非菜单权限的归属,权限粒度控制到按钮级别
排序 /rbac/templatetags/rbac.py from django import template from django.conf import settings import re ...
- ArcGis——好好的属性表,咋就乱码了呢?
我就瞎说一下,反正你也不懂. ——见到许多ArcGis属性表乱码的问题,也见过各种哭笑不得的解说 目录 第一节 字符编码那些事儿→字符编码简述 第二节 都是编码惹的祸→ArcGis属性表出错原因 第三 ...
- 堆排序(heap sort)
参考博客:http://bubkoo.com/2014/01/14/sort-algorithm/heap-sort/ 1.二叉树 二叉树的第 i 层至多有 2i-1 个结点:深度为 k 的二叉树至多 ...
- Koa与Node.js开发实战(2)——使用Koa中间件获取响应时间(视频演示)
学习架构: 在实战项目中,经常需要记录下服务器的响应时间,也就是从服务器接收到HTTP请求,到最终返回给客户端之间所耗时长.在Koa应用中,利用中间件机制可以很方便的实现这一功能.代码如下所示: 01 ...
- Linux学习之用户身份与文件权限
Linux学习之用户身份与文件权限 1 用户身份及能力 Linux系统的管理员之所以是root,并不是因为其名叫root,而是该用户身份号码数值(UID)为0. 管理员UID为0:系统的管理员用户 系 ...
- mysql数据库 删除某几个字段相同的重复记录并根据另一字段留下一条记录
1.例如Mysql数据库中表a中的记录,id=2,id=6,id=7的记录是重复的(iId,cId等多个字段相同),现在想留下id最小(id=2)或最大(id=7)的一条记录
- python爬虫实例项目大全
WechatSogou [1]- 微信公众号爬虫.基于搜狗微信搜索的微信公众号爬虫接口,可以扩展成基于搜狗搜索的爬虫,返回结果是列表,每一项均是公众号具体信息字典. DouBanSpider [2]- ...
- 20164305 徐广皓 Exp4 恶意代码分析
实践目标 1.1是监控你自己系统的运行状态,看有没有可疑的程序在运行. 1.2是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用原生指令或sysinternals,systr ...