zoukankan      html  css  js  c++  java
  • OpenCVPython系列之2D直方图

    在之前的教程中,我们介绍了OpenCV的一维直方图,之所以称为一维,是因为我们仅考虑一个特征,即像素的灰度强度值,我们通常输入灰度图像。 但是在二维直方图中,我们要考虑两个特征。通常,它用于查找颜色直方图,其中两个特征是每个像素的色相和饱和度值。

    它非常简单,并且使用相同的函数 cv.calcHist ()进行计算。 对于彩色直方图,我们需要将图像从BGR转换为HSV。(请记住,对于一维直方图,我们从BGR转换为灰度)。对于二维直方图,其参数将进行如下修改:

    channel = [0,1] , 因为我们需要同时处理H和S平面。

    bins = [180,256] 对于H平面为180,对于S平面为256。

    range = [0,180,0,256] 色相值介于0和180之间,饱和度介于0和256之间。

    虽然我们在上一个教程中简述了彩色图像的直方图均值化,但是并未进行详述,其本质属于二维直方图,但同样的,它也可以进行均值化。

    我们来看代码:

    def twohist(img):
        hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
        hist = cv2.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])
        cv2.imshow("img",img)
        cv2.imshow("res",hist)

    image.png

    image.png]

    不仅仅是OpenCV可以绘制二维直方图,我么能用Numpy仍然可以完成,Numpy还为此提供了一个特定的函数:np.histogram2d()(记住,对于一维直方图我们使用了np.histogram())。

    来看代码:

    import numpy as np
    import cv2 as cv
    from matplotlib import pyplot as plt
    img = cv.imread(cat.jpg')
    hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)
    hist, xbins, ybins = np.histogram2d(h.ravel(),s.ravel(),[180,256],[[0,180],[0,256]])

    我们刚刚使用了OpenCV进行绘制二维直方图,我们得到的结果是尺寸为 80x256 的二维数组。因此,可以使用 cv.imshow ()函数像平常一样显示它们,它将是一幅灰度图像。

    现在我们将使用Matplotlib进行绘图,matplotlib.pyplot.imshow()函数可以绘制具有不同颜色图的2D直方图,它使我们对不同的像素密度有了更好的了解。

    我们来看代码:

    def plthist(img):
        hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
        hist = cv2.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])
        plt.imshow(hist, interpolation='nearest')
        plt.show()

    我们仍然使用刚刚那副猫咪的图像,来看结果:

    image.png

    image.png

    在直方图中,我们可以在H = 0和S = 40附近看到一些较高的值。它对应于猫咪的黑色。同样,在H = 50和S = 20附近可以看到另一个峰值。它对应于猫咪的黄色。

    本次教程我们讨论的就是这些,相比较而言,并不复杂,但是相当有用,至于具体的用途,我们将在后续介绍,现在还为时过早。

  • 相关阅读:
    Linux unalias命令 取消别名
    linux cp 拷贝文件或目录
    POJ 1850
    POJ 1844
    POJ 1852
    POJ 1837
    POJ 1833
    POJ 1804
    POJ 1789
    POJ 1781
  • 原文地址:https://www.cnblogs.com/wuyuan2011woaini/p/15656889.html
Copyright © 2011-2022 走看看