前言
二维直方图是用于分析图像中两个通道之间像素值分布关系的工具。相比于一维直方图,二维直方图可以同时统计两个通道之间的联合分布。比如在 HSV 色彩空间中,可以分析色调(Hue)和饱和度(Saturation)的关系。
功能实现
本示例实现以下功能:
- 加载一张彩色图像并转换为 HSV 色彩空间。
- 计算 HSV 空间中 H 和 S 通道的二维直方图。
- 使用伪彩色可视化二维直方图,并通过 Matplotlib 绘制热图。
完整代码
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
def image2d_hist():
# 加载图像
image = cv.imread('images/test.png')
if image is None:
print("无法加载图像")
return
# 转换为 HSV 色彩空间
hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
# 计算二维直方图
hist = cv.calcHist([hsv], [0, 1], None, [48, 48], [0, 180, 0, 256])
# 调整直方图大小
dst = cv.resize(hist, (400, 400))
# 归一化直方图到 0~255
cv.normalize(dst, dst, 0, 255, cv.NORM_MINMAX)
# 显示原图
cv.imshow("Original Image", image)
# 应用伪彩色并显示直方图
dst_colormap = cv.applyColorMap(np.uint8(dst), cv.COLORMAP_JET)
cv.imshow("2D Histogram (ColorMap)", dst_colormap)
# 使用 Matplotlib 绘制热图
plt.imshow(hist, interpolation='nearest', extent=[0, 180, 0, 256], aspect='auto', cmap='jet')
plt.colorbar()
plt.title("2D Histogram (H and S)")
plt.xlabel("Hue")
plt.ylabel("Saturation")
plt.show()
# 等待用户按键关闭窗口
cv.waitKey(0)
cv.destroyAllWindows()
# 调用函数
image2d_hist()
计算二维直方图
hist = cv.calcHist([hsv], [0, 1], None, [48, 48], [0, 180, 0, 256])
- 参数说明:
[hsv]
:输入图像。[0, 1]
:统计 H 通道(色调)和 S 通道(饱和度)的分布。None
:不使用掩码。[48, 48]
:将 H 和 S 通道分别分为 48 个区间。[0, 180, 0, 256]
:H 通道范围 [0, 180],S 通道范围 [0, 256]。
应用场景
- 颜色分析:
- 分析图像中不同颜色的分布规律。
- 图像检索:
- 使用直方图作为特征向量进行图像匹配或检索。
- 图像分割:
- 基于颜色信息的图像分割。
运行效果
© 版权声明
转载请注明出处,并标明原文链接。
本网站尊重知识产权,如有侵权,请及时联系我们删除。
本站所有原创内容仅用于学习和交流目的,未经作者和本站授权不得进行商业使用或盈利行为。
本网站尊重知识产权,如有侵权,请及时联系我们删除。
本站所有原创内容仅用于学习和交流目的,未经作者和本站授权不得进行商业使用或盈利行为。
THE END
暂无评论内容