前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >opencv(4.5.3)-python(二十五)--二维直方图

opencv(4.5.3)-python(二十五)--二维直方图

作者头像
用户9875047
发布2023-02-26 15:13:50
5190
发布2023-02-26 15:13:50
举报
文章被收录于专栏:机器视觉全栈er

翻译及二次校对:cvtutorials.com

目标

在本章中,我们将学习如何寻找和绘制二维直方图。它对后面的章节会有帮助。

绪论

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

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

OpenCV中的二维直方图

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

  • • channels = [0,1] 因为我们需要同时处理H和S平面。
  • • bins = [180,256] 180用于H平面,256用于S平面。
  • • range = [0,180,0,256] 色调值在0到180之间,饱和度在0到256之间。

现在看看下面的代码:

代码语言:javascript
复制
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中的2D直方图

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

代码语言:javascript
复制
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面,第三个是bin数,第四个是范围。

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

绘制二维直方图

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

我们得到的结果是一个大小为180x256的二维数组。所以我们可以像平时那样,用cv.imshow()函数来显示它们。这将是一个灰度图像,除非你知道不同颜色的色相值,否则它不会让人知道有哪些颜色。

方法-2:使用Matplotlib

我们可以使用matplotlib.pyplot.imshow()函数来绘制带有不同颜色图谱的2D直方图。这可以让我们更好地了解不同的像素密度。但是,这也不能让我们在第一眼就知道是什么颜色,除非你知道不同颜色的色相值。但我还是喜欢这种方法。它既简单又好。

注意:在使用这个函数时,请记住,为了得到更好的结果,插值标志应该是最近的。

看一下代码:

代码语言:javascript
复制
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 = cv.calcHist( [hsv], [0, 1], None, [180, 256], [0, 180, 0, 256] )
plt.imshow(hist,interpolation = 'nearest')
plt.show()

下面是输入的图像和它的颜色直方图图谱。X轴显示S值,Y轴显示色调。

在直方图中,你可以看到H=100和S=200附近的一些高值。它与天空的蓝色相对应。同样地,在H=25和S=100附近可以看到另一个峰值。它对应的是宫殿的黄色。你可以用任何图像编辑工具如GIMP来验证它。

方法3:OpenCV的样本风格

在OpenCV-Python2样本(samples/python/color_histogram.py)中,有一个颜色直方图的示例代码。如果你运行该代码,你可以看到直方图也显示了相应的颜色。或者简单地说,它输出了一个彩色编码的直方图。它的效果非常好(尽管你需要额外增加一堆行)。

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

我把它留给读者,让他们去运行这段代码,分析它,思考它。下面是该代码对上述相同图像的输出。

你可以在直方图中清楚地看到哪些颜色是存在的,蓝色是存在的,黄色是存在的,还有一些由于棋盘造成的白色是存在的。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-01-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器视觉全栈er 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档