这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 企业专区 » OpenVINO生态社区 » 【原创】OpenCV-Python系列之2D直方图(三十六)

共4条 1/1 1 跳转至

【原创】OpenCV-Python系列之2D直方图(三十六)

高工
2020-07-17 21:54:07     打赏

OpenCV-Python系列之2D直方图

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

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

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

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

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

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

我们来看代码:

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 = 0S = 40附近看到一些较高的值。它对应于猫咪的黑色。同样,在H = 50S = 20附近可以看到另一个峰值。它对应于猫咪的黄色。

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


对计算机视觉感兴趣?这个社区推荐给你~

>>点击了解OpenVINO生态开发社区



院士
2020-07-18 09:47:41     打赏
2楼

祝老师 威武啊


高工
2020-07-18 15:28:11     打赏
3楼

学到了


工程师
2020-07-18 15:41:25     打赏
4楼

不错的帖子


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]