转载于如何构建二维直方图?
在上一篇博客中,我们讨论了一维直方图,其中我们分别分析每个通道。假设我们想要找到图像通道之间的相关性,假设我们有兴趣找到某种颜色在图像中出现的次数。在这种情况下,一维直方图将无法胜任,因为它无法显示两个通道之间确切位置处的强度关系。
为了解决这个问题,我们需要多维直方图,例如 2D 或 3D。借助 2D 直方图,我们可以用2个组合(RG、GB、BR)或3D直方图一起分析通道。
让我们看看什么是二维直方图以及如何使用 OpenCV Python 构建它。
二维直方图对强度组合的出现进行计数。
下图显示了一个2D直方图
这里,Y 和 X 轴对应于红色和绿色通道范围(对于 8 位,[0,255]),直方图中的每个点显示对应于每个 R 和 G 对的频率。频率在这里用颜色编码,否则,将需要另一个维度。
让我们通过一个简单的例子来了解如何构建二维直方图。
假设我们有 4×4、2 位的红色和绿色通道图像(如下所示),并且我们想要绘制它们的二维直方图。
-
首先,我们分别在 X 轴和 Y 轴上绘制 R 和 G 通道范围(此处为 [0,3])。这将是我们的二维直方图。
-
然后,循环通道内的每个位置,找到相应的强度对频率并将其绘制在二维直方图中。然后对这些频率进行颜色编码,以便于可视化。
现在,让我们看看如何使用 OpenCV-Python 构建二维直方图
我们使用与一维直方图相同的函数cv2.calcHist()。只需更改以下参数即可,其余相同。
-
通道:[0,1] 表示(蓝色,绿色),[1,2] 表示(G,R),[0,2] 表示(B,R)。
-
bins:根据您的需要指定每个通道。例如[256,256]。
-
范围:8 位图像的 [0,256,0,256]。
下面是使用 OpenCV-Python 的示例代码
绘制二维直方图时始终使用最近邻插值。
使用 RGB 通道绘制 2D 直方图不是一个好的选择,因为我们无法仅使用 2 个通道提取颜色信息。尽管如此,这仍然可以用于查找通道之间的相关性、查找削波或强度比例等。
为了提取颜色信息,我们需要一个颜色模型,其中两个分量/通道可以单独表示图像的色度(颜色)。其中一种颜色模型是 HSV,其中 H 和 S 告诉我们光的颜色。因此,首先将图像从 BGR 转换为 HSV,然后应用上面的代码。