• OpenCV Python 直方图


    OpenCV Python 直方图


    直方图

    什么是直方图

    直方图的作用

    敲程序

    下面为使用PythonOpenCVmatplotlib来编写几个samples程序来实际感受一下图像的直方图:

    使用matplotlib计算直方图

    代码

    import cv2
    import numpy as np
    from matplotlib import pyplot as plt
    
    img = cv2.imread('~/Pictures/IMG_4137.JPG', 0)
    plt.hist(img.ravel() , 256, [0, 256])
    plt.show()

    出现错误

    上面的这段程序,你运行会出现这样的error:

    Traceback (most recent call last):
      File "/home/aobo/PycharmProjects/OpenCV2/Histograms/hist.py", line 6, in <module>
        plt.hist(img.ravel() , 256, [0, 256])
    AttributeError: 'NoneType' object has no attribute 'ravel'

    解决办法

    将代码里的下面这行

    img = cv2.imread('~/Pictures/IMG_4137.JPG', 0)

    修改为:(图片路径使用完整的绝对路径)

    img = cv2.imread('/home/aobo/Pictures/IMG_4137.JPG', 0)

    错误的原因是:img变量没有成功的载入图片(cv2.imread()),所以这个img变量就是一个没有任何变量类型的一个变量,在Python语言里img现在就是一个NoneType对象。因为只要Mat对象才有ravel()这个方法,而NoneType对象没有,所以才出现了上面的error

    img.ravel() 将图像转成一维数组。

    运行结果:

    Figure 1


    输出一个彩色图像的直方图

    代码

    import cv2
    import numpy as np
    from matplotlib import pyplot as plt
    
    img = cv2.imread('/home/aobo/Pictures/IMG_4137.JPG')
    color = ('b','g','r')
    # enumerate():python里的一个新函数
    # 它的作用:同时遍历索引(i)和元素(col)
    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()

    运行效果

    Figure 1

    代码讲解

    histr = cv2.calcHist([img], [i], None, [256], [0, 256])

    cv2.calcHist()是OpenCV里面求直方图的函数。下面介绍这个函数需要传入的形参:

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

    实参 对应形参 解释
    [img] images 原始图像,需要使用[]修饰
    [i] channels cv2.calcHist()函数一次只能得到一张图片的其中一个通道的直方图,所以,这里传入的是本次需要处理的元素图片的通道的索引号,同样需要使用[]修饰。如果输入的元素图像是灰度图,它的值就是[0]; 如果输入的元素图像是彩色图像的话,传入的参数可以是[0], [1], [2],它们分别对应着通道B, G, R。
    plt.plot(histr, color = col)

    这句话中的col的值是:’b’, ‘g ’ 或 ‘r’,赋给color形参,函数会自动处理成形应的颜色值,用这个颜色值将histr直方图绘制到plt画板上。

    plt.xlim([0, 256])

    设置plt画板x轴的上下限,就是x轴所显示的长度。我们将这段代码修改出下面这个样子,然后运行程序,会得到下面的结果:

    plt.xlim([0, 100])

    Figure 1


    使用掩模

    代码

    import cv2
    import numpy as np
    from matplotlib import pyplot as plt
    
    img = cv2.imread('/home/aobo/Pictures/IMG_4137.JPG')
    color = ('b','g','r')
    
    mask = np.zeros(img.shape[:2], np.uint8)
    mask[1000:2000, 1000:2000] = 255
    masked_img = cv2.bitwise_and(img, img, mask = mask)
    
    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.xlim([0, 256])
    
    plt.show()

    运行效果

    <注>:当原始图像使用较大图像的时候,你会发现程序运行后需要好久才能得到下面的结果。
    Figure 1

    代码解释

    mask = np.zeros(img.shape[:2], np.uint8)
    mask[1000:2000, 1000:2000] = 255

    制作一个掩模。首先使用np.zeros()函数创建一个与原图尺寸和深度都一样,像素值全为0(黑色)图像mask,然后指定mask掩模的[1000:2000, 1000:2000]区域的像素全为255(白色)。上图右上角的图就是掩模图像。

    masked_img = cv2.bitwise_and(img, img, mask = mask)

    现在掩模发挥了作用:掩模的黑色区域(像素值为0)用来遮盖原图img,即不参与图像处理,只保留像素值不为0的区域。masked_img图像就是上图左下角的图像。
    cv2.bitwise_and()函数的功能是位与。下面是这个函数的声明:

    cv2.bitwise_and(src1, src2[, dst[, mask]])

    当前代码里,对应的src1src2是同一种数据类型,所以此时cv2.bitwise_and()函数执行的是下面的操作:
    Alt text

    hist_full = cv2.calcHist([img], [0], None, [256], [0, 256])
    hist_mask = cv2.calcHist([img], [0], mask, [256], [0, 256])

    分别计算出原图img的直方图和img掩模区域的直方图。

    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.xlim([0, 256])

    subplot()matplotlib.pyplot里的函数。它是:将多个图画到一个平面上的工具。

    subplot(m, n, p) 或者subplot(mnp)

    m 表示图排成m行
    n 表示图排成n列
    p 表示将图画到Figure(指的是上面截图里的窗口)哪个图上,顺序是从左到右,从上到下

  • 相关阅读:
    php连接mysql的三种方式和预处理下的sql注入
    报错注入原理学习
    学习BurpSuite半自动化盲注和一些小总结
    django项目实战
    docker出题和编写dockerfile
    Django零基础到项目实战
    爬虫之某古诗词网站
    [学习笔记] 左偏树入门
    [学习笔记] 自适应Simpson算法
    [题解向] [Luogu P2029]跳舞
  • 原文地址:https://www.cnblogs.com/aobosir/p/5928676.html
Copyright © 2020-2023  润新知