前面已经做过图片亮度、对比度、色偏、过曝、欠曝这些基础图像分析,这次继续做一个和颜色有关的小工具:
图片色彩丰富度分析。
平时看一张图片,我们经常会觉得:
“这张图颜色很艳。”
“这张图有点灰。”
“这个画面颜色很淡。”
这种感觉其实和:
Saturation,饱和度
有很大关系。
所以这次我用华为云码道辅助开发了一个简单的:
OpenCV Image Colorfulness Analyzer
上传图片以后,程序会自动分析 HSV 中的 Saturation 通道,并给出:
Average Saturation
Maximum Saturation
Colorfulness Score
Saturation Level
同时还会绘制一张饱和度直方图。
一、什么是 Saturation?
在 HSV 色彩空间中:
H:Hue,色相
S:Saturation,饱和度
V:Value,亮度
其中 Saturation 可以简单理解成:
颜色到底有多“浓”。
例如:
一张鲜艳的红色图片,Saturation 通常比较高。
而一张接近灰色的图片,即使亮度很高,Saturation 也可能很低。
所以如果想分析:
一张图片整体颜色丰富不丰富
可以从 Saturation 入手。
二、为什么不用 RGB 直接判断?
前面做色偏分析时,使用的是 RGB 三个通道平均值。
那一篇回答的是:
图片整体偏红、偏绿还是偏蓝?
而这一篇关注的是:
颜色到底浓不浓。
例如一张图片可能不偏任何颜色,但整体很灰。
这种情况下:
RGB 三个通道可能比较接近,
但 Saturation 会很低。
所以两个指标的用途不同。
三、这次工具做了哪些功能?
这次项目依然保持轻量,主要包括:
- 上传 JPG / PNG 图片
- 转换到 HSV 色彩空间
- 提取 Saturation 通道
- 计算 Average Saturation
- 计算 Maximum Saturation
- 生成 Colorfulness Score
- 判断 Low / Normal / High Saturation
- 绘制 Saturation Histogram
- 支持下载分析图
整个流程就是:
上传图片
↓
OpenCV 转 HSV
↓
提取 Saturation
↓
计算平均值
↓
判断饱和度等级
↓
生成直方图
四、核心算法其实很简单
先把 OpenCV 读取到的 BGR 图片转换成 HSV:
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)然后取 Saturation 通道:
s = hsv[:, :, 1]接着计算:
avg_saturation = s.mean()max_saturation = s.max()这次为了保持工具简单,
Colorfulness Score 直接使用:
Average Saturation
也就是:
Colorfulness Score = Average Saturation五、这次怎么判断饱和度等级?
当前设置了三个简单区间:
Average Saturation < 60
→Low Saturation
60 ≤ Average Saturation < 140
→Normal Saturation
Average Saturation ≥ 140
→High Saturation
这套阈值主要是为了做直观分类。
它并不是专业图像质量评价标准。
页面里也专门标注了:
Heuristic metric
也就是:
启发式指标。
六、真实测试结果
这次继续使用之前的狗狗公园图片。
最终得到:
Colorfulness Score:
114.31
Average Saturation:
114.31 / 255
Maximum Saturation:
255
Saturation Level:
Normal Saturation
按照当前阈值:
114.31 位于:
60~140
之间。
所以最终被判断为:
Normal Saturation
七、为什么这张图片是 Normal Saturation?
从原图来看,这个结果其实比较符合直觉。
图片里包含:
蓝天
绿色草地
树木
金黄色狗狗毛发
颜色种类很多。
但这些颜色并没有整体达到非常夸张、非常艳丽的程度。
所以:
Average Saturation = 114.31
属于中等范围。
也就是说:
颜色比较丰富,但整体饱和度没有高到“艳得发亮”的程度。
八、Maximum Saturation = 255 是什么意思?
这次页面中还显示:
Maximum Saturation:255
说明图片中至少存在一些像素达到了当前 HSV Saturation 通道的最大值。
也就是:
某些局部区域颜色非常纯、非常饱和。
但这里需要注意:
Maximum Saturation 只能说明:
最饱和的局部像素有多高。
它不能代表整张图片的整体色彩情况。
真正判断整张图时,Average Saturation 更有参考意义。
九、为什么平均值比最大值更重要?
假设一张图片几乎全是灰色,
只有一个很小的红点。
那个红点的 Saturation 可能达到:
255
但整张图片看起来依然不会很鲜艳。
所以:
Maximum Saturation 很容易被少量局部像素影响。
而:
Average Saturation
考虑了整张图片所有像素。
因此更适合用来判断:
整体饱和度水平。
十、Saturation Histogram 能看出什么?
这次页面还绘制了:
Saturation Histogram
横轴是:
0~255
左边:
低饱和度
右边:
高饱和度
从这次结果可以看到,
图片中的 Saturation 并不是集中在某一个非常窄的区间,
而是在中间范围有比较明显的分布。
这也和最终:
Average Saturation = 114.31
比较一致。
十一、Low Saturation 是什么样?
如果图片整体颜色比较灰、比较淡,
那么 Saturation 通道就会偏低。
例如:
雾天
灰色建筑
低饱和滤镜
接近黑白的图片
这些图片可能得到:
Average Saturation < 60
最后判断为:
Low Saturation
视觉上通常会感觉:
颜色不浓,整体比较平。
十二、High Saturation 又是什么样?
如果图片包含大量非常鲜艳的颜色,
例如:
霓虹灯
高饱和海报
艳丽花朵
强烈滤镜
那么 Saturation 可能明显升高。
当:
Average Saturation ≥ 140
就会被当前工具判断为:
High Saturation
这种图片通常会有比较明显的:
鲜艳、浓烈、强色彩感。
十三、Colorfulness 和 Color Bias 有什么区别?
这两个项目虽然都和颜色有关,但关注点完全不同。
前面的 Color Bias Analyzer:
看的是:
哪一个 RGB 通道更强。
回答:
偏红?
偏绿?
偏蓝?
这次的 Colorfulness Analyzer:
看的是:
整体饱和度高不高。
回答:
颜色淡不淡?
颜色浓不浓?
所以:
Color Bias
更关注颜色方向。
Colorfulness
更关注颜色强度。
十四、这个指标有什么局限?
Average Saturation 只是一个很简单的统计指标。
它不能直接代表:
图片质量
色彩准确度
视觉美感
例如:
一张专业的低饱和摄影作品,
Average Saturation 可能很低,
但图片本身依然很好看。
同样:
一张严重过度调色的图片,
Saturation 很高,
也不代表它质量更好。
所以这个工具更适合:
分析颜色强弱
而不是评价:
图片好不好。
十五、可以用在哪里?
这种简单的 Saturation 分析可以用于很多基础场景。
例如:
数据集分析
快速找出:
低饱和图片
高饱和图片
颜色分布异常的样本
图片风格分类
可以辅助判断:
偏灰风格
正常色彩
高饱和风格
图像增强前后比较
例如调整 Saturation 前后,可以比较:
Average Saturation
有没有明显变化。
摄影和设计辅助
也可以快速观察一张图片整体颜色到底有多浓。
总结
这次用华为云码道辅助开发了一个:
OpenCV 图片色彩丰富度分析工具。
核心流程:
上传图片
↓
转换 HSV
↓
提取 Saturation 通道
↓
计算 Average Saturation
↓
计算 Maximum Saturation
↓
生成 Colorfulness Score
↓
判断 Saturation Level
↓
绘制 Saturation Histogram
真实测试结果:
Colorfulness Score:
114.31
Average Saturation:
114.31 / 255
Maximum Saturation:
255
Saturation Level:
Normal Saturation
从原图来看,蓝天、草地和狗狗毛发都提供了比较丰富的颜色,但整体又没有特别夸张,所以最终判断为 Normal Saturation 也比较合理。
前一篇色偏分析回答的是:
图片偏什么颜色?
这一篇则进一步回答:
图片里的颜色到底浓不浓?
下一篇可以继续做一个同样简单、但视觉效果不错的方向:
图片颜色冷还是暖?用华为云码道开发 OpenCV 色温倾向分析工具
通过蓝色和红色通道的相对关系,给出:
Cool / Neutral / Warm
三种简单色温倾向。