前面已经做过图片亮度分析和对比度分析,这一篇继续沿着图像质量分析这个方向,做一个更直观的小工具:
图片过曝区域检测。
平时看照片时,经常会遇到这种情况:
天空一片死白、灯光位置完全没有细节、局部区域亮到"糊成一片"。
这种现象通常就和:
Overexposure,过曝
有关。
所以这次我用华为云码道辅助开发了一个简单的:
OpenCV Image Overexposure Detector
上传图片以后,程序会自动寻找接近纯白的高亮像素,统计它们占整张图片的比例,并在原图上用红色半透明区域标出这些位置。
一、这个工具能做什么?
这次功能还是保持简单。
目前支持:
- 上传 JPG / PNG 图片
- 自动检测高亮区域
- 统计 Overexposed Pixel Count
- 计算 Overexposed Ratio
- 判断 Normal / Slight Overexposure / Overexposed
- 在原图上用红色遮罩标记高亮区域
- 显示原图和检测结果
- 支持下载结果图
整个流程就是:
上传图片
↓
转换灰度图
↓
检测接近纯白的像素
↓
统计过曝像素数量
↓
计算占比
↓
判断曝光等级
↓
绘制红色遮罩

二、什么叫"过曝像素"?
一张灰度图片中的像素值范围通常是:
0~255
其中:
0 表示黑色
255 表示白色
如果某些区域的像素已经非常接近:
255
就说明这些地方亮度非常高。
当像素大量聚集在接近纯白的位置时,往往意味着:
高亮细节已经明显减少。
所以这次采用一个很直接的方法:
把灰度值 ≥ 245 的像素作为高亮候选区域。
核心逻辑可以理解成:
gray >= 245
只要超过这个阈值,就记入 Overexposed Pixel Count。
三、为什么阈值不是直接用 255?
如果只统计:
255
会比较严格。
因为真实图片经过:
JPEG 压缩
色彩转换
图像处理
以后,原本已经接近过曝的区域不一定刚好等于 255。
例如:
246
250
253
虽然没有到纯白,但视觉上已经非常亮。
所以这次把阈值设成:
245
相当于把:
245~255
这一段高亮像素都纳入统计。
这样会更容易发现接近"白掉"的区域。
四、过曝比例怎么计算?
只知道有多少个高亮像素还不够。
因为不同图片的尺寸可能完全不同。
例如:
一张图片有 500 个高亮像素
对于 200×200 的图片来说可能不少,
但对于 4K 图片来说几乎可以忽略。
所以还需要计算:
Overexposed Ratio
计算方式:
过曝像素数量
÷
总像素数量
×
100%
这样不同尺寸图片之间也比较容易比较。
五、这次怎么判断曝光等级?
当前工具使用了一个比较简单的规则:
Overexposed Ratio < 1%
→ Normal
1% ≤ Overexposed Ratio < 5%
→ Slight Overexposure
Overexposed Ratio ≥ 5%
→ Overexposed
这套阈值同样属于:
启发式规则。
不是摄影行业统一标准。
它主要是为了让这个小工具能够快速区分:
少量高亮
轻度过曝
明显大面积过曝
六、真实测试结果
这次继续使用前面一直测试的狗狗公园图片。
图片尺寸:
1650 × 953
检测阈值:
245
最终得到:
Overexposed Pixel Count:
889
Overexposed Ratio:
0.06%
Exposure Level:
Normal

从结果来看,这张图片虽然存在少量非常亮的区域,但占整张图的比例非常小。
所以最终被判断为:
Normal
七、为什么 889 个高亮像素还是 Normal?
乍一看:
889 个像素
好像不少。
但这张图片尺寸是:
1650 × 953
总像素数量大约有:
157 万
889 个像素放在整张图里,其实比例很小。
最终计算出来只有:
0.06%
而当前 Normal 阈值是:
低于 1%
所以它距离 Slight Overexposure 还有很大差距。
这也说明:
只看 Pixel Count 很容易误解。
真正更有意义的是:
Overexposed Ratio。
八、红色区域代表什么?
这次页面里还会把检测到的高亮区域直接标在原图上。

可以看到,红色半透明区域只出现在少数非常亮的位置。
例如:
天空局部高光
远处建筑高亮
草地上的强反光点
这些位置就是:
灰度值达到或超过 245 的像素区域。
这样相比只输出:
889
0.06%
更容易直接看出:
到底是哪里亮得比较厉害。
九、为什么不能说"红色区域就是错误曝光"?
这里需要特别注意。
检测到高亮区域,并不等于:
这个地方一定拍坏了。
比如:
太阳
灯泡
反光
白色墙面
天空高亮
本来就有可能接近纯白。
所以当前工具检测的其实是:
Near-white Highlight Regions
也就是:
接近纯白的高亮区域。
它可以帮助判断:
图片是不是存在大量亮部堆积,
但不能单独证明:
拍摄一定过曝。
如果要更专业地判断曝光,还需要结合:
RAW 数据
动态范围
局部纹理
相机参数
场景内容
一起分析。
十、这个工具适合用在哪里?
虽然算法很简单,但还是有不少实际用途。
相机采集检查
连续采集很多图片时,可以快速找出:
高亮区域异常多
的样本。
数据集质量筛选
如果某批训练图片里存在大量:
天空全白
灯光溢出
曝光异常
可以先通过 Overexposed Ratio 做一次简单筛选。
图像处理前后对比
例如做曝光调整之前和之后,
可以比较:
Overexposed Ratio
是否发生明显变化。
摄影辅助分析
虽然不能替代专业曝光工具,但可以快速查看:
高亮区域主要集中在哪里。
十一、这和上一篇亮度分析有什么区别?
上一篇做的是:
Average Brightness
它回答:
整张图片平均有多亮?
这一篇做的是:
Overexposed Ratio
它回答:
图片中有多少像素已经接近纯白?
这两个概念不是一回事。
一张图片平均亮度可能正常,
但局部仍然可能存在:
高光溢出。
反过来,一张整体很亮的图片,也不一定有大面积像素达到:
245~255。
所以:
Brightness
更偏整体亮度,
Overexposure
更偏:
高亮极端区域。
十二、这次依然保持轻量
最近这些项目我还是保持同一个思路:
一个小工具解决一个具体问题。
这次仍然只使用:
Python
OpenCV
FastAPI
原生 HTML / CSS / JavaScript
核心算法也很直接:
灰度化
阈值判断
像素统计
Overlay
不需要深度学习,也不需要复杂模型。
但做成可视化网页以后,效果就很直观。
总结
这次用华为云码道辅助开发了一个:
OpenCV 图片过曝区域检测工具。
核心流程:
上传图片
↓
转换灰度图
↓
检测 Gray ≥ 245
↓
统计 Overexposed Pixel Count
↓
计算 Overexposed Ratio
↓
判断 Exposure Level
↓
红色遮罩标记高亮区域
这次真实测试结果:
图片尺寸:
1650 × 953
Threshold:
245
Overexposed Pixel Count:
889
Overexposed Ratio:
0.06%
Exposure Level:
Normal
最终结果说明,这张图片虽然存在少量接近纯白的区域,但面积非常小,没有达到明显过曝的程度。
前面几篇分别回答了:
图片有多亮?
图片对比度够不够?
图片整体偏什么颜色?
这一篇则回答:
图片里到底有没有明显过曝区域?
下一篇可以继续做一个同样简单、而且和这篇正好对应的方向:
图片是不是太暗了?用华为云码道开发 OpenCV 欠曝区域检测工具
逻辑正好反过来:
统计接近 0 的暗像素比例,并把欠曝区域直接标出来。