小言_互联网的博客

在OpenCV里实现灰度直方图2

514人阅读  评论(0)

上面这个程序主要用来说明灰度直方图的计算原理,使用起来还是有点不方便,下面使用matplotlib里的功能来实现相应的统计,这样就更加节省代码,使用起来更加方便。下面来看一下hist函数的定义:

函数:matplotlib.pyplot.hist(x,bins=None,range=None, density=None, bottom=None, histtype='bar', align='mid', log=False, color=None, label=None, stacked=False, normed=None)

 

关键参数

x: 数据集,最终的直方图将对数据集进行统计

bins: 统计的区间分布

range: tuple, 显示的区间,测试发现添加range并没有达到想要的效果,即显示指定区间统计结果。

density: bool,默认为false,显示的是频数统计结果,为True则显示频率统计结果,这里需要注意,频率统计结果=区间数目/(总数*区间宽度),和normed效果一致,官方推荐使用density

histtype: 可选{'bar', 'barstacked', 'step', 'stepfilled'}之一,默认为bar,推荐使用默认配置,step使用的是梯状,stepfilled则会对梯状内部进行填充,效果与bar类似

align: 可选{'left', 'mid', 'right'}之一,默认为'mid',控制柱状图的水平分布,left或者right,会有部分空白区域,推荐使用默认

log: bool,默认False,即y坐标轴是否选择指数刻度

stacked: bool,默认为False,是否为堆积状图

如果大家对matplotlib不了解,可以参考我的课程:

深入浅出Matplotlib
https://edu.csdn.net/course/detail/6859

接着下来,通过例子来演示这个函数来显示直方图的数据:

#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import cv2
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

#图片的路径
imgname = "img1.jpg"

#读取图片
image = cv2.imread(imgname, cv2.IMREAD_GRAYSCALE)

#图片的高度和宽度
h,w = image.shape[:2]
print(w,h)

#显示原图
cv2.imshow("Image",image)

#显示直方图
pixel = image.reshape([h*w,])#把二维数组转换为一维数组
grayHist, bins, patch = plt.hist(pixel, 256,facecolor='black',histtype='bar')
plt.xlabel('灰度值')
plt.ylabel('像素个数')
plt.axis([0,255, 0, np.max(grayHist)])#设置坐标轴范围
plt.show()

cv2.waitKey(0)
cv2.destroyAllWindows()
    

输出结果如下:

在这个例子里,主要通过下面这行代码来统计和绘直方图:

grayHist, bins, patch = plt.hist(pixel, 256,facecolor='black',histtype='bar')

从直方图上来看,50到100的像素最多。


转载:https://blog.csdn.net/caimouse/article/details/100508186
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场