OpenCV竟然可以这样学!成神之路终将不远(二十四)

简介: OpenCV竟然可以这样学!成神之路终将不远(二十四)

 返回目录

目录

24 直方图-3:二维直方图

24.1 目标

24.2 介绍

24.3 OpenCV中的二维直方图

24.4 Numpy中的二维直方图

24.5 绘制二维直方图

24.5.1 方法1:使用 cv.imshow()

24.5.2 方法2:使用Matplotlib

24.5.3 方法3:OpenCV示例样式


24 直方图-3:二维直方图

24.1 目标

在本章中,我们将学习查找和绘制2D直方图。这将在以后的章节中有所帮助。

24.2 介绍

在第一篇文章中,我们计算并绘制了一维直方图。 之所以称为一维,是因为我们仅考虑一个特征,即像素的灰度强度值。 但是在二维直方图中,您要考虑两个特征。 通常,它用于查找颜色直方图,其中两个特征是每个像素的色相和饱和度值。

已经有一个python示例(samples / python / color_histogram.py)用于查找颜色直方图。 我们将尝试了解如何创建这种颜色直方图,这对于理解诸如直方图反向投影之类的更多主题将很有用。

24.3 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之间。

    现在检查以下代码:

    import numpy as np
    import cv2 as cv
    img = cv.imread('home.jpg')
    hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
    hist = cv.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])

    image.gif

    就是这样。

    24.4 Numpy中的二维直方图

    Numpy还为此提供了一个特定的函数:np.histogram2d()。(记住,对于一维直方图我们使用了np.histogram())。

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

    image.gif

    第一个参数是H平面,第二个是S平面,第三个是每个箱子的数量,第四个是它们的范围。

    现在我们可以检查如何绘制这个颜色直方图。

    24.5 绘制二维直方图

    24.5.1 方法1:使用 cv.imshow()

    我们得到的结果是尺寸为80x256的二维数组。因此,可以使用cv.imshow()函数像平常一样显示它们。它将是一幅灰度图像,除非您知道不同颜色的色相值,否则不会对其中的颜色有太多了解。

    24.5.2 方法2:使用Matplotlib

    我们可以使用matplotlib.pyplot.imshow()函数绘制具有不同颜色图的2D直方图。它使我们对不同的像素密度有了更好的了解。但是,除非您知道不同颜色的色相值,否则乍一看并不能使我们知道到底是什么颜色。我还是更喜欢这种方法。它简单而更好。

    注意:使用此功能时,请记住,插值法应采用最近邻以获得更好的结果。

    考虑下面的代码:

    import cv2 as cv
    from matplotlib import pyplot as plt
    img = cv.imread('girl.jpg')
    rgb = cv.cvtColor(img, cv.COLOR_BGR2RGB)
    hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
    hist = cv.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])
    plt.subplot(121), plt.imshow(rgb, 'gray'), plt.title('original')
    plt.xticks([]), plt.yticks([])
    plt.subplot(122), plt.imshow(hist, interpolation='nearest'), plt.title('hist')
    plt.show()

    image.gif

    下面是输入图像及其颜色直方图。X轴显示S值,Y轴显示色相。

    image.gif编辑

    在直方图中,您可以在H = 100和S = 200附近看到一些较高的值。它对应于天空的蓝色。同样,在H = 25和S = 100附近可以看到另一个峰值。它对应于宫殿的黄色。您可以使用GIMP等任何图像编辑工具进行验证。

    24.5.3 方法3:OpenCV示例样式

    OpenCV-Python2示例中有一个颜色直方图的示例代码(samples / python / color_histogram.py)。如果运行代码,则可以看到直方图也显示了相应的颜色。或者简单地,它输出颜色编码的直方图。其结果非常好(尽管您需要添加额外的线束)。

    在该代码中,作者在HSV中创建了一个颜色图。然后将其转换为BGR。将所得的直方图图像与此颜色图相乘。他还使用一些预处理步骤来删除小的孤立像素,从而获得良好的直方图。

    我将其留给读者来运行代码,对其进行分析并拥有自己的解决方法。下面是与上面相同的图像的代码输出:

    image.gif编辑

    您可以在直方图中清楚地看到存在什么颜色,那里是蓝色,那里是黄色,并且由于棋盘的存在而有些白色。很好!


    欢迎评论区留言,一起探讨OpenCV成神之路的奥秘。

    顺便给我加个关注,点个赞,加个收藏,让我们一起登上神坛。

    image.gif编辑

    相关文章
    |
    机器学习/深度学习 编解码 计算机视觉
    OpenCV竟然可以这样学!成神之路终将不远(十六)
    OpenCV竟然可以这样学!成神之路终将不远(十六)
    |
    计算机视觉 Python
    OpenCV竟然可以这样学!成神之路终将不远(十)
    OpenCV竟然可以这样学!成神之路终将不远(十)
    |
    算法 计算机视觉 Python
    OpenCV竟然可以这样学!成神之路终将不远(二十六)
    OpenCV竟然可以这样学!成神之路终将不远(二十六)
    |
    算法 计算机视觉 索引
    OpenCV竟然可以这样学!成神之路终将不远(二十五)
    OpenCV竟然可以这样学!成神之路终将不远(二十五)
    |
    计算机视觉 Python
    OpenCV竟然可以这样学!成神之路终将不远(二十三)
    OpenCV竟然可以这样学!成神之路终将不远(二十三)
    |
    计算机视觉 索引 Python
    OpenCV竟然可以这样学!成神之路终将不远(二十二)
    OpenCV竟然可以这样学!成神之路终将不远(二十二)
    |
    安全 计算机视觉 索引
    OpenCV竟然可以这样学!成神之路终将不远(二十一)
    OpenCV竟然可以这样学!成神之路终将不远(二十一)
    |
    文字识别 计算机视觉 索引
    OpenCV竟然可以这样学!成神之路终将不远(二十)
    OpenCV竟然可以这样学!成神之路终将不远(二十)
    |
    定位技术 计算机视觉 Python
    OpenCV竟然可以这样学!成神之路终将不远(十九)
    OpenCV竟然可以这样学!成神之路终将不远(十九)
    |
    算法 计算机视觉 索引
    OpenCV竟然可以这样学!成神之路终将不远(十八)
    OpenCV竟然可以这样学!成神之路终将不远(十八)