啥叫直方图

直方图简单来说就是图像中每个像素值的个数统计,比如一副灰度图中像素值为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)进行直方图均衡化。当然,如果有噪点的话,噪点会被放大,需要对小区域的对比度进行了限制,所以这个算法全称叫:对比度受限的自适应直方图均衡化 CLAHEContrast 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 : 直方图的更多相关文章

  1. OpenCV Python教程(3、直方图的计算与显示)

    转载请详细注明原作者及出处,谢谢! 本篇文章介绍如何用OpenCV Python来计算直方图,并简略介绍用NumPy和Matplotlib计算和绘制直方图 直方图的背景知识.用途什么的就直接略过去了. ...

  2. OpenCV + python 实现人脸检测(基于照片和视频进行检测)

    OpenCV + python 实现人脸检测(基于照片和视频进行检测) Haar-like 通俗的来讲,就是作为人脸特征即可. Haar特征值反映了图像的灰度变化情况.例如:脸部的一些特征能由矩形特征 ...

  3. opencv+python视频实时质心显示

    利用opencv+python实现以下功能: 1)获取实时视频,分解帧频: 2)将视频做二值化处理: 3) 将视频做滤波处理(去除噪点,获取准确轮廓个数): 4)识别图像轮廓: 5)计算质心: 6)描 ...

  4. Erlang/Elixir: 使用 OpenCV, Python 搭建图片缩略图服务器

    这篇文章是在OSX上测试和运行的的, Ubuntu下的安装和配置请移步到这里 应用程序进程树, 默认 Poolboy 中初始化10个用于处理图片的 Python 工作进程(Worker) 首先安装Op ...

  5. opencv python实用操作

    画多边形 fillConvexPloy与fillConvexPloy的区别 fillConvexPloy 用来画单个凸多边形: 如果点集的连线不是凹多边形,则会找一个最小的凸多边形把该凹多边形包住画出 ...

  6. 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) ...

  7. 解决Windows Server 2012 R2 Datacenter云服务器无法运行opencv python程序的问题

    写了个基于opencv的python程序,pyinstaller 32位机打包后在win7/win10 32/64正常运行,在Windows Server 2012 R2 Datacenter云服务器 ...

  8. 【计算机视觉】OpenCV中直方图处理函数简述

    计算直方图calcHist 直方图是对数据集合的统计 ,并将统计结果分布于一系列提前定义的bins中.这里的数据不只指的是灰度值 ,统计数据可能是不论什么能有效描写叙述图像的特征. 如果有一个矩阵包括 ...

  9. OpenCV Python 4.0安装

    1.安装OpenCV-Python 如果你是第一次使用OpenCV Python开发包,想要安装OpenCV Python4.0只要执行如下命令行即可: pip install opencv-pyth ...

  10. Ubuntu系统---安装Caffe (+OpenCV+Python+CPU-only)

    安装配置Ubuntu14.04+Caffe (+OpenCV+Python+CPU-only) 记录 [作者:Wu Ping.时间:20180428.] 本人已经安装很多次的Caffe了:从开始的初探 ...

随机推荐

  1. UOJ14 UER #1 DZY Loves Graph(最小生成树+并查集)

    显然可以用可持久化并查集实现.考虑更简单的做法.如果没有撤销操作,用带撤销并查集暴力模拟即可,复杂度显然可以均摊.加上撤销操作,删除操作的复杂度不再能均摊,但注意到我们在删除时就可以知道他会不会被撤销 ...

  2. Day050--jQuery表单事件 轮播图 插件库 ajax

    表单控件的事件 change()表单元素发生改变时触发事件 select()文本元素发生改变时触发事件 submit()表单元素发生改变时触发事件 .focus() 获取焦点 .blur() 释放焦点 ...

  3. 我眼中的Adaboost

    步骤: def buildStump(dataArr,classLabels,D): 1.循环取出数据集中的一个特征(一列)输入 (for:) 2.循环调整阀值threshVal  (for:) 3, ...

  4. Python模拟弹道轨迹

    http://www.itongji.cn/cms/article/articledetails?articleid=5029 最近美国把萨德系统部署到韩国,一时心血来潮就用python模拟最简单的弹 ...

  5. 平衡树Treap

    #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> us ...

  6. 在思科路由器上配置AAA实验(Cisco PT)

     1.拓扑图 Addressing Table 地址表    Device   Interface   IP Address   Subnet Mask   R1 Fa0/0 192.168.1.1 ...

  7. git bash 支持中文

      1. 编辑etc\gitconfig文件,在文件末尾增加以下内容: [gui] encoding = utf-8 #代码库统一使用utf-8 pathnameencoding = utf-8 #支 ...

  8. S2-045漏洞初步分析

    0x01 前言 前几天刚分析完s2-032这个漏洞,今天又爆发了一个s2-045的漏洞,又是直接的命令执行,影响了struts2绝大多数的版本. 官方给的漏洞公告在这里   https://cwiki ...

  9. API设计中响应数据格式用json的优点

    通常我们再设计api返回时,都使用json格式返回,相比xml,他又有什么优点呢? 更直观易懂 占用空间更小 能与JavaScript跟好的兼容.js通过eval()进行Json读取. 支持多种语言. ...

  10. 提高MYSQL大数据量查询的速度

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...