美文网首页
直方图处理

直方图处理

作者: Tsukinousag | 来源:发表于2021-11-04 23:40 被阅读0次

    直方图从图像内部灰度级别的角度,直方图的x轴区间一般是[0,255],对应的是8位位图的256个灰度级,y轴对应的具有相应灰度级别的个数

    归一化直方图:x轴表示灰度级,y轴表示灰度级出现的频率

    注意三个概念:
    DIMS:收集参数的数量,一般情况下,直方图中仅有灰度级,该值为1
    RANGE: 统计的灰度级的范围
    BINS: 参数子集的数目


    1.使用Numpy绘制直方图

    matplotlib.pyplot.hist(X,BINS)
    

    参数:
    X:数据源,必须是一维的。图像通常是二维的,需要通过ravel()函数将图像处理为一维数据源后,再作为参数使用
    BINS:灰度级的分组情况

    b=a.ravel()
    

    2.使用Opencv绘制直方图

    1. 统计直方图信息

    该函数可以用来计算图像的统计直方图,可以统计各个灰度级的像素点个数

    Hist=cv2.calcHist(image,channels,mask,histSize,ranges,accumulate)
    
    • Hist:返回的统计直方图,是一个一维数组,数组内的元素是各个灰度级的像素个数
    • images:原始图像,[]
    • channels:通道编号,[] [0],[1],[2]代表B,G,R
    • mask:None
    • hitSize:BINS值,[256]
    • range:代表像素范围[0,255]
    • accumulate:false

    再用下面函数绘制

    matplotlib.pyplot.plot()
    
    import cv2
    import numpy as np
    
    img=cv2.imread("D:/hjbzwy.jpg")
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    hist=cv2.calcHist([img],[0],None,[256],[0,255])
    
    print(type(hist))
    print(hist.shape)
    print(hist.size)
    print(hist)
    
    <class 'numpy.ndarray'>
    (256, 1)
    256
    [[  57.]
     [   8.]
     [  15.]
     [  11.]
     [  17.]
     [  22.]
    .....
    

    2.plot()函数的使用

    import matplotlib.pyplot as plt
    
    
    x=[0,1,2,3,4,5,6]
    y=[0.3,0.4,2,5,3,4.5,4]
    
    plt.plot(x,y)
    plt.show()
    
    import matplotlib.pyplot as plt
    
    y=[0.3,0.4,2,5,3,4.5,4]
    
    plt.plot(y)
    plt.show()
    
    import matplotlib.pyplot as plt
    
    x=[1,2,3,4,5,6,3]
    y=[0.3,0.4,2,5,3,4.5,4]
    
    plt.plot(y,color='r')
    plt.plot(x,color='g')
    
    plt.show()
    

    3.绘制统计直方图

    import cv2
    import matplotlib
    import matplotlib.pyplot as plt
    
    img=cv2.imread("D:/zwy.jpg")
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
    histb=cv2.calcHist([img],[0],None,[256],[0,255])
    plt.plot(histb,color='b')
    plt.show()
    
    import cv2
    import matplotlib
    import matplotlib.pyplot as plt
    
    img=cv2.imread("D:/zwy.jpg")
    
    histb=cv2.calcHist([img],[0],None,[256],[0,255])
    histg=cv2.calcHist([img],[1],None,[256],[0,255])
    histr=cv2.calcHist([img],[2],None,[256],[0,255])
    
    plt.plot(histb,color='b')
    plt.plot(histr,color='r')
    plt.plot(histg,color='g')
    
    plt.show()
    

    3. 使用掩模绘制直方图

    import cv2
    import matplotlib.pyplot as plt
    import numpy as np
    import matplotlib
    
    img=cv2.imread("D:/zwy.jpg")
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
    mask=np.zeros([466, 350],dtype=np.uint8)
    mask[100:200,100:200]=255
    
    histimage=cv2.calcHist([gray],[0],None,[256],[0,255])
    histMI=cv2.calcHist([gray],[0],mask,[256],[0,255])
    
    plt.plot(histimage)
    plt.plot(histMI)
    
    plt.show()
    

    4. 直方图均衡化

    将原始图像的灰度级均匀地映射到整个灰度级范围内,得到一个灰度级分布均匀的图像

    • 计算其统计直方图

    • 归一化统计直方图

    • 计算累计统计直方图

      1. 在原有范围实现均匀化(当前灰度最大值)
      1. 在更广范围内实现均衡化(最大映射灰度值)
    dst = cv2.equalizeHist( src )
    #需要经过ravel()处理
    
    import cv2
    import matplotlib.pyplot as plt
    
    img=cv2.imread("D:/hjb.jpg")
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
    equ=cv2.equalizeHist(gray)
    
    cv2.imshow("img",img)
    cv2.imshow("equ",equ)
    
    plt.figure("原始图像直方图")
    plt.hist(img.ravel(),256)
    plt.figure("均衡化直方图")
    plt.hist(equ.ravel(),256)
    
    plt.show()
    cv2.waitKey(0)
    cv2.destroyWindow()
    

    5 pyplot函数

    向当前窗口内添加一个子窗口,注意序号是从1开始的

    subplot(2,3,4)表示当前两行三列的窗口的第四个位置上,添加一个子窗口
    subplot(234)
    
    import cv2
    import matplotlib.pyplot as plt
    
    img=cv2.imread("D:/zwy2.jpg")
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
    equ=cv2.equalizeHist(gray)
    
    plt.figure("subplot示例")
    plt.subplot(121)
    plt.hist(img.ravel(),256)
    plt.subplot(122)
    plt.hist(equ.ravel(),256)
    plt.show()
    

    6. imshow函数

    .imshow(x,cmap=None)
    

    参数:
    x:图像信息
    cmap:色彩空间,默认值是null,使用RGB(A)色彩空间

    import cv2
    import matplotlib.pyplot as plt
    
    img=cv2.imread("D:/hjb.jpg")
    imgRGB=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    
    plt.figure("显示结果")
    plt.subplot(121)
    plt.imshow(img),plt.axis('off')
    plt.subplot(122)
    plt.imshow(imgRGB),plt.axis('off')
    plt.show()
    

    显示灰度图像

    注意cv2.imread()读取的图像,其通道顺序是BGR模式的,而.imshow()显示顺序是RGB模式的,且默认色彩空间参数是RGB(A)

    import cv2
    import matplotlib.pyplot as plt
    
    img=cv2.imread("D:/hjb.jpg")
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
    plt.figure("灰度图像显示演示")
    plt.subplot(221)
    plt.imshow(img),plt.axis('off')
    plt.subplot(222)
    plt.imshow(img,cmap=plt.cm.gray),plt.axis('off')
    plt.subplot(223)
    plt.imshow(gray),plt.axis('off')
    plt.subplot(224)
    plt.imshow(gray,cmap=plt.cm.gray),plt.axis('off')
    
    plt.show()
    

    以不同的参数形式显示灰度图像

    import cv2
    import matplotlib.pyplot as plt
    
    img=cv2.imread("D:/100.jpg")
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
    plt.figure("灰度图像显示演示")
    plt.subplot(221);plt.imshow(gray,cmap=plt.cm.gray)
    plt.subplot(222);plt.imshow(gray,cmap=plt.cm.gray_r)
    plt.subplot(223);plt.imshow(gray,cmap='gray')
    plt.subplot(224);plt.imshow(gray,cmap='gray_r')
    plt.show()
    

    相关文章

      网友评论

          本文标题:直方图处理

          本文链接:https://www.haomeiwen.com/subject/qhmkzltx.html