目录
1 直方图概念
1.1 基础理论
- 横坐标: 图像中各个像素点的灰度级
- 纵坐标: 具有该灰度级的像素个数
1.1.1 直方图
1.1.2 归一化直方图
- 横坐标: 图像中各个像素点的灰度级
- 纵坐标: 出现该灰度级的概率
1.2 plt.hist()函数介绍
- DIMS:使用参数的数量
- BINS:参数子集的数目
- RANGE: 灰度值范围,一般为[0,255] (8位位图)
1.3 绘制直方图
1.3.1 matplotlib
-
提供了类似matlab的绘图框架
・调用方法import matplotlib.pyplot as plt
-
函数histhist(数据源,像素级)
・数据源: 图像, 必须是一维数组
・像素级: 一般是256,指[0,255] -
函数ravel() 二维到一维的转换
・将多维数组降为一维数组
1.3.2 hist()代码实现
- 代码
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("image\\boat.jpg")
plt.hist(img.ravel(),256)
- 效果
2 OpenCV来统计直方图
2.1 cv2.calcHist()函数
hist = cv2.calcHist(images, channels, mask, histSize, ranges, accumulate)
其中,参数:
・hist – 直方图;
・images – 原始图像;
→通道编号需要[]括起来
・channels – 指定通道;
→通道编号需要[]括起来
→输入图像是灰度图时,[0]
→彩色图像[0],[1],[2]分别对应[B],[G],[R]
・mask – 掩码图像;
→统计整幅图像时为 None
→统计某一区域时,需掩码图像
・histSize – BINS的数量;
→ [256]
・ranges – 像素值范围;
→[0,255]
・accumulate– 累计标识;
→默认为 false
→如果设置为True,则直方图在分配时不会被清零
→允许从多个对象中计算单个直方图,或者用于实时更新
→
2.2 代码实现
- 代码
import cv2
import numpy as np
img = cv2.imread("image\\lena.bmp")
hist = cv2.calcHist([img],[0],None,[256],[0,255])
print(type(hist))
print(hist.size)
print(hist.shape)
- 效果
<class 'numpy.ndarray'> #数组类型
256 #256个元素
(256,1) #256行,1列
3 OpenCV绘制直方图
3.1 plt.plot()函数
- 示例1代码
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 5, 0.1)
y = np.sin(x)
plt.plot(x,y)
- 示例1结果
- 示例2代码
import numpy as np
import matplotlib.pyplot as plt
x = [0,1,2,3,4,5,6]