图像直方图
plt.hist()的理解
plt.hist(image.ravel(), 256, [0, 256],facecolor= 'blue' )
arr: 需要计算直方图的一维数组
bins: 直方图的柱数,可选项,默认为10
normed: 是否将得到的直方图向量归一化。默认为0
facecolor: 直方图颜色
alpha: 透明度
返回值 :
n: 直方图向量,是否归一化由参数设定
bins: 返回各个bin的区间范围
patches: 返回每个bin里面包含的数据,是一个list
这里提醒一点一般这个hist用于计算灰度图像,也就是一维的图像
这里调用了image.ravel是为了降维(numpy.flatten()也可以降维)
两者的本质都是想把多维的数组降为1维。区别在于numpy.flatten()返回一份拷贝,对数据更改时不会影响原来的数组,而numpy.ravel()则返回视图,对数据更改时会影响原来的数组。
当bin取2时图像如下:
当bin取256时图像如下:
cv.calcHist()函数
def image_hist(image):
color = ('blue', 'green', 'red')
for i, color in enumerate(color):
hist = cv.calcHist([image], [i], None, [256], [0, 256])#输出一个二维数组
plt.plot(hist, color=color)
plt.xlim([0, 256])#定义坐标
plt.show()
enumerate() 函数
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
>>>seq = ['one', 'two', 'three']
>>> for i, element in enumerate(seq):
... print i, element
...
0 one
1 two
2 three
void calcHist(const Mat*images,int nimages,
const int*channels,InputArray mask,
OutputArray hist,
int dims,const int* histSize,
const float**ranges,
bool uniform=true,bool accumulate=false)
第一个参数,const Mat类型的images,输入的数组(或数组集),它们需为相同的深度(CV_8U和CV_32F)和相同的尺寸。
第二个参数,int类型的nimages,输入数组的个数,也就是第一个参数中存放了多少张“图像”,有几个原数组。
第三个参数,const int类型的channels,需要统计的通道索引。
第四个参数,InputArray类型的mask,可选的操作掩码。如果此掩码不为空,那么它必须为8位,并且与images[i]有同样大小的尺寸。
第五个参数,OutputArrayL类型的hist,输出的目标直方图,一个二维数组。
第六个参数,int类型的dims,需要计算的直方图的维度,必须是正数。
第七个参数,const int*类型的histSize,存放每个维度的直方图尺寸的数组。
第八个参数,const float **类型的ranges,表示每一个维度数组(第六个dims)的每一维的边界阵列,可以理解为每一维数值的取值范围。
第九个参数,bool类型的uniform,指示直方图是否均匀的标识符,有默认值true。
第十个参数,bool类型的accumulate,累计标识符,有默认值false。