【转载】OpenCV-Python系列之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之间。

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

我们来看代码:

view plaincopy to clipboardprint?
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)  

在这里插入图片描述
在这里插入图片描述

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

来看代码:

view plaincopy to clipboardprint?
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直方图,它使我们对不同的像素密度有了更好的了解。

我们来看代码:

view plaincopy to clipboardprint?
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()  

我们仍然使用刚刚那副猫咪的图像,来看结果:
在这里插入图片描述
在这里插入图片描述

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

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

查看文章汇总页https://blog.csdn.net/weixin_44237705/article/details/107864965
更多openvino技术信息可以入群交流~
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44237705/article/details/108821825
今日推荐