前面已经做过 Gamma、CLAHE、直方图均衡化,这次继续处理另一个常见问题:
图片光照不均。
有些图片整体亮度正常,但局部区域明显偏亮或偏暗。相比单纯提高亮度,这次我用华为云码道辅助开发了一个基于 OpenCV 的 Illumination Correction 光照校正工具,先估计低频光照分布,再对亮度通道进行归一化。
1. 这次工具做什么?
主要功能包括:
- 上传 JPG / PNG 图片
- 转换到 LAB 色彩空间
- 使用 Gaussian Blur 估计 Illumination Map
- 调节 Blur Kernel Size
- 调节 Correction Strength
- 显示原图、光照图和校正结果
- 统计平均亮度
- 统计 Brightness Std
- 支持下载 Illumination Map 和结果图
整体流程:
图片
→ LAB
→ L Channel
→ Gaussian Blur
→ Illumination Map
→ Brightness Normalization
→ Corrected Image

2. 什么是 Illumination Map?
一张图片中的亮度可以粗略理解成两部分:
场景本身的细节 + 缓慢变化的光照。
比如阴影、太阳照射、渐变亮度通常属于比较低频的变化。
所以这次使用一个较大的 Gaussian Blur:
illumination = cv2.GaussianBlur( l, (51, 51), 0)
把毛发、草地这些细节模糊掉,只保留整体亮暗趋势。
得到的就是:
Illumination Map。
3. 为什么使用 LAB?
这次先把图片转换为:
lab = cv2.cvtColor( image, cv2.COLOR_BGR2LAB)
然后拆分:
l, a, b = cv2.split(lab)
其中:
- L:亮度
- A / B:颜色信息
我们只对:
L Channel
进行光照校正。
这样可以尽量保留原图的颜色信息,而不是直接修改三个 BGR 通道。
4. 光照校正怎么实现?
核心思路是:
用原始亮度除以估计出的光照分布,再恢复到合适的平均亮度。
可以简化为:
corrected_l = ( l_f / illumination_f) * mean_light
如果某个区域因为光照原因特别亮,除以较大的 illumination 后会被压低。
如果某个区域偏暗,则会得到一定补偿。
最后再把结果限制到:
0~255
范围内。
5. 这次使用了什么参数?
本次实际参数:
- Blur Kernel Size:51 × 51
- Correction Strength:1.00
- 图片尺寸:1650 × 953
51 × 51 属于比较大的模糊核,主要用于提取缓慢变化的低频亮度信息,而不是图像中的细小纹理。
6. 真实测试结果
这次继续使用狗狗公园图片。
处理前:
- Mean Brightness:163.38
- Brightness Std:47.82
处理后:
- Mean Brightness:161.30
- Brightness Std:24.11
可以看到平均亮度基本没有发生特别大的变化,但亮度标准差明显降低。
7. Brightness Std 为什么值得看?
Brightness Std 可以简单表示:
整张图片亮度分布有多分散。
数值越大:
不同区域之间的亮暗差异通常越明显。
这次:
47.82 → 24.11
下降:
23.71
相对减少约:
49.6%
说明经过校正以后,整张图片的亮度分布变得明显更加均匀。
这比单纯观察平均亮度更能反映:
光照不均有没有被减弱。
8. 为什么平均亮度变化很小?
原始平均亮度:
163.38
校正后:
161.30
只下降:
2.08
说明这次算法并不是简单:
"把整张图片变亮"或者"把整张图片变暗"。
它主要做的是:
压低局部过亮区域,同时适当补偿偏暗区域。
所以整体平均值变化不大,而亮度波动明显降低。
这正是光照归一化和 Gamma 调整的区别。
9. 校正也可能过头
从结果图也能看到,经过较强光照归一化以后:
狗狗毛发
草地
树叶
的局部亮暗变化被明显压平。
部分区域会产生比较强的视觉处理感。
因此:
Brightness Std 越低并不代表图片一定越好看。
如果 Blur Kernel 或 Correction Strength 设置不合适,还可能出现:
- 局部细节变平
- 边缘不自然
- 光晕
- 画面失去原本层次
所以页面里也注明:
Normalization cannot recreate missing information.
如果暗部本身已经完全没有细节,光照校正也无法凭空恢复。
10. 总结
这次用华为云码道辅助开发了一个:
OpenCV 光照不均校正工具。
核心流程:
LAB
→ L Channel
→ Large Gaussian Blur
→ Illumination Map
→ Brightness Normalization
→ Corrected Image
本次真实结果:
- Blur Kernel:51 × 51
- Correction Strength:1.00
- Original Brightness Std:47.82
- Corrected Brightness Std:24.11
- Brightness Std 下降约:49.6%
- Original Mean Brightness:163.38
- Corrected Mean Brightness:161.30
结果说明,在平均亮度基本保持稳定的情况下,图片中的低频亮度差异被明显压缩,整体光照分布更加均匀。
这一篇和前面的增强工具区别也比较明显:
Gamma:调整整体亮度曲线
CLAHE:增强局部对比度
Illumination Correction:减弱低频光照不均
下一篇可以继续换一个完全不同的方向: