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了:从开始的初探 ...
随机推荐
- UOJ14 UER #1 DZY Loves Graph(最小生成树+并查集)
显然可以用可持久化并查集实现.考虑更简单的做法.如果没有撤销操作,用带撤销并查集暴力模拟即可,复杂度显然可以均摊.加上撤销操作,删除操作的复杂度不再能均摊,但注意到我们在删除时就可以知道他会不会被撤销 ...
- Day050--jQuery表单事件 轮播图 插件库 ajax
表单控件的事件 change()表单元素发生改变时触发事件 select()文本元素发生改变时触发事件 submit()表单元素发生改变时触发事件 .focus() 获取焦点 .blur() 释放焦点 ...
- 我眼中的Adaboost
步骤: def buildStump(dataArr,classLabels,D): 1.循环取出数据集中的一个特征(一列)输入 (for:) 2.循环调整阀值threshVal (for:) 3, ...
- Python模拟弹道轨迹
http://www.itongji.cn/cms/article/articledetails?articleid=5029 最近美国把萨德系统部署到韩国,一时心血来潮就用python模拟最简单的弹 ...
- 平衡树Treap
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> us ...
- 在思科路由器上配置AAA实验(Cisco PT)
1.拓扑图 Addressing Table 地址表 Device Interface IP Address Subnet Mask R1 Fa0/0 192.168.1.1 ...
- git bash 支持中文
1. 编辑etc\gitconfig文件,在文件末尾增加以下内容: [gui] encoding = utf-8 #代码库统一使用utf-8 pathnameencoding = utf-8 #支 ...
- S2-045漏洞初步分析
0x01 前言 前几天刚分析完s2-032这个漏洞,今天又爆发了一个s2-045的漏洞,又是直接的命令执行,影响了struts2绝大多数的版本. 官方给的漏洞公告在这里 https://cwiki ...
- API设计中响应数据格式用json的优点
通常我们再设计api返回时,都使用json格式返回,相比xml,他又有什么优点呢? 更直观易懂 占用空间更小 能与JavaScript跟好的兼容.js通过eval()进行Json读取. 支持多种语言. ...
- 提高MYSQL大数据量查询的速度
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...