3. 主观图像质量评估:ITU-R BT.500标准、MOS评分、双刺激法

图像质量好不好,谁说了算?

客观指标能测出信噪比、解析力,但最终看监控画面的还是人眼。我见过不少项目,实验室数据漂漂亮亮,一到现场就被客户吐槽「这画面看着不舒服」。说白了,客观数据是骨架,主观评价才是血肉。

这一章,我们就聊聊怎么用标准化的方法,让「人眼说了算」这件事变得靠谱、可重复。

3.1 为什么需要主观评价?

客观指标有它的局限性。举个例子,一个算法把噪声抹得干干净净,PSNR 可能很高,但画面像塑料一样,细节全丢了。这种「塑料感」,客观指标很难量化。

主观评价的核心价值在于:

  • 捕捉真实体验:人眼对纹理、肤色、运动拖尾的敏感度,是客观指标无法完全模拟的。
  • 发现「隐藏」问题:比如闪烁、色彩跳变、边缘振铃,这些在单帧指标里看不出来。
  • 验证调优方向:算法改了一版,客观指标涨了 0.5 dB,但人眼看是不是真的变好了?主观评价说了算。
我的经验: 有一次我们优化了一版降噪算法,PSNR 提升了 1.2 dB,团队都很兴奋。结果拿给客户看,对方说「人脸像磨皮了一样,不行」。从那以后,我坚持每个大版本都要过一遍主观评估。

3.2 ITU-R BT.500 标准:主观评价的「宪法」

ITU-R BT.500 是国际电信联盟制定的主观图像质量评估标准。它不是什么高深理论,而是一套操作手册——告诉你测试环境怎么搭、人员怎么选、流程怎么走、数据怎么处理。

这套标准的核心要素包括:

要素 要求 说明
观察环境 暗室或半暗室 背景亮度、显示器色温、观看距离都有明确规定
观察者 至少 15 人 包含专家和非专家,视力或矫正视力正常
测试序列 时长 10-30 秒 覆盖典型场景,包含参考序列和测试序列
评分尺度 5 级或 11 级 5 级最常用:5-优秀,4-良好,3-一般,2-较差,1-很差
数据处理 剔除异常值 用 95% 置信区间或标准差筛选无效评分

你可能会问:「为什么环境要求这么严格?」

我举个例子。你在办公室日光灯下看屏幕,和在家暖色台灯下看,对同一张图的色彩感受完全不同。如果不控制环境,不同实验室的结果就没法对比。标准的意义就在于此——让主观评价变得可重复、可比较。

3.3 MOS 评分:把感觉变成数字

MOS(Mean Opinion Score,平均意见分)是主观评价最常用的量化指标。简单说,就是让一群人打分,然后取平均。

但这里有个坑:直接平均是不行的。

注意: 不同人的打分习惯差异很大。有人觉得「还行」就给 4 分,有人觉得「还行」只给 3 分。如果不做归一化,结果会被「手松」或「手紧」的观察者带偏。

正确的做法是:

  1. 收集原始评分:每个观察者对每个测试序列给出 1-5 分。
  2. 计算每个观察者的均值与标准差:了解每个人的打分习惯。
  3. 剔除异常观察者:如果某人的评分与群体均值偏差过大(比如超过 2 个标准差),剔除他的数据。
  4. 计算 MOS 值:对剩余评分取平均。
  5. 计算置信区间:通常报告 95% 置信区间,表示结果的可靠性。

下面是一个典型的 MOS 数据处理流程:

# 伪代码示例:MOS 计算与异常值剔除
scores = load_all_scores()  # 形状: [观察者数, 测试序列数]

# 1. 计算每个观察者的均值
observer_means = mean(scores, axis=1)

# 2. 计算群体均值和标准差
global_mean = mean(observer_means)
global_std = std(observer_means)

# 3. 剔除异常观察者(偏差 > 2σ)
valid_observers = []
for i, m in enumerate(observer_means):
    if abs(m - global_mean) <= 2 * global_std:
        valid_observers.append(i)

# 4. 计算 MOS 和 95% 置信区间
valid_scores = scores[valid_observers, :]
MOS = mean(valid_scores, axis=0)
CI = 1.96 * std(valid_scores, axis=0) / sqrt(len(valid_observers))
关键点: MOS 值不是越高越好,而是越「稳定」越好。如果同一个序列的 MOS 置信区间很宽,说明观察者之间分歧大,这个结果需要谨慎解读。

3.4 双刺激法:让对比更公平

双刺激法(Double Stimulus)是 ITU-R BT.500 中最常用的方法之一。它的核心思想是:让观察者同时或先后看到参考序列和测试序列,然后对比打分。

为什么需要双刺激?

因为人眼的「记忆」很不靠谱。你单独看一张图,觉得还行;但如果你先看一张原图,再看一张处理过的图,差距一下子就出来了。双刺激法就是利用这种对比,让评分更敏感、更准确。

常见的双刺激法有两种:

方法 流程 适用场景
DSIS(双刺激损伤尺度) 先看参考序列,再看测试序列,然后给测试序列打分 评估处理后的图像相对于原图的损伤程度
DSCQS(双刺激连续质量尺度) 参考和测试序列随机交替播放,观察者对两者分别打分 比较两种处理算法的优劣,或评估整体质量差异

我个人更常用 DSCQS。为什么?因为随机交替播放能有效消除「顺序效应」——观察者不会因为先看了哪个序列而产生偏见。

避坑指南: 我曾经做过一次双刺激测试,结果发现所有观察者都给第二个序列打了高分。后来才意识到,测试序列的播放顺序是固定的,观察者「习惯」了画面后,对后面的序列更宽容。从那以后,我坚持用随机顺序,并且每个序列至少播放两次。

3.5 主观评价的完整流程

把上面这些串起来,一个完整的主观评价实验应该这样走:

  1. 准备阶段:搭建标准环境(暗室、校准显示器)、准备测试序列(包含参考和测试)、招募观察者(至少 15 人)。
  2. 培训阶段:给观察者讲解评分尺度,播放几个示例序列让他们熟悉流程。注意,不要透露哪个是参考、哪个是测试。
  3. 正式测试:按双刺激法播放序列,观察者打分。每 20-30 分钟休息一次,避免视觉疲劳。
  4. 数据处理:剔除异常值,计算 MOS 和置信区间。
  5. 结果分析:对比不同算法的 MOS 值,结合置信区间判断差异是否显著。

下面这张图展示了整个流程的结构:

主观图像质量评估流程 准备阶段 环境·序列·人员 培训阶段 评分尺度·示例 正式测试 双刺激法·打分 数据处理 剔除异常·计算MOS 结果分析 对比·置信区间 关键注意事项 • 每个阶段之间要有休息,避免视觉疲劳影响评分 • 测试序列的播放顺序必须随机化 • 观察者之间不能交流,保持独立评分 • 数据处理时,异常值剔除标准要提前确定,不能事后调整

3.6 实战中的常见问题

理论说完了,聊聊我在项目中踩过的坑。

  • 观察者疲劳:一次测试超过 30 分钟,评分质量就会明显下降。我现在的做法是:每 20 分钟强制休息 5 分钟,并且准备一些轻松的背景音乐。
  • 「天花板效应」:如果所有测试序列质量都很高,观察者会倾向于打 4-5 分,导致区分度不够。解决办法是加入一些「锚点」序列——质量明显较差或较好的序列,拉宽评分范围。
  • 序列长度选择:太短(< 5 秒)观察者来不及形成印象;太长(> 30 秒)容易疲劳。我一般用 10-15 秒的片段,刚好能覆盖一个完整的场景变化。
  • 显示器校准:这个经常被忽略。不同显示器的亮度、色温、伽马值差异很大。我建议每次测试前用校色仪校准,至少保证白平衡和亮度一致。
特别提醒: 主观评价不是「一次定生死」。同一个算法,在不同场景、不同光照条件下,主观感受可能完全不同。我建议至少覆盖 3-5 个典型场景(白天、夜晚、逆光、室内、运动),每个场景单独计算 MOS。

3.7 小结

主观图像质量评估,说白了就是「让一群人用标准化的方法看画面,然后打分」。ITU-R BT.500 给了我们操作框架,MOS 把感觉变成数字,双刺激法让对比更公平。

但别忘了,工具只是手段。真正重要的是:你知不知道自己要评估什么?是噪声、色彩、清晰度,还是整体观感?目标不同,测试设计也不同。