如何在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可视化了结果。掌握了直方图的计算和绘制方法,可以帮助我们更好地理解图像的颜色分布情况,从而更好地进行计算机视觉处理。