如何在OpenCV Python中计算和绘制图像的二维直方图?

如何在OpenCV Python中计算和绘制图像的二维直方图?

在计算机视觉领域,直方图是一种常用的工具,它可以帮助我们对图像进行分析和处理。一维直方图是对灰度图像像素值的统计,而二维直方图则可以帮助我们分析图像像素的颜色分布。本文将介绍在OpenCV Python中如何计算和绘制图像的二维直方图。

计算图像的二维直方图

计算二维直方图的函数为cv2.calcHist(),其中的参数histSize表示直方图中每个维度的bin(即区间)的数目,ranges表示每个维度的取值范围。我们以一张二维图像为例进行演示。

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('sample.jpg')
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 创建一个256x256的二维直方图,h和s分别有16个bin
hist_2d, x_edges, y_edges = np.histogram2d(hsv[:,:,0].flatten(),
                                            hsv[:,:,1].flatten(),
                                            bins=[16,16],
                                            range=[[0, 255], [0, 255]])

# 将直方图进行归一化处理,以便更好的可视化
hist_2d_norm = cv2.normalize(hist_2d, None, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)

上述代码首先读取了一张图像,并将其转换为HSV颜色空间。然后我们使用np.histogram2d()函数计算图像的二维直方图,得到一个256×256的直方图。最后我们对直方图进行了归一化处理,以便更好地可视化。

可视化二维直方图

我们可以使用Matplotlib来可视化二维直方图。Matplotlib提供了 imshow() 函数可以用于显示二维数组的内容,同时我们还需要创建一个色卡来展示对应的像素数量。代码如下所示:

# 使用`imshow()`函数展示直方图
fig, ax = plt.subplots()
im = ax.imshow(hist_2d_norm)

# 设置坐标轴标签和标题
ax.set_xticks(np.arange(hist_2d_norm.shape[0]))
ax.set_yticks(np.arange(hist_2d_norm.shape[1]))
ax.set_xticklabels(x_edges[:-1].astype(int))
ax.set_yticklabels(y_edges[:-1].astype(int))
ax.set_xlabel('H')
ax.set_ylabel('S')
ax.set_title('2D histogram of sample image')

# 创建颜色条(色卡)
cbar = ax.figure.colorbar(im, ax=ax)
cbar.ax.set_ylabel('Count', rotation=-90, va="bottom")

# 显示图形
plt.show()

上述代码首先使用Matplotlib的imshow()函数展示了直方图,然后我们设置了x轴和y轴的标签以及标题。接着,我们创建了一个颜色条(色卡),以便更好的理解颜色和像素数量的对应关系。最后通过plt.show()函数显示图像。

完整代码示例

完整的代码示例如下:

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('sample.jpg')
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 创建一个256x256的二维直方图,h和s分别有16个bin
hist_2d, x_edges, y_edges = np.histogram2d(hsv[:,:,0].flatten(),
                                            hsv[:,:,1].flatten(),
                                            bins=[16,16],
                                            range=[[0, 255], [0, 255]])

# 将直方图进行归一化处理,以便更好的可视化
hist_2d_norm = cv2.normalize(hist_2d, None,alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)

# 使用`imshow()`函数展示直方图
fig, ax = plt.subplots()
im = ax.imshow(hist_2d_norm)

# 设置坐标轴标签和标题
ax.set_xticks(np.arange(hist_2d_norm.shape[0]))
ax.set_yticks(np.arange(hist_2d_norm.shape[1]))
ax.set_xticklabels(x_edges[:-1].astype(int))
ax.set_yticklabels(y_edges[:-1].astype(int))
ax.set_xlabel('H')
ax.set_ylabel('S')
ax.set_title('2D histogram of sample image')

# 创建颜色条(色卡)
cbar = ax.figure.colorbar(im, ax=ax)
cbar.ax.set_ylabel('Count', rotation=-90, va="bottom")

# 显示图形
plt.show()

结论

本文介绍了如何使用OpenCV Python计算和绘制图像的二维直方图。我们使用了cv2.calcHist()函数计算了直方图,并使用了Matplotlib可视化了结果。掌握了直方图的计算和绘制方法,可以帮助我们更好地理解图像的颜色分布情况,从而更好地进行计算机视觉处理。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

Python OpenCV