python-opencv Tutorials 一码人翻译(25)图像处理---- --直方图----2d直方图

目标

在这一章中,我们将学习寻找和绘制2D直方图。它将在接下来的章节中有所帮助。

介绍

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

已经有一个python样本(sampl/python/color直方图.py)已经用于寻找颜色直方图。我们将尝试理解如何创建这样的颜色直方图,它将有助于理解像直方图反投影这样的进一步的主题。

二维直方图OpenCV

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

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

用于H平面的箱=180,256 180,以及256的S平面。

范围=0,180,0,256色调值介于0到180之间,饱和度在0到256之间。

现在检查下面的代码:

扫描二维码关注公众号,回复: 2791294 查看本文章
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])

就是这样。

在Numpy二维直方图

Numpy还提供了一个特定的功能:np.组织学()。(记住,对于一维的直方图,我们使用了np.直方图())。

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]])

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

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

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

绘制二维直方图

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

我们得到的结果是一个大小为180x256的二维数组。所以我们可以像往常一样,使用cv.imshow()函数来显示它们。它将是一个灰度图像,它不会给出太多的颜色,除非你知道不同颜色的色调值。

方法-2:使用Matplotlib

我们可以使用matplotlib.pyplot.imshow()函数来绘制带有不同颜色映射的2D直方图。它给我们提供了一个更好的关于不同像素密度的概念。但这也不能让我们知道第一眼看到的是什么颜色,除非你知道不同颜色的色调值。我还是喜欢这种方法。这很简单,也很好。

请注意

在使用这个函数时,请记住,插值标记应该是最接近于更好结果的。

考虑一下代码

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

img = cv.imread('tiananmen.jpg')
hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)
hist = cv.calcHist( [hsv], [0, 1], None, [180, 256], [0, 180, 0, 256] )

plt.imshow(hist,interpolation = 'nearest')
plt.show()

:

猜你喜欢

转载自blog.csdn.net/qq_41905045/article/details/81566846