• 图像灰度直方图


    图像灰度直方图

      图像是由像素点构成的,每个像素点的值代表着该点的颜色(灰度图或者彩色图)。

      直方图就是对图像中的这些像素点的值进行统计,得到一个统一的整体的灰度概念。

      优点:可以清晰了解图像的整体灰度分布,对于后面依据直方图处理图像来说至关重要。

      一般情况下直方图都是灰度图像,直方图x轴是灰度值(一般0~255),y轴是图像中每一个灰度级对应的像素点的个数

      灰度级:正常情况下就是0-255共256个灰度级,从黑一直到白(也有可能统计其中的某部分灰度范围),那么每一个灰度级对应一个数值代表该灰度对应的点数目。

    也就是说直方图其实就是一个1*m(灰度级)的一个数组而已。但是有的时候不希望逐个灰度的递增,比如现在要求20个灰度一起作为一个灰度级来画直方图,这个时候

    可能只需要1*(m/20)这样一个数组就够了。那么这里的20就是直方图的间隔宽度了。

      Opencv给提供的函数是cv2.calcHist(),该函数有5个参数

    • image输入图像,传入时应该用中括号[]括起来
    • channels::传入图像的通道,如果是灰度图像,那就不用说了,只有一个通道,值为0,如果是彩色图像(有3个通道),那么值为0,1,2,中选择一个,对应着BGR各个通道,用[]传入。
    • mask:掩膜图像。如果统计整幅图,那么为none。如果要统计部分图的直方图,就得构造相应的炎掩膜来计算。
    • histSize:灰度级的个数,需要中括号,比如[256]
    • ranges:像素值的范围,通常[0,256],有的图像如果不是0-256,比如说你来回各种变换导致像素值负值、很大,则需要调整后才可以。

      除Opencv外,numpy也有函数用于统计直方图的

      函数np.histogram()

      函数np.bincount()

      这三个方式的传入参数基本上差不多,不同的是opencv自带的需要中括号括起来。 

      测试案例:

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    
    img = cv2.imread('02.jpg', 0)#直接读为灰度图像
    
    #opencv读取方法cv2.calcHist(速度最快)
    #图像,通道[0]-灰度图,掩膜-无,灰度级,像素范围
    hist_cv = cv2.calcHist([img], [0], None, [256], [0,256])
    
    #numpy方法读取np.histogram()
    hist_np,bins = np.histogram(img.ravel(), 256, [0,256])
    
    #numpy的另一种读取方法np.bincount()(速度=10倍方法2)
    hist_np2 = np.bincount(img.ravel(), minlength=256)
    
    plt.subplot(221), plt.imshow(img, 'gray')
    plt.subplot(222), plt.plot(range(256), hist_cv, 'r')
    plt.subplot(223), plt.plot(range(256), hist_np, 'b')
    plt.subplot(224), plt.plot(hist_np2)
    plt.show()

      opencv的直方图函数中掩膜的使用,这个掩膜就是一个区域大小,表示直方图统计就是这个区域的像素统计。

      掩膜是用一副二值化图片对另外一幅图片进行局部的遮挡

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    
    img = cv2.imread('02.jpg', 0)#直接读为灰度图像
    #生成掩膜
    mask = np.zeros(img.shape[:2], np.uint8)
    mask[200:400, 300:500] = 255
    #Cv2.bitwise_and (目标文件,源文件,mask),将图片里的像素值按位与
    masked_img = cv2.bitwise_and(img, img, mask=mask)
    
    #opencv读取方法cv2.calcHist(速度最快)
    #图像,通道[0]-灰度图,掩膜-无,灰度级,像素范围
    hist_full = cv2.calcHist([img], [0], None, [256], [0,256])
    hist_mask = cv2.calcHist([img], [0], mask, [256], [0,256])
    
    plt.subplot(221), plt.imshow(img, 'gray')
    plt.subplot(222), plt.imshow(mask, 'gray')
    plt.subplot(223), plt.imshow(masked_img, 'gray')
    plt.subplot(224), plt.plot(hist_full),plt.plot(hist_mask)
    plt.show()

     

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    
    img = cv2.imread('02.jpg', 0)#直接读为灰度图像
    #生成掩膜
    mask = np.zeros(img.shape[:2], np.uint8)
    mask[200:400, 300:500] = 255
    #Cv2.bitwise_and (目标文件,源文件,mask),将图片里的像素值按位与
    masked_img = cv2.bitwise_and(img, img, mask=mask)
    
    #opencv读取方法cv2.calcHist(速度最快)
    #图像,通道[0]-灰度图,掩膜-无,灰度级,像素范围
    hist_full = cv2.calcHist([img], [0], None, [256], [0,256])
    hist_mask = cv2.calcHist([img], [0], mask, [256], [0,256])
    
    plt.subplot(221), plt.imshow(img, 'gray')
    plt.subplot(222), plt.imshow(mask, 'gray')
    plt.subplot(223), plt.imshow(masked_img, 'gray')
    plt.subplot(224), plt.plot(hist_full),plt.plot(hist_mask)
    plt.show()
  • 相关阅读:
    java中tif转png
    HTTP服务器、WEB服务器、应用服务器
    word将编号转成普通文本
    浏览新闻常用单词
    手机端搜索的回车事件
    C#(winform)的label自动换行
    oracle for update wait 解析
    java8 新特性parallelStream 修改默认多线程数量
    ArcObjects您必须有许可证才能使用此ActiveX控件
    图灵社区电子书 全高清可编辑 内含多种格式 [珍藏]
  • 原文地址:https://www.cnblogs.com/lyywj170403/p/11310862.html
Copyright © 2020-2023  润新知