星星博客 »  > 

python+matplotlib对柿子图的彩色和灰色直方图统计

python+matplotlib对柿子图的彩色和灰色直方图统计

    • 前言
    • 代码
    • 有疑待查
    • 参考链接

前言

最近在对柿子图统计时,遇到了np.histogram函数的参数bins的用法不理解,查找了大量资料后,有了初步理解,因此记录下来。

代码

#coding:utf8
import cv2
import matplotlib.pyplot as plt
import numpy as np
import sys
import os

filename = 'E:\Study\preview.jpg' #柿子色彩图
##-------------色彩直方图-----------##
img = cv2.imread(filename)
colors=['blue','green','red']

for i in range(3):
    hist,x=np.histogram(img[:,:,i].ravel(),bins=256,range=(0,256))
    #img[:,:,i]是表示单个通道的集合.单个通道的集合是一行一行的,因此是二维数组,在这里使用raval方法切换为一维
    #bins是实际上对应的就是X轴的坐标,你需要统计对某个元素进行数量统计的集合,传入256时表示从将rang(0-256)分成bins(即256等份,这样间距刚好为1)份的每一个正整数都进行数量统计
    #当bins传入指定数组时比如[0,1,3,4]则只会对这四个数进行统计
    #rang是限制bins的上下限数值,超出range范围的bins无效,比如当range=(0,200)时,bins=[80,100,244]中的255是无效的
    #返回值hist是每一个元素重复出现次数的合集
    #返回值X由bins决定,比如bins=256,则x就是0-256的所有整数和0的合集,如果bins传入[0,1,2,4],那么x就只是[0,1,2,4]4个元素

    # print(hist)
    #print(x)
    # print(x[:-1])
    # print(x[1:])
    plt.plot(0.5*(x[:-1]+x[1:]),hist,label=colors[i],color=colors[i])
    #第一,第二个参数是x,y轴数值,后面的是风格,label是标签说明,color是图画颜色
    #自己使用时发现必须使用legend方法才能显示文字标签 
    plt.legend()
plt.show()
#------------------------------------------------------------#
#灰度图片直方图统计

imgGrey=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#直接拔柿子图转为灰度图片
colors=['grey']
print(imgGrey.shape)
for i in range(1):
    hist,x= np.histogram(imgGrey[:,:].ravel(),bins=256,range=(0,256))
    plt.plot(x[:-1],hist,label=colors[i],color=colors[i])
    plt.legend()
plt.show()

有疑待查

1.查找资料时,发现作者在plt.plot中使用的是0.5*(x[:-1]+x[1:])来确定X轴的范围,但我实际中发现x作为需要统计元素的集合,为何不直接使用x[:-1]作为X轴?所以在彩色图和灰度图中,我用了两种不同的方法生成X轴坐标
2.同样的柿子图,我发现别人的峰值大约要50附近,而我的在100左右,而代码基本是一样的,因此挺奇怪(最后一张图是别人的结果)
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述最后一张图是别人的

参考链接

https://blog.csdn.net/qq_37791134/article/details/104109378

相关文章