opencv-直方图

首先引入包,matplotlib,据说可以绘制各种几何图,甚至3D立体图

以下是直方图绘制方法

import matplotlib.pyplot as plt
import numpy as np
x=np.random.randint(0,100,100)#生成【0-100】之间的100个数据
plt.hist(x,bins=10)#x为要统计的数据,bins表示有多少条柱子
plt.xlabel('x')#x轴标签
plt.ylabel('y')#y轴标签
plt.xlim(0,100)#设置x轴分布范围
plt.show()#显示图形

hist(x,bins=None,range=None, density=None, bottom=None, histtype='bar',, log=False, color=None, label=None, stacked=False, normed=None)

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

bins: 统计的区间分布,即要显示几条柱子

range: tuple, 显示的区间,range在没有给出bins时生效

density: bool,是否归一化,若为True则归一化显示

histtype: 可选{'bar', 'barstacked', 'step', 'stepfilled'}之一,默认为bar柱形,

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

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

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

以下是直方图的几种处理,先放着,日后再研究:

def normed(data,img):
    w=img.shape[0]
    h=img.shape[1]
    gui=np.zeros(256,dtype=np.float)
    for i in range(256):
        gui[i]=data[i]
    for i in range(256):
        gui[i]=data[i]/(w+h)
    return gui
def leiji(g):
    lei=np.zeros(256,dtype=np.float)
    for i in range(256):
        lei[i]=g[i]
    for i in range(1,256):
        lei[i]=lei[i]+lei[i-1]
    print(lei)
    return lei
def zheng(data):
    z=np.zeros(256,dtype=np.float)
    for i in range(256):
        z[i]=data[i]
    for i in range(256):
        z[i]=int(data[i]*255+0.5)
    return z

re=h(img)#原图直方图
gui=normed(re,img)#归一化直方图
lei=leiji(gui)#累积直方图
z=zheng(lei)#取整
plt.figure(figsize=(12,5))
plt.subplot(141)
plt.bar(range(256),re,width=1)
plt.title("bar")
plt.subplot(142)
plt.bar(range(256),gui,width=1)
plt.title("one_bar")
plt.subplot(143)
plt.bar(range(256),lei,width=1)
plt.title('current_bar')
plt.subplot(144)
plt.bar(range(256),z,width=1)
plt.title("whole_bar")

 

你可能感兴趣的:(opencv-直方图)