zoukankan      html  css  js  c++  java
  • opencv+python 统计及绘制直方图

    灰度直方图概括了图像的灰度级信息,简单的来说就是每个灰度级图像中的像素个数以及占有率,创建直方图无外乎两个步骤,统计直方图数据,再用绘图库绘制直方图。

    统计直方图数据

     首先要稍微理解一些与函数相关的术语,方便理解其在python3库中的应用和处理
     BINS: 在上面的直方图当中,如果像素值是0到255,则需要256个值来显示直 方图。但是,如果不需要知道每个像素值的像素数目,只想知道两个像素值之间的像素点数目怎么办?例如,想知道像素值在0到15之间的像素点数目,然后是16到31。。。240到255。可以将256个值分成16份,每份计算综合。每个分成的小组就是一个BIN(箱)。在opencv中使用histSize表示BINS。
     DIMS: 数据的参数数目。当前例子当中,对收集到的数据只考虑灰度值,所以该值为1。
     RANGE: 灰度值范围,通常是[0,256],也就是灰度所有的取值范围。
    统计直方图同样有两种方法,使用opencv统计直方图,函数如下:

    cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
    

     该函数的参数在了解以上术语加上自己百度后可以简单应用
     使用numpy统计函数,主要应用numpy.histogram()函数(还有np.bincount(),还未尝试,读者可以自己尝试,大抵使用方法相同)

    hist,bins = np.histogram(img.ravel(),256,[0,256])
    

     opencv处理速度优于numpy,同时对于学习opencv的同学来说,多运用cv的处理方法无疑更利于学习。

    python学习交流群:923414804,群内每天分享干货,包括最新的企业级案例学习资料和零基础入门教程,欢迎小伙伴入群学习。

    绘制直方图

     绘制直方图一般使用Matplotlib绘制 ,这里要提一下matplotlib的matplotlib.pyplot.hist()函数,该函数可以直接统计绘制中方图。统计函数为calcHist()np.histogram()
     这是处理的样图

    cat.jpg

    下面是代码实现

    import cv2
    import numpy as np
    from matplotlib import pyplot as plt
    
    img = cv2.imread('/home/yc/Pictures/cat.jpg',0)
    plt.hist(img.ravel(),256,[0,256]);
    plt.show()
    

    效果

    灰度直方图


     当然,在颜色图像检索之类用法时,我们需要的是BGR直方图,原理类似,统计时使用cv2.calcHist()函数

    import cv2
    import numpy as np
    from matplotlib import pyplot as plt
    img = cv2.imread('/home/yc/Pictures/cat.jpg',1)
    color = ('b','g','r')
    for i,col in enumerate(color):
        histr = cv2.calcHist([img],[i],None,[256],[0,256])
        plt.plot(histr,color = col)
        plt.xlim([0,256])
    plt.show()
    

    效果如下

    BGR直方图

    此外,再介绍一种很原始的计算灰度直方图的方法……感觉代码注释的很完整,相信读者也可以看懂

    import sys
    import numpy as np
    import cv2
    import matplotlib.pyplot as plt
    
    def main():
        img=cv2.imread('/home/yc/Pictures/cat.jpg',0)
        #得到计算灰度直方图的值
        xy=xygray(img)   
    
        #画出灰度直方图
        x_range=range(256)
        plt.plot(x_range,xy,"r",linewidth=2,c='black')
        #设置坐标轴的范围
        y_maxValue=np.max(xy)
        plt.axis([0,255,0,y_maxValue])
        #设置坐标轴的标签
        plt.xlabel('gray Level')
        plt.ylabel("number of pixels")
        plt.show()
    
    def xygray(img):
        #得到高和宽
        rows,cols=img.shape
        #存储灰度直方图
        xy=np.zeros([256],np.uint64)
        for r in range(rows):
            for c in range(cols):
                xy[img[r][c]] += 1
        #返回一维ndarry
        return xy
    
    main()
    

    效果如下

    灰度直方图

     第一次写文章,且当做学习笔记,各位大佬如果发现错误务必告诉我~
     与一起学习opencv的同学共勉

  • 相关阅读:
    UVA12125 March of the Penguins (最大流+拆点)
    UVA 1317 Concert Hall Scheduling(最小费用最大流)
    UVA10249 The Grand Dinner(最大流)
    UVA1349 Optimal Bus Route Design(KM最佳完美匹配)
    UVA1212 Duopoly(最大流最小割)
    UVA1395 Slim Span(kruskal)
    UVA1045 The Great Wall Game(二分图最佳匹配)
    UVA12168 Cat vs. Dog( 二分图最大独立集)
    hdu3488Tour(KM最佳完美匹配)
    UVA1345 Jamie's Contact Groups(最大流+二分)
  • 原文地址:https://www.cnblogs.com/paisenpython/p/10297556.html
Copyright © 2011-2022 走看看