一、完美反射法概述
1.完美反射法的别名为white-patch白斑法,也成为白点法,也成为Max-RGB法
2.完美反射法有三个名字:white-patch法,完美反射法/白点法,Max-RGB法,其实都是一个算法的三种叫法
3.涉及到Retinex理论,图像形成模型,理想反射体假设,光源估计,Von Kries校正
4.底层数学原理和物理假设
5.完美反射体,朗伯体,反射率,光源光谱,传感器响应。
6.完美反射法基于“场景中存在一个完美反射面(镜面或白点),其反射率在所有波长上为1”
7.完美反射法本质是寻找场景中反射率最大的像素,将其颜色视为光源颜色,通过通道增益实现白平衡。
8.完美反射法(Perfect Reflector / White Patch / Max-RGB)是同一算法的不同名称
9.底层原理建立在 Retinex 理论和理想反射体假设上
10.灰度世界是平均反射率假设,完美反射法是最大反射率假设,二者是 Shades-of-Gray 的两个极端(p=∞ 和 p=1)。
二、完美反射法分析
1.完美反射法要求场景中存在一个对所有波长都完全反射的理想白点,这个点反射了光源的全部颜色,因此它的RGB值就是光源的颜色;
2.白色 & 黑色
白色物体对可见光几乎全部反射,所以看起来是白色。
黑色物体则几乎吸收所有可见光,所以看起来是黑色。
实际衣服不是“绝对白”,会吸收少量光,但反射比例远大于吸收。
三、计算方法
Target_gray的三种方式
方式一:Target_gray = Max(R,G,B)
方式二:Target_gray = 255,针对8bit深度的图像
方式三:Target_gray = G_max
伪代码:
function PerfectReflector(I, percentile=99.9, T_mode='max'):
I_float = float(I)
L_R = percentile(I_float[:,:,0], percentile)
L_G = percentile(I_float[:,:,1], percentile)
L_B = percentile(I_float[:,:,2], percentile)
if T_mode == 'max':
T = max(L_R, L_G, L_B)
elif T_mode == '255':
T = 255
elif T_mode == 'green':
T = L_G
g_R = T / L_R
g_G = T / L_G
g_B = T / L_B
out[:,:,0] = I_float[:,:,0] * g_R
out[:,:,1] = I_float[:,:,1] * g_G
out[:,:,2] = I_float[:,:,2] * g_B
out = clip(out, 0, 255)
return uint8(out)
四、完美反射法的有效区间和局限性
1.完美反射法的依赖条件或者假设条件
场景中又白色物体,这种算法效果才好;
如果场景不存在白色物体,或者没有反射率接近1的像素,最大值只能反映最亮物体的颜色,会低估光源强度,导致校正不足。
2.不同通道的最大值来自不同物体,这个会造成颜色校正错误
例如红色物体在 R 通道最大,蓝色物体在 B 通道最大,导致光源估计颜色错误。
3.噪声与坏点:单个噪声像素可能成为最大值,产生严重色偏。
噪声和坏点会影响完美反射法,会导致算法失效。
4.过曝饱和:如果完美反射体过曝,像素值被截断,无法反映真实光源强度。
5.大面积单色场景:如红色墙壁,R 通道最大值远大于其他通道,导致严重偏色。
6.多光源场景:不同区域光源不同,全局最大值无法代表局部光源。
五、算法改进
1.高百分位完美反射法:用 99% 或 99.9% 分位数代替最大值,抑制噪声和坏点。
2.块状完美反射法:将图像分块,每块取最大值,再对这些值取中位数或投票,得到更稳健的光源估计。
3.阈值完美反射法:只考虑亮度高于某阈值的像素,在这些像素中计算通道平均值作为光源估计。
4.对数域完美反射法:在 log 域计算,结果与直接取最大值等价,但便于结合其他 Retinex 方法。
5.多尺度完美反射法:结合不同尺度下的白点估计,提高对复杂场景的适应性。
6.与灰度世界混合:根据场景内容动态选择完美反射法或灰度世界。例如当图像中存在明显白色区域时使用完美反射法。
网硕互联帮助中心




评论前必须登录!
注册