1.0 基本概念
什么是直方图呢?通过直方图你可以对整幅图像的灰度分布有一个整体的了解。直方图的 x 轴是灰度值(0 到 255),y 轴是图片中具有同一个灰度值的点的数目。
直方图其实就是对图像的另一种解释。一下图为例,通过直方图我们可以对图像的对比度,亮度,灰度分布等有一个直观的认识。几乎所有的图像处理软件都提供了直方图分析功能。
让我们来一起看看这幅图片和它的直方图吧。(要记住,直方图是根据灰图像绘制的,而不是彩色图像)。直方图的左边区域像是了暗一点的像素数量,右侧显示了亮一点的像素的数量。从这幅图上你可以看到灰暗的区域比两的区域要大,而处于中间部分的像素点很少。
现在我们知道什么是直方图了,那怎样获得一副图像的直方图呢?OpenCV 和 Numpy 都有内置函数做这件事。在使用这些函数之前我们有必要想了解一下直方图相关的术语。
BINS:上面的直方图显示了每个灰度值对应的像素数。如果像素值为 0到 255,你就需要 256 个数来显示上面的直方图。但是,如果你不需要知道每一个像素值的像素点数目的,而只希望知道两个像素值之间的像素点数目怎么办呢?举例来说,我们想知道像素值在 0 到 15 之间的像素点的数目,接着是 16 到 31,....,240 到 255。我们只需要 16 个值来绘制直方图。OpenCV
Tutorials on histograms中例子所演示的内容。那到底怎么做呢?你只需要把原来的 256 个值等分成 16 小组,取每组的总和。而这里的每一个小组就被成为 BIN。
DIMS:表示我们收集数据的参数数目。在本例中,我们对收集到的数据只考虑一件事:灰度值。所以这里就是 1。
RANGE:就是要统计的灰度值范围,一般来说为 [0,256],也就是说所有的灰度值
1.1 matlab绘制直方图
【matlab绘制直方图】 1.hist()函数 功能:根据数据源和像素级绘制直方图 语法:plt.hist(o.ravel(),256):根据数据源和像素级绘制直方图 |-数据源:必须是一维数组,一般灰度图像都是二维数组,o.ravel()将其转换为一维数组 |-像素级:一般256 2.ravel()函数 功能:将原始图像(二维数组)o转换为一维数组 语法:一维数组=多维数组.ravel() [[1,2,3], [4,5,6], [7,8,9]] 转成一维数组 [1,2,3,4,5,6,7,8,9]
import cv2
import matplotlib.pyplot as plt
o=cv2.imread("image\\boat.jpg",0)
print(o.shape)
cv2.imshow("original",o)
print(o)
plt.hist(o.ravel(),256)
print(o.ravel())
plt.show()
cv2.waitKey()
cv2.destroyAllWindows()
输出:
(1024, 1024)
[[127 125 124 ... 171 170 163]
[127 126 125 ... 168 168 166]
[128 127 126 ... 163 165 170]
...
[113 113 114 ... 96 98 104]
[113 114 115 ... 95 96 100]
[113 114 116 ... 94 94 98]]
[127 125 124 ... 94 94 98]
【扩充】plot的使用
【plot使用】
plt.plot(x, y) |-x:指定x的取值 |-y:指定y的取值 np.arange(0, 5, 0.1) |-0:起点 |-5:终点 |-0.1:步长
import numpy as n