OpenCV-Python 2D直方图

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

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

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

OpenCV中的2D直方图

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

  • channels = [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])

而已。

Numpy中的2D直方图

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

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

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

绘制2D直方图

方法-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('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轴显示色相。

OpenCV中的2D直方图

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

方法3:OpenCV示例样式

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

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

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

OpenCV中的2D直方图

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

赞(1)
未经允许不得转载:极客笔记 » OpenCV-Python 2D直方图

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
OpenCV-Python介绍
OpenCV-Python 教程在Windows安装OpenCV-Python在Fedora上安装OpenCV-Python在Ubuntu系统中安装OpenCV—Python
OpenCV-Python GUI功能
OpenCV-Python图像入门OpenCV-Python视频入门OpenCV-Python绘图功能OpenCV-Python鼠标作为画笔OpenCV-Python作为调色板的跟踪栏
OpenCV-Python 核心操作
OpenCV-Python图像基本操作OpenCV-Python图像的算术运算OpenCV-Python性能测量和改进技术
OpenCV-Python 图像处理
OpenCV-Python改变颜色空间OpenCV-Python图像的几何变换OpenCV-Python图像阈值OpenCV-Python平滑图像OpenCV-Python形态转换OpenCV-Python图像梯度OpenCV-Python Canny边缘检测OpenCV-Python图像金字塔OpenCV-Python轮廓入门OpenCV-Python轮廓特征OpenCV-Python轮廓属性OpenCV-Python更多轮廓功能OpenCV-Python轮廓层次结构OpenCV-Python直方图-查找,绘图,分析OpenCV-Python直方图均衡OpenCV-Python 2D直方图OpenCV-Python直方图反投影OpenCV-Python图像转换OpenCV-Python模板匹配OpenCV-Python霍夫线变换OpenCV-Python霍夫圆变换OpenCV-Python基于分水岭算法的图像分割OpenCV-Python基于 GrabCut 算法的交互式前景提取
OpenCV-Python 特征检测
OpenCV-Python理解特征OpenCV-Python Harris 角点检测OpenCV-Python Shi-Tomasi 角点检测和追踪的良好特征OpenCV-Python SIFT 简介(尺度不变特征变换)OpenCV-Python SURF 简介(加速鲁棒特性)OpenCV-Python角点检测的 FAST 算法OpenCV-Python BRIEF(二进制鲁棒独立基本特征)OpenCV-Python ORB算法OpenCV-Python特征匹配OpenCV-Python特征匹配+单应性查找对象
OpenCV-Python 视频分析
OpenCV-Python Meanshift 和 CamshiftOpenCV-Python光流OpenCV-Python背景减法
OpenCV-Python 相机校准和3D重建
OpenCV-Python相机校准OpenCV-Python姿势估计OpenCV-Python线性几何OpenCV-Python立体图像的深度图
OpenCV-Python 机器学习
OpenCV-Python K-最近邻算法OpenCV-Python 使用 kNN 进行手写识别OpenCV-Python 理解 SVMOpenCV-Python 使用 SVM 进行手写数据识别OpenCV-Python 理解 K-Means 聚类OpenCV-Python 中的 K-Means 聚类
OpenCV-Python 计算摄影
OpenCV-Python 图像去噪OpenCV-Python 图像修复OpenCV-Python 高动态范围(HDR)