灰度直方图概括了图像的灰度级信息, 简单的来说就是每个灰度级图像中的像素个数以及占有率, 创建直方图无外乎两个步骤, 统计直方图数据, 再用绘图库绘制直方图.
号: 960410445
群里有志同道合的小伙伴, 互帮互助,
群里有不错的视频学习教程和 PDF!
统计直方图数据
首先要稍微理解一些与函数相关的术语, 方便理解其在 python3 库中的应用和处理
BINS: 在上面的直方图当中, 如果像素值是 0 到 255, 则需要 256 个值来显示直 方图. 但是, 如果不需要知道每个像素值的像素数目, 只想知道两个像素值之间的像素点数目怎么办? 例如, 想知道像素值在 0 到 15 之间的像素点数目, 然后是 16 到 31...240 到 255. 可以将 256 个值分成 16 份, 每份计算综合. 每个分成的小组就是一个 BIN(箱). 在 opencv 中使用 histSize 表示 BINS.
DIMS: 数据的参数数目. 当前例子当中, 对收集到的数据只考虑灰度值, 所以该值为 1.
RANGE: 灰度值范围, 通常是 [0,256], 也就是灰度所有的取值范围.
统计直方图同样有两种方法, 使用 opencv 统计直方图, 函数如下:
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
该函数的参数在了解以上术语加上自己百度后可以简单应用
使用 numpy 统计函数, 主要应用 numpy.histogram() 函数 (还有 np.bincount(), 还未尝试, 读者可以自己尝试, 大抵使用方法相同)
hist,bins = np.histogram(img.ravel(),256,[0,256])
opencv 处理速度优于 numpy, 同时对于学习 opencv 的同学来说, 多运用 cv 的处理方法无疑更利于学习.
绘制直方图
绘制直方图一般使用 Matplotlib 绘制 , 这里要提一下 matplotlib 的 matplotlib.pyplot.hist() 函数, 该函数可以直接统计绘制中方图. 统计函数为 calcHist() 或 np.histogram()
这是处理的样图
image
下面是代码实现
- import cv2
- import numpy as np
- from matplotlib import pyplot as plt
- img = cv2.imread('/home/yc/Pictures/cat.jpg',0)
- plt.hist(img.ravel(),256,[0,256]);
- plt.show()
效果
image
当然, 在颜色图像检索之类用法时, 我们需要的是 BGR 直方图, 原理类似, 统计时使用 cv2.calcHist() 函数
- import cv2
- import numpy as np
- from matplotlib import pyplot as plt
- img = cv2.imread('/home/yc/Pictures/cat.jpg',1)
- color = ('b','g','r')
- for i,col in enumerate(color):
- histr = cv2.calcHist([img],[i],None,[256],[0,256])
- plt.plot(histr,color = col)
- plt.xlim([0,256])
- plt.show()
效果如下
image
此外, 再介绍一种很原始的计算灰度直方图的方法...... 感觉代码注释的很完整, 相信读者也可以看懂
- import sys
- import numpy as np
- import cv2
- import matplotlib.pyplot as plt
- def main():
- img=cv2.imread('/home/yc/Pictures/cat.jpg',0)
- #得到计算灰度直方图的值
- xy=xygray(img)
- #画出灰度直方图
- x_range=range(256)
- plt.plot(x_range,xy,"r",linewidth=2,c='black')
- #设置坐标轴的范围
- y_maxValue=np.max(xy)
- plt.axis([0,255,0,y_maxValue])
- #设置坐标轴的标签
- plt.xlabel('gray Level')
- plt.ylabel("number of pixels")
- plt.show()
- def xygray(img):
- #得到高和宽
- rows,cols=img.shape
- #存储灰度直方图
- xy=np.zeros([256],np.uint64)
- for r in range(rows):
- for c in range(cols):
- xy[img[r][c]] += 1
- #返回一维 ndarry
- return xy
- main()
效果如下
image
第一次写文章, 且当做学习笔记, 各位大佬如果发现错误务必告诉我~
与一起学习 opencv 的同学共勉
作者: 天煞孤星 0 严
链接: https://www.jianshu.com/p/5792a52610f3
來源: 简书
来源: http://www.jianshu.com/p/fd046b11745a