🌈 1. 什么是 HSV?
HSV 是一种颜色空间(Color Space),和我们更熟悉的 RGB(红绿蓝)不同,HSV 更接近人类对颜色的感知方式。它由三个分量组成:
- H(Hue,色调):表示颜色的种类,比如红色、绿色、蓝色等。取值范围通常是 0°--360°(在 OpenCV 中常被归一化到 0--180,因为用 8 位图像表示)。
- S(Saturation,饱和度):表示颜色的纯度或鲜艳程度。0 表示灰色,越高越鲜艳。
- V(Value,明度/亮度):表示颜色的明亮程度。0 是黑色,越高越亮。
所以一张彩色图像,在 HSV 空间中,每个像素都有一个 (H, S, V) 的三元组。
📊 2. 什么是直方图(Histogram)?
直方图是一种统计工具,用来表示某个范围内数值出现的频率。
例如:
- 对灰度图像做直方图,就是统计 0~255 每个灰度值出现了多少次。
- 对 RGB 图像,可以分别对 R、G、B 通道做一维直方图。
🧊 3. 那什么是 "3D Histogram"?
因为 HSV 有 三个通道(H, S, V) ,我们可以把这三个维度联合起来,做一个 三维直方图。
想象一个三维网格:
- X 轴是 H(比如分成 10 个区间)
- Y 轴是 S(比如分成 10 个区间)
- Z 轴是 V(比如分成 10 个区间)
那么整个空间就被划分成 10×10×10=1000 个小"箱子"(bins)。
对于图像中的每一个像素,我们看它的 (H, S, V) 值落在哪个"箱子"里,就给那个箱子计数 +1。
最后得到一个长度为 1000 的向量(你可以把它展平成一维),这个向量就叫做 HSV 3D Histogram。
🖼️ 4. 为什么用它来做"全局特征"?
- 全局特征的意思是:用一个固定长度的向量来描述整张图像的整体特性(而不是关注局部细节,比如边缘、角点等)。
- HSV 3D 直方图捕捉了整张图像的颜色分布信息。比如:
- 冰箱(Fridge)可能有很多白色和灰色(低饱和度、高明度)
- 木制桌子(Table)可能有很多棕色(特定 Hue 范围,中等饱和度)
- 虽然它丢失了空间位置信息(比如颜色在哪一块),但它计算简单、对旋转/尺度变化有一定鲁棒性,适合做初步分类。
💡 举个简单例子(用 OpenCV):
python
import cv2
import numpy as np
# 读取图像
img = cv2.imread('chair.jpg')
# 转换到 HSV 空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 计算 3D 直方图:H 分 50 份,S 分 60 份,V 分 60 份(可以根据需要调整)
hist = cv2.calcHist([hsv], [0, 1, 2], None, [50, 60, 60], [0, 180, 0, 256, 0, 256])
# 展平成一维向量(全局特征向量)
feature = hist.flatten() # 长度 = 50*60*60 = 180,000
注意:实际使用时,为了减少维度,通常会降低 bins 数量(比如 [16, 16, 16] → 4096 维),或者做归一化(L1/L2)。
✅ 总结
- HSV 3D Histogram = 在 HSV 颜色空间中,对 H、S、V 三个通道联合统计颜色出现频率的三维直方图。
- 它是一种全局颜色特征,可以作为图像分类的输入特征之一。
- 优点:简单、快速、对光照变化比 RGB 更鲁棒。
- 缺点:没有空间信息,对纹理、形状不敏感。