Sea-thru算法讨论整理
整理日期:2026年8月8日
讨论主题:从数学基础较弱的角度理解Sea-thru的成像模型、指数衰减、后向散射估计、颜色恢复过程,以及距离图的重要性。
论文:Derya Akkaynak and Tali Treibitz, “Sea-Thru: A Method for Removing Water From Underwater Images,” CVPR 2019.
1. Sea-thru解决什么问题
Sea-thru是一种基于水下物理成像模型的颜色恢复方法,不是深度学习网络。
它认为,相机看到的一个水下像素由两部分组成:
I c = D c + B c . I_c=D_c+B_c. Ic=Dc+Bc.
其中:
- (I_c):相机实际记录的像素值;
- (D_c):从物体出发、经过水体衰减后到达相机的直达光;
- (B_c):水中颗粒将光散射进相机产生的后向散射,也就是蓝绿色“水雾”;
- (c):红、绿、蓝三个颜色通道之一。
例如,某个像素的绿色通道为100,其中60来自物体,40来自水体散射,则:
100 = 60 + 40. 100=60+40. 100=60+40.
Sea-thru首先估计并减去水雾,再补偿物体光在水中传播时损失的部分。
2. Sea-thru的核心成像公式
论文使用的主要模型为:
I c = J c e − β c D ( z ) z + B c ∞ ( 1 − e − β c B z ) . I_c= J_c e^{-\beta_c^D(z)z} +B_c^\infty\left(1-e^{-\beta_c^Bz}\right). Ic=Jce−βcD(z)z+Bc∞(1−e−βcBz).
可以将其拆成两部分:
| 公式部分 | 物理含义 | 距离增加时的变化 |
|---|---|---|
| (J_c e{-\beta_cD(z)z}) | 被水体削弱的物体光 | 越来越少 |
| (B_c\infty(1-e{-\beta_c^Bz})) | 水体产生的后向散射 | 越来越多,最终饱和 |
符号含义如下:
- (J_c):假设相机与物体之间没有水时,理论上应当看到的场景信号;
- (z):相机到场景点的视线距离;
- (\beta_c^D(z)):直达物体光的有效衰减系数;
- (\beta_c^B):后向散射随距离增长的有效系数;
- (B_c^\infty):距离足够远时,画面最终趋近的水体背景颜色。
Sea-thru的核心观点之一是:
β c D ≠ β c B \boxed{\beta_c^D\neq\beta_c^B} βcD=βcB
“物体光消失”和“水雾增加”属于不同的光学过程,因此不应该强制共用同一个系数。
3. 公式里的 (e) 是什么
(e) 是一个固定的数学常数:
e ≈ 2.71828. e\approx2.71828. e≈2.71828.
它和圆周率 (\pi) 类似,不是Sea-thru学习出来的参数,也不代表水体能量。
3.1 为什么光衰减要使用指数函数
光在水中传播时,通常不是“每米固定减少10个单位”,而是“每一小段距离损失当前剩余光的一定比例”。
假设每米损失当前光的10%:
- 开始为100;
- 1 m后剩 (100\times0.9=90);
- 2 m后剩 (90\times0.9=81);
- 3 m后剩 (81\times0.9=72.9)。
这种按比例连续减少的过程可表示为:
I ( z ) = I 0 e − β z . I(z)=I_0e^{-\beta z}. I(z)=I0e−βz.
其中,(e^{-\beta z}) 表示光传播后还剩下的比例。
| (\beta z) | (e^{-\beta z})约等于 | 剩余光比例 |
|---|---|---|
| 0 | 1.00 | 100% |
| 0.5 | 0.61 | 61% |
| 1 | 0.37 | 37% |
| 2 | 0.14 | 14% |
| 3 | 0.05 | 5% |
负号表示距离越大,剩余光越少。
恢复时要进行相反的运算:
J = D e + β z . J=D e^{+\beta z}. J=De+βz.
例如:
100 e − 1 ≈ 37 , 100e^{-1}\approx37, 100e−1≈37,
恢复时:
37 e 1 ≈ 100.6. 37e^1\approx100.6. 37e1≈100.6.
因此:
- (e^{-\beta z}):表示水体削弱光;
- (e^{+\beta z}):表示算法尝试补回损失的光。
3.2 小写 (e) 与大写 (E) 的区别
- 小写 (e):数学常数2.71828;
- 大写 (E):论文中通常表示环境照明或光谱。
二者不是同一个概念。
4. 为什么公式中会出现 (\beta_c^D(z)z)
表达式:
β c D ( z ) z \beta_c^D(z)z βcD(z)z
实际表示:
β c D ( z ) × z . \beta_c^D(z)\times z. βcD(z)×z.
两个 (z) 的作用不同。
4.1 括号里的 (z)
β c D ( z ) \beta_c^D(z) βcD(z)
表示衰减系数是距离 (z) 的函数,即不同距离可能对应不同的有效衰减系数。
例如:
- (\beta(1)=0.5);
- (\beta(3)=0.3);
- (\beta(5)=0.2)。
括号表示“把 (z) 输入函数”,不是乘法。
4.2 括号外面的 (z)
后面的 (z) 是光实际传播的距离。
假设:
z = 5 , β ( 5 ) = 0.2 , z=5,\qquad \beta(5)=0.2, z=5,β(5)=0.2,
则:
β ( 5 ) × 5 = 0.2 × 5 = 1 , \beta(5)\times5=0.2\times5=1, β(5)×5=0.2×5=1,
于是:
e − β ( 5 ) × 5 = e − 1 ≈ 0.37. e^{-\beta(5)\times5}=e^{-1}\approx0.37. e−β(5)×5=e−1≈0.37.
这表示物体光传播5 m以后,大约剩下37%。
所以:
e − β c D ( z ) z = e − [ β c D ( z ) × z ] . e^{-\beta_c^D(z)z} =e^{-\left[\beta_c^D(z)\times z\right]}. e−βcD(z)z=e−[βcD(z)×z].
这里不是 (z) 乘了两次,也不是 (z^2)。第一个 (z) 是函数输入,第二个 (z) 才是传播距离。
5. Sea-thru算法的七个步骤
整个算法可以概括为:
- 输入RGB图像和逐像素距离图;
- 把距离划分为10个区间;
- 在每个距离区间选择最暗的1%像素;
- 利用暗像素拟合后向散射 (B(z));
- 从原图中减去后向散射;
- 估计随距离变化的直达光衰减系数 (\beta^D(z));
- 补偿物体光,再进行全局白平衡和RAW显影。
下面通过一个虚构的冷泉灰色岩石案例解释完整过程。
6. 完整数值案例
假设我们有:
- 一张 (1000\times1000) 的水下RGB图像;
- 一张同尺寸的距离图;
- 有效场景距离为1~11 m;
- 某块灰色岩石距离相机5 m;
- 岩石在水下原图中的RGB值为:
I = ( 40 , 90 , 120 ) . I=(40,90,120). I=(40,90,120).
这个像素明显偏蓝绿色。
6.1 输入图像与距离图
RGB图像告诉算法相机看到了什么:
I ( x ) = ( R ( x ) , G ( x ) , B ( x ) ) . I(x)=(R(x),G(x),B(x)). I(x)=(R(x),G(x),B(x)).
距离图告诉算法每个像素对应的物体距离相机多远:
z ( x ) . z(x). z(x).
例如:
| 场景点 | RGB值 | 距离 |
|---|---|---|
| 岩石A | (40, 90, 120) | 5 m |
| 珊瑚B | (70, 110, 130) | 3 m |
| 远处海底C | (20, 80, 130) | 10 m |
同一个蓝绿色像素既可能是近处原本就呈蓝色的物体,也可能是远处红光损失严重的灰色物体。距离信息可以帮助区分这两种情况。
6.2 把距离划分为10段
将1~11 m划分为:
| 区间编号 | 距离范围 |
|---|---|
| 1 | 1~2 m |
| 2 | 2~3 m |
| 3 | 3~4 m |
| 4 | 4~5 m |
| 5 | 5~6 m |
| 6 | 6~7 m |
| 7 | 7~8 m |
| 8 | 8~9 m |
| 9 | 9~10 m |
| 10 | 10~11 m |
分段的目的是在近、中、远距离分别获得水雾样本。如果只在全图选暗像素,样本可能全部集中在某一个距离范围,无法拟合水雾随距离的变化。
“10段”是论文采用的工程参数,不是自然规律。
6.3 每段选择最暗的1%像素
假设1~2 m区间有10万个像素,则选择其中最暗的:
100000 × 1 % = 1000 100000\times1\%=1000 100000×1%=1000
个像素。
其他九个区间同样处理。三个颜色通道应来自同一个空间位置,不能分别在不同位置选择最暗的红、绿、蓝通道。
可能得到如下绿色暗像素趋势:
| 代表距离 | 暗像素绿色值 |
|---|---|
| 1.5 m | 21 |
| 2.5 m | 29 |
| 3.5 m | 35 |
| 4.5 m | 41 |
| 5.5 m | 45 |
| 6.5 m | 48 |
| 7.5 m | 51 |
| 8.5 m | 53 |
| 9.5 m | 54 |
| 10.5 m | 56 |
距离越远,最暗场景点的绿色值仍然越高,这部分增加的亮度很可能主要来自水体后向散射。
6.4 拟合后向散射
如果场景点是完全黑色物体,物体本身的信号接近0,则:
I d a r k ≈ B ( z ) . I_{\mathrm{dark}}\approx B(z). Idark≈B(z).
最简单的后向散射模型为:
B c ( z ) = B c ∞ ( 1 − e − β c B z ) . B_c(z)=B_c^\infty\left(1-e^{-\beta_c^Bz}\right). Bc(z)=Bc∞(1−e−βcBz).
但实际暗像素可能只是深灰色,并非完全不反光。因此Sea-thru加入一个残余直达光项:
B ^ c ( z ) = B c ∞ ( 1 − e − β c B z ) + J c ′ e − β c D ′ z . \hat B_c(z)= B_c^\infty\left(1-e^{-\beta_c^Bz}\right) +J_c'e^{-\beta_c^{D'}z}. B^c(z)=Bc∞(1−e−βcBz)+Jc′e−βcD′z.
其中:
- 第一项是真正的水体后向散射;
- 第二项是暗物体仍然残留的少量物体光。
假设绿色通道拟合得到:
B G ∞ = 60 , β G B = 0.25 , B_G^\infty=60,\qquad \beta_G^B=0.25, BG∞=60,βGB=0.25,
J G ′ = 8 , β G D ′ = 0.8. J_G'=8,\qquad \beta_G^{D'}=0.8. JG′=8,βGD′=0.8.
在5 m处:
B ^ G ( 5 ) = 60 ( 1 − e − 0.25 × 5 ) + 8 e − 0.8 × 5 . \hat B_G(5)=60(1-e^{-0.25\times5})+8e^{-0.8\times5}. B^G(5)=60(1−e−0.25×5)+8e−0.8×5.
第一项约为:
60 ( 1 − e − 1.25 ) ≈ 42.81 , 60(1-e^{-1.25})\approx42.81, 60(1−e−1.25)≈42.81,
残余项约为:
8 e − 4 ≈ 0.15. 8e^{-4}\approx0.15. 8e−4≈0.15.
因此:
B ^ G ( 5 ) ≈ 42.96. \hat B_G(5)\approx42.96. B^G(5)≈42.96.
如果忽略残余物体光,算法可能把深灰色物体自己的亮度也当作水雾,从而高估后向散射,并在减雾时造成过度扣除。
6.5 从原图减去后向散射
对于距离5 m的灰色岩石:
I = ( 40 , 90 , 120 ) . I=(40,90,120). I=(40,90,120).
假设RGB三个通道估计出的后向散射为:
B ( 5 ) = ( 15 , 43 , 64 ) . B(5)=(15,43,64). B(5)=(15,43,64).
直达信号为:
D = I − B . D=I-B. D=I−B.
代入数值:
D = ( 40 , 90 , 120 ) − ( 15 , 43 , 64 ) = ( 25 , 47 , 56 ) . D=(40,90,120)-(15,43,64)=(25,47,56). D=(40,90,120)−(15,43,64)=(25,47,56).
| 通道 | 原图 | 后向散射 | 减雾后 |
|---|---|---|---|
| 红 | 40 | 15 | 25 |
| 绿 | 90 | 43 | 47 |
| 蓝 | 120 | 64 | 56 |
减去水雾后,蓝绿色偏色减轻,但图像可能变暗,因为物体光在传播途中损失的部分还没有补回来。
6.6 估计直达光衰减系数
减掉后向散射后:
D c = J c e − β c D ( z ) z . D_c=J_c e^{-\beta_c^D(z)z}. Dc=Jce−βcD(z)z.
Sea-thru在距离相似的相邻像素中进行迭代局部颜色平均,估计变化较慢的局部照明:
E ^ c ( z ) . \hat E_c(z). E^c(z).
假设在5 m处估计得到:
E ^ ( 5 ) = ( 0.286 , 0.497 , 0.670 ) . \hat E(5)=(0.286,0.497,0.670). E^(5)=(0.286,0.497,0.670).
这意味着:
- 红光剩余约28.6%;
- 绿光剩余约49.7%;
- 蓝光剩余约67.0%。
由:
E = e − β z E=e^{-\beta z} E=e−βz
可得到:
β = − log E z . \beta=-\frac{\log E}{z}. β=−zlogE.
红色通道为:
β R ( 5 ) = − log ( 0.286 ) 5 ≈ 0.25. \beta_R(5)=-\frac{\log(0.286)}{5}\approx0.25. βR(5)=−5log(0.286)≈0.25.
同理可得:
β D ( 5 ) ≈ ( 0.25 , 0.14 , 0.08 ) . \beta^D(5)\approx(0.25,0.14,0.08). βD(5)≈(0.25,0.14,0.08).
红色通道衰减最快,蓝色通道衰减最慢。
由于每个像素计算出来的 (\beta) 都可能含有噪声,Sea-thru使用双指数函数进行约束:
β c D ( z ) = a e b z + c e d z . \beta_c^D(z)=ae^{bz}+ce^{dz}. βcD(z)=aebz+cedz.
算法调整 (a,b,c,d) 四个参数,使衰减曲线预测出来的距离尽量接近真实距离图。
6.7 补偿损失的物体光
恢复公式为:
J c = D c e β c D ( z ) z . J_c=D_c e^{\beta_c^D(z)z}. Jc=DceβcD(z)z.
已知:
D = ( 25 , 47 , 56 ) , D=(25,47,56), D=(25,47,56),
β D ( 5 ) = ( 0.25 , 0.14 , 0.08 ) , z = 5. \beta^D(5)=(0.25,0.14,0.08),\qquad z=5. βD(5)=(0.25,0.14,0.08),z=5.
红色通道:
J R = 25 e 0.25 × 5 ≈ 25 × 3.49 ≈ 87. J_R=25e^{0.25\times5}\approx25\times3.49\approx87. JR=25e0.25×5≈25×3.49≈87.
绿色通道:
J G = 47 e 0.14 × 5 ≈ 47 × 2.01 ≈ 95. J_G=47e^{0.14\times5}\approx47\times2.01\approx95. JG=47e0.14×5≈47×2.01≈95.
蓝色通道:
J B = 56 e 0.08 × 5 ≈ 56 × 1.49 ≈ 84. J_B=56e^{0.08\times5}\approx56\times1.49\approx84. JB=56e0.08×5≈56×1.49≈84.
所以:
J ≈ ( 87 , 95 , 84 ) . J\approx(87,95,84). J≈(87,95,84).
完整变化为:
| 阶段 | RGB值 |
|---|---|
| 水下原图 | (40, 90, 120) |
| 减去后向散射 | (25, 47, 56) |
| 补偿光衰减 | (87, 95, 84) |
6.8 全局白平衡
距离补偿后,整幅图像仍可能存在统一的环境光偏色。
假设全局白点为:
W = ( 0.96 , 1.04 , 0.92 ) . W=(0.96,1.04,0.92). W=(0.96,1.04,0.92).
白平衡可近似写成:
J s = J W . J_s=\frac{J}{W}. Js=WJ.
于是:
J s = ( 87 0.96 , 95 1.04 , 84 0.92 ) ≈ ( 91 , 91 , 91 ) . J_s= \left( \frac{87}{0.96}, \frac{95}{1.04}, \frac{84}{0.92} \right) \approx(91,91,91). Js=(0.9687,1.0495,0.9284)≈(91,91,91).
原来偏蓝绿色的灰色岩石:
( 40 , 90 , 120 ) (40,90,120) (40,90,120)
最终恢复为接近中性灰的:
( 91 , 91 , 91 ) . (91,91,91). (91,91,91).
整个案例可压缩为:
( 40 , 90 , 120 ) → 减水雾 ( 25 , 47 , 56 ) → 补衰减 ( 87 , 95 , 84 ) → 白平衡 ( 91 , 91 , 91 ) \boxed{ (40,90,120) \xrightarrow{\text{减水雾}} (25,47,56) \xrightarrow{\text{补衰减}} (87,95,84) \xrightarrow{\text{白平衡}} (91,91,91) } (40,90,120)减水雾(25,47,56)补衰减(87,95,84)白平衡(91,91,91)
以上数值是为了解释算法而构造的示例,不是原论文某张图像的实测结果。
7. RAW显影的作用
Sea-thru最好在线性RAW数据上处理。恢复物理信号后,还需要经过相机显影流程,例如:
- 黑电平校正;
- 去马赛克;
- 相机颜色矩阵转换;
- 白平衡;
- 亮度与色调映射;
- Gamma校正;
- 转换到sRGB图像。
JPEG和普通压缩视频已经经过白平衡、Gamma、色调映射和压缩,像素值与真实光强不再保持简单的线性关系。因此仍然可以开展增强实验,但物理参数的解释和估计精度会弱于RAW数据。
8. 为什么距离图对颜色恢复至关重要
Sea-thru的恢复公式为:
J c = [ I c − B c ( z ) ] e β c D ( z ) z . J_c=\left[I_c-B_c(z)\right]e^{\beta_c^D(z)z}. Jc=[Ic−Bc(z)]eβcD(z)z.
距离 (z) 同时决定:
- 应该减掉多少后向散射 (B(z));
- 应该补回多少损失的物体光。
假设两个像素都是:
I = ( 40 , 90 , 120 ) . I=(40,90,120). I=(40,90,120).
如果物体距离相机1 m,水体影响较小,它可能本身就是蓝绿色物体;如果距离相机8 m,它原来可能是灰色、棕色甚至红色,只是红光在传播过程中严重损失。
没有距离信息,仅凭最终RGB值无法唯一判断物体的原始颜色。
因此,对Sea-thru这类物理复原方法,可以认为:
逐像素距离图是核心输入。 \boxed{\text{逐像素距离图是核心输入。}} 逐像素距离图是核心输入。
但这不等于所有水下图像增强方法都必须输入距离图。只使用RGB的深度学习方法仍然可以改善白平衡、颜色和对比度,只是其输出更接近数据驱动的颜色推测,物理可解释性通常更弱。
8.1 距离误差会被指数放大
假设红色通道:
β R = 0.25 m − 1 . \beta_R=0.25\ \mathrm{m}^{-1}. βR=0.25 m−1.
真实距离为5 m,却被估计成6 m,多出来1 m的补偿比例为:
e 0.25 × 6 e 0.25 × 5 = e 0.25 ≈ 1.28. \frac{e^{0.25\times6}}{e^{0.25\times5}} =e^{0.25} \approx1.28. e0.25×5e0.25×6=e0.25≈1.28.
也就是说,距离只多估计1 m,红色补偿就可能增加约28%。可能造成:
- 红色过度增强;
- 远处颜色爆炸;
- 噪声被放大;
- 前景和背景颜色不连续;
- 视频中出现颜色闪烁。
所以不仅需要距离图,还需要尽量准确、连续并具有时序稳定性的距离图。
8.2 相机深度与场景距离不是同一个概念
需要区分:
- (d):潜器或相机距离海面的深度,例如1500 m;
- (z):相机到某个冷泉生物或海底结构的距离,例如2 m、5 m或10 m。
Sea-thru真正需要的是每个像素对应的 (z),而不仅是潜器所在的1500 m水深。
9. 对1500 m南海潜器数据的启示
原始Sea-thru方法不能直接无条件应用于这批数据,主要原因包括:
- 原论文使用逐像素米制距离图;当前数据只有照片和视频;
- 1500 m场景主要由潜器人工灯照明,而原论文主要使用自然光;
- 潜器灯存在照明热点、距离衰减和硬阴影;
- 圆形耐压玻璃造成黑角;
- 耐压玻璃折射可能破坏标准针孔相机假设;
- 逐帧独立处理可能导致视频颜色闪烁。
9.1 视频可以用于恢复距离图
虽然没有直接记录深度,但视频仍可能通过以下流程生成距离信息:
- 对水下相机和耐压玻璃系统进行标定;
- 建立圆形有效视场掩膜,排除黑角;
- 从视频中选择重叠充分且存在视差的关键帧;
- 使用SfM恢复相机轨迹和稀疏三维点;
- 使用MVS恢复稠密三维结构;
- 利用潜器导航信息或已知尺寸物体恢复米制尺度;
- 将三维模型投影回视频帧,生成逐像素距离图。
如果相机只是原地旋转、场景缺少纹理、照明变化剧烈或者视频压缩严重,三维重建质量可能明显下降。
9.2 黑角必须提前遮罩
圆形耐压玻璃造成的黑色四角不是水下场景点:
- 没有有效距离;
- 不包含正常的后向散射;
- 几乎一定会进入“最暗1%”;
- 会严重污染后向散射拟合。
因此在暗像素选择前必须建立有效视场掩膜 (M(x)),仅允许真实场景像素参与拟合。
9.3 潜器阴影需要区别对待
完全阴影中的真实水体场景点,可能因为直达光较少而帮助估计后向散射。但是潜器人工灯造成的硬阴影也表明照明高度不均匀,可能破坏Sea-thru对照明平滑变化的假设。
因此不能简单地将所有阴影都当作理想暗像素,应结合:
- 有效场景掩膜;
- 阴影检测;
- 距离信息;
- 人工灯照明模型;
- 视频时序一致性。
9.4 更适合深海人工照明的模型
对于潜器人工灯场景,可以将直达光进一步拆分为:
I c ( x ) = J c ( x ) L c ( x ) T c ( x ) + B c ( x ) , I_c(x)=J_c(x)L_c(x)T_c(x)+B_c(x), Ic(x)=Jc(x)Lc(x)Tc(x)+Bc(x),
其中:
- (J_c(x)):物体自身的反射颜色;
- (L_c(x)):潜器灯在该位置产生的非均匀照明;
- (T_c(x)):水体透射率;
- (B_c(x)):后向散射。
因此,适合这批南海数据的研究方向可以概括为:
Sea-thru物理分解 + 潜器灯光建模 + 有效视场掩膜 + 视频时序一致性 \boxed{ \text{Sea-thru物理分解} +\text{潜器灯光建模} +\text{有效视场掩膜} +\text{视频时序一致性} } Sea-thru物理分解+潜器灯光建模+有效视场掩膜+视频时序一致性
距离图解决“光在水中传播了多远”,灯光模型解决“物体原本受到怎样的照明”,二者不能互相替代。
10. 本次讨论的核心结论
- Sea-thru不是普通的颜色滤镜,而是基于水下成像物理模型的颜色恢复方法。
- 小写 (e) 是数学常数2.71828,用来描述光按比例连续衰减。
- (\beta(z)z) 表示“距离 (z) 处的有效衰减系数乘以传播距离”,不是 (z^2)。
- 后向散射是额外加进相机的光,因此需要从原图中减掉。
- 物体光衰减相当于原始信号被乘小,因此恢复时需要进行指数补偿。
- 暗像素用于估计后向散射,但暗像素并不一定是完全黑色,所以模型加入残余物体光项。
- 对原始Sea-thru而言,逐像素米制距离图是核心输入。
- 距离图误差会被指数补偿放大,尤其容易影响远处物体和红色通道。
- 1500 m潜器人工灯场景不能直接照搬原始Sea-thru的自然光假设。
- 南海数据更适合发展“物理分解、人工灯建模、黑角掩膜与视频一致性”相结合的方法。
11. 相关材料
- Sea-thru CVPR 2019论文页面:https://openaccess.thecvf.com/content_CVPR_2019/html/Akkaynak_Sea-Thru_A_Method_for_Removing_Water_From_Underwater_Images_CVPR_2019_paper.html
- 本地全文精读:
paper.md - 本地原始论文:
source/Sea-thru_CVPR2019.pdf - 翻译与提取说明:
translation_notes.md
2万+



被折叠的 条评论
为什么被折叠?



