老黄实验:基于图像差异的异物入侵检测系统 - 关键技术理论

微信公众号 老黄编程

CSDN 老黄编程

email: wilsonwong@126.com

Copyright © 2026 黄锦威. All rights reserved.


E. 关键技术理论(详细展开)

E.1. 混合高斯模型(MOG2)数学符号详解与公式推导

一、符号含义详解

1.1 主要符号对照表

符号 名称 含义 数据类型 典型值/范围
ItI_tIt 像素值 t时刻的像素值(灰度或彩色) 标量/向量 0-255(灰度)
KKK 高斯分布数量 每个像素建模用的高斯分布个数 整数 3-5
ωi,t\omega_{i,t}ωi,t 权重 第i个高斯分布在t时刻的权重 标量 0<ω<1, ∑ω=1
μi,t\mu_{i,t}μi,t 均值 第i个高斯分布在t时刻的均值 标量/向量 与I_t同范围
σi,t\sigma_{i,t}σi,t 标准差 第i个高斯分布在t时刻的标准差 标量 >0
Σi,t\Sigma_{i,t}Σi,t 协方差矩阵 彩色图像各通道相关性 矩阵 对角占优
DDD 匹配阈值系数 控制匹配检测的宽松程度 标量 2.5
α\alphaα 学习率 控制模型更新速度 标量 0.001-0.01
ρ\rhoρ 学习速率因子 动态学习率 标量 依赖于匹配概率
Mi,tM_{i,t}Mi,t 匹配指示函数 当前像素是否匹配该分布 布尔 0或1
η\etaη 高斯概率密度函数 计算像素属于某分布的概率 函数 -
P(It)P(I_t)P(It) 概率密度 像素值I_t发生的总概率 标量 0~1之间

1.2 下标含义

下标 含义 示例
ttt 时间(帧)索引 μi,t\mu_{i,t}μi,t 表示第i个分布在t时刻的均值
iii 高斯分布索引(1~K) ωi,t\omega_{i,t}ωi,t 表示第i个分布在t时刻的权重

二、高斯分布基础

2.1 一维高斯分布(用于灰度图)

概率密度函数

η(I;μ,σ2)=12πσ2exp⁡(−(I−μ)22σ2)\eta(I; \mu, \sigma^2) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(I - \mu)^2}{2\sigma^2}\right)η(I;μ,σ2)=2πσ2 1exp(2σ2(Iμ)2)

2.2 多维高斯分布(用于彩色图)

η(I;μ,Σ)=1(2π)d/2∣Σ∣1/2exp⁡(−12(I−μ)TΣ−1(I−μ))\eta(\mathbf{I}; \boldsymbol{\mu}, \boldsymbol{\Sigma}) = \frac{1}{(2\pi)^{d/2}|\boldsymbol{\Sigma}|^{1/2}} \exp\left(-\frac{1}{2}(\mathbf{I} - \boldsymbol{\mu})^T \boldsymbol{\Sigma}^{-1} (\mathbf{I} - \boldsymbol{\mu})\right)η(I;μ,Σ)=(2π)d/2Σ1/21exp(21(Iμ)TΣ1(Iμ))

其中:

  • ddd 是维度(RGB图像d=3)
  • ∣Σ∣|\boldsymbol{\Sigma}|Σ 是协方差矩阵的行列式

2.3 计算范例

例1:一维高斯分布计算

假设一个像素在t时刻的灰度值 It=120I_t = 120It=120,某个高斯分布的参数为:

  • μ=115\mu = 115μ=115(均值)
  • σ=10\sigma = 10σ=10(标准差)

第一步:计算标准化差值
z=It−μσ=120−11510=0.5z = \frac{I_t - \mu}{\sigma} = \frac{120 - 115}{10} = 0.5z=σItμ=10120115=0.5

第二步:计算指数项
(It−μ)22σ2=(5)22×100=25200=0.125\frac{(I_t - \mu)^2}{2\sigma^2} = \frac{(5)^2}{2 \times 100} = \frac{25}{200} = 0.1252σ2(Itμ)2=2×100(5)2=20025=0.125

第三步:计算高斯概率密度
η=12π×100×e−0.125=117.7245×0.8825=0.0498\eta = \frac{1}{\sqrt{2\pi \times 100}} \times e^{-0.125} = \frac{1}{17.7245} \times 0.8825 = 0.0498η=2π×100 1×e0.125=17.72451×0.8825=0.0498


三、混合高斯模型公式推导

3.1 基本模型

问题描述:每个像素的历史值可以看作是由K个高斯分布混合生成的。

基本假设:像素值在时间上的变化服从K个高斯分布的加权和。

P(It)=∑i=1Kωi,t⋅η(It;μi,t,Σi,t)P(I_t) = \sum_{i=1}^{K} \omega_{i,t} \cdot \eta(I_t; \mu_{i,t}, \Sigma_{i,t})P(It)=i=1Kωi,tη(It;μi,t,Σi,t)

约束条件
∑i=1Kωi,t=1,ωi,t>0\sum_{i=1}^{K} \omega_{i,t} = 1, \quad \omega_{i,t} > 0i=1Kωi,t=1,ωi,t>0

3.2 计算范例

例2:混合高斯概率计算

假设K=3,参数如下:

i ωi\omega_iωi μi\mu_iμi σi\sigma_iσi
1 0.6 100 15
2 0.3 150 12
3 0.1 80 20

当前像素值 It=120I_t = 120It=120

步骤1:计算每个高斯分布的概率密度

对于分布1:
z=120−10015=1.33z = \frac{120 - 100}{15} = 1.33z=15120100=1.33
η1=12π×225×e−(1.33)2/2=0.0164\eta_1 = \frac{1}{\sqrt{2\pi \times 225}} \times e^{-(1.33)^2/2} = 0.0164η1=2π×225 1×e(1.33)2/2=0.0164

对于分布2:
z=120−15012=−2.5z = \frac{120 - 150}{12} = -2.5z=12120150=2.5
η2=12π×144×e−(2.5)2/2=0.0055\eta_2 = \frac{1}{\sqrt{2\pi \times 144}} \times e^{-(2.5)^2/2} = 0.0055η2=2π×144 1×e(2.5)2/2=0.0055

对于分布3:
z=120−8020=2.0z = \frac{120 - 80}{20} = 2.0z=2012080=2.0
η3=12π×400×e−(2.0)2/2=0.0088\eta_3 = \frac{1}{\sqrt{2\pi \times 400}} \times e^{-(2.0)^2/2} = 0.0088η3=2π×400 1×e(2.0)2/2=0.0088

步骤2:加权求和

P(It)=0.6×0.0164+0.3×0.0055+0.1×0.0088P(I_t) = 0.6 \times 0.0164 + 0.3 \times 0.0055 + 0.1 \times 0.0088P(It)=0.6×0.0164+0.3×0.0055+0.1×0.0088
=0.00984+0.00165+0.00088=0.01237= 0.00984 + 0.00165 + 0.00088 = 0.01237=0.00984+0.00165+0.00088=0.01237

结论:该像素值属于背景的概率约为1.24%


四、参数更新公式推导

4.1 匹配检测

公式
∣It−μi,t−1∣≤D⋅σi,t−1|I_t - \mu_{i,t-1}| \leq D \cdot \sigma_{i,t-1}Itμi,t1Dσi,t1

推导思路:判断当前像素是否在均值的D倍标准差范围内。

计算范例

假设 μ=115,σ=10,D=2.5\mu = 115, \sigma = 10, D = 2.5μ=115,σ=10,D=2.5

匹配范围=[115−2.5×10,115+2.5×10]=[115−25,115+25]=[90,140]\text{匹配范围} = [115 - 2.5 \times 10, 115 + 2.5 \times 10] = [115 - 25, 115 + 25] = [90, 140]匹配范围=[1152.5×10,115+2.5×10]=[11525,115+25]=[90,140]

当前像素 It=120∈[90,140]I_t = 120 \in [90, 140]It=120[90,140] → 匹配 ✅

当前像素 It=85∉[90,140]I_t = 85 \notin [90, 140]It=85/[90,140] → 不匹配 ❌

4.2 权重更新

公式
ωi,t=(1−α)ωi,t−1+αMi,t\omega_{i,t} = (1-\alpha)\omega_{i,t-1} + \alpha M_{i,t}ωi,t=(1α)ωi,t1+αMi,t

情况 Mi,tM_{i,t}Mi,t 更新公式
匹配 1 ωi,t=(1−α)ωi,t−1+α\omega_{i,t} = (1-\alpha)\omega_{i,t-1} + \alphaωi,t=(1α)ωi,t1+α
不匹配 0 ωi,t=(1−α)ωi,t−1\omega_{i,t} = (1-\alpha)\omega_{i,t-1}ωi,t=(1α)ωi,t1

计算范例

假设 α=0.01\alpha = 0.01α=0.01,匹配的分布权重 ωmatch=0.6\omega_{match} = 0.6ωmatch=0.6

ωnew=(1−0.01)×0.6+0.01×1=0.99×0.6+0.01=0.594+0.01=0.604\omega_{new} = (1 - 0.01) \times 0.6 + 0.01 \times 1 = 0.99 \times 0.6 + 0.01 = 0.594 + 0.01 = 0.604ωnew=(10.01)×0.6+0.01×1=0.99×0.6+0.01=0.594+0.01=0.604

权重增加:0.6 → 0.604

对于不匹配的分布权重 ωunmatch=0.3\omega_{unmatch} = 0.3ωunmatch=0.3

ωnew=(1−0.01)×0.3+0.01×0=0.99×0.3=0.297\omega_{new} = (1 - 0.01) \times 0.3 + 0.01 \times 0 = 0.99 \times 0.3 = 0.297ωnew=(10.01)×0.3+0.01×0=0.99×0.3=0.297

权重减少:0.3 → 0.297

4.3 学习速率因子 ρ

公式
ρ=α⋅η(It;μi,t−1,Σi,t−1)\rho = \alpha \cdot \eta(I_t; \mu_{i,t-1}, \Sigma_{i,t-1})ρ=αη(It;μi,t1,Σi,t1)

含义:ρ 同时受全局学习率 α 和当前匹配概率的影响。

计算范例

接续例1结果,η=0.0498,α=0.01\eta = 0.0498, \alpha = 0.01η=0.0498,α=0.01

ρ=0.01×0.0498=0.000498\rho = 0.01 \times 0.0498 = 0.000498ρ=0.01×0.0498=0.000498

理解:ρ 非常小,意味着当前帧对模型的影响很小 → 背景模型稳定更新

4.4 均值更新

公式
μi,t=(1−ρ)μi,t−1+ρIt\mu_{i,t} = (1-\rho)\mu_{i,t-1} + \rho I_tμi,t=(1ρ)μi,t1+ρIt

推导:指数加权移动平均 (EWMA)

μnew=μold+ρ(It−μold)\mu_{new} = \mu_{old} + \rho (I_t - \mu_{old})μnew=μold+ρ(Itμold)

计算范例

μold=115,It=120,ρ=0.0005\mu_{old} = 115, I_t = 120, \rho = 0.0005μold=115,It=120,ρ=0.0005

μnew=115+0.0005×(120−115)=115+0.0005×5=115+0.0025=115.0025\mu_{new} = 115 + 0.0005 \times (120 - 115) = 115 + 0.0005 \times 5 = 115 + 0.0025 = 115.0025μnew=115+0.0005×(120115)=115+0.0005×5=115+0.0025=115.0025

解释:均值几乎不变,因为 ρ 很小,单帧对模型影响微小。

4.5 方差更新

公式
σi,t2=(1−ρ)σi,t−12+ρ(It−μi,t)2\sigma_{i,t}^2 = (1-\rho)\sigma_{i,t-1}^2 + \rho (I_t - \mu_{i,t})^2σi,t2=(1ρ)σi,t12+ρ(Itμi,t)2

推导:方差的 EWMA 更新

计算范例

σold2=100,It=120,μnew=115.0025,ρ=0.0005\sigma^2_{old} = 100, I_t = 120, \mu_{new} = 115.0025, \rho = 0.0005σold2=100,It=120,μnew=115.0025,ρ=0.0005

第一步:计算偏差平方
(It−μnew)2=(120−115.0025)2=(4.9975)2=24.975(I_t - \mu_{new})^2 = (120 - 115.0025)^2 = (4.9975)^2 = 24.975(Itμnew)2=(120115.0025)2=(4.9975)2=24.975

第二步:更新方差
σnew2=(1−0.0005)×100+0.0005×24.975\sigma^2_{new} = (1 - 0.0005) \times 100 + 0.0005 \times 24.975σnew2=(10.0005)×100+0.0005×24.975
=0.9995×100+0.0124875=99.95+0.0125=99.9625= 0.9995 \times 100 + 0.0124875 = 99.95 + 0.0125 = 99.9625=0.9995×100+0.0124875=99.95+0.0125=99.9625

更新幅度:100 → 99.96(变化很小)


五、完整模型更新流程范例

假设条件

  • K = 3(3个高斯分布)
  • α = 0.01
  • D = 2.5
  • 当前像素值 I_t = 120

初始模型参数

i ω μ σ² σ
1 0.6 100 225 15
2 0.3 150 144 12
3 0.1 80 400 20

第一步:匹配检测

分布1

  • 匹配范围:[100−2.5×15,100+2.5×15]=[62.5,137.5][100 - 2.5\times15, 100 + 2.5\times15] = [62.5, 137.5][1002.5×15,100+2.5×15]=[62.5,137.5]
  • I_t = 120 ∈ [62.5, 137.5] → ✅ 匹配

分布2

  • 匹配范围:[150−2.5×12,150+2.5×12]=[120,180][150 - 2.5\times12, 150 + 2.5\times12] = [120, 180][1502.5×12,150+2.5×12]=[120,180]
  • I_t = 120 ∈ [120, 180](边界包含) → ✅ 匹配

分布3

  • 匹配范围:[80−2.5×20,80+2.5×20]=[30,130][80 - 2.5\times20, 80 + 2.5\times20] = [30, 130][802.5×20,80+2.5×20]=[30,130]
  • I_t = 120 ∈ [30, 130] → ✅ 匹配

特殊情况:多个分布同时匹配时,选择最匹配的(通常按 ω/σ 排序后的第一个)

第二步:选择最佳匹配

通常按 ωσ\frac{\omega}{\sigma}σω(权重/标准差的比值)排序

  • 分布1: 0.6/15 = 0.04
  • 分布2: 0.3/12 = 0.025
  • 分布3: 0.1/20 = 0.005

选择分布1为最佳匹配

第三步:更新权重

所有分布权重更新(使用α=0.01)

i M 新权重
1 1 0.6×(1-0.01) + 0.01 = 0.604
2 0 0.3×(1-0.01) + 0 = 0.297
3 0 0.1×(1-0.01) + 0 = 0.099
总和 - 1.000

第四步:计算 η 和 ρ

对于分布1(最佳匹配):

η=12π×225×e−(120−100)22×225\eta = \frac{1}{\sqrt{2\pi \times 225}} \times e^{-\frac{(120-100)^2}{2\times225}}η=2π×225 1×e2×225(120100)2
=137.6×e−400450=0.0266×0.411=0.0109= \frac{1}{37.6} \times e^{-\frac{400}{450}} = 0.0266 \times 0.411 = 0.0109=37.61×e450400=0.0266×0.411=0.0109

ρ=α×η=0.01×0.0109=0.000109\rho = \alpha \times \eta = 0.01 \times 0.0109 = 0.000109ρ=α×η=0.01×0.0109=0.000109

第五步:更新均值(仅分布1)

μ1(new)=(1−0.000109)×100+0.000109×120\mu_1^{(new)} = (1-0.000109) \times 100 + 0.000109 \times 120μ1(new)=(10.000109)×100+0.000109×120
=99.9891+0.0131=100.002= 99.9891 + 0.0131 = 100.002=99.9891+0.0131=100.002

第六步:更新方差(仅分布1)

(It−μnew)2=(120−100.002)2=(19.998)2=399.92(I_t - \mu_{new})^2 = (120 - 100.002)^2 = (19.998)^2 = 399.92(Itμnew)2=(120100.002)2=(19.998)2=399.92

σ12(new)=(1−0.000109)×225+0.000109×399.92\sigma_1^{2(new)} = (1-0.000109) \times 225 + 0.000109 \times 399.92σ12(new)=(10.000109)×225+0.000109×399.92
=224.9755+0.0436=225.019= 224.9755 + 0.0436 = 225.019=224.9755+0.0436=225.019

第七步:背景/前景判断

ωσ\frac{\omega}{\sigma}σω 排序,取前B个分布作为背景模型

通常取 B = 满足 ∑i=1Bωi>T\sum_{i=1}^{B} \omega_i > Ti=1Bωi>T 的最小B,T通常取0.7

当前权重:ω1=0.604, ω2=0.297, ω3=0.099

累加:0.604 < 0.7,再加0.297 = 0.901 > 0.7

因此前2个分布被选为背景模型

如果当前像素匹配的分布在前B个内 → 背景 ✅
否则 → 前景 ❌

此时匹配分布1属于背景 → 该像素判定为背景


六、阴影检测

原理

阴影通常表现为:亮度降低,色度基本不变

RGB空间处理

在RGB空间检测阴影较困难,通常转换到HSV/HSV空间

HSV空间的阴影条件

  1. 色调(H)差异小:∣Ht−Hbg∣<TH|H_t - H_{bg}| < T_HHtHbg<TH
  2. 饱和度(S)差异小:∣St−Sbg∣<TS|S_t - S_{bg}| < T_SStSbg<TS
  3. 亮度(V)明显降低:α<VtVbg<β\alpha < \frac{V_t}{V_{bg}} < \betaα<VbgVt<β

其中 α≈0.2,β≈0.8\alpha \approx 0.2, \beta \approx 0.8α0.2,β0.8

效果

满足上述条件的像素被标记为阴影(通常用灰色表示),不作为前景处理


七、符号总结表

符号 完整名称 类型 单位/范围 一句话解释
ItI_tIt 像素强度 标量/向量 0-255 当前像素值
KKK 混合分量数 整数 3-5 用多少个高斯分布
ωi\omega_iωi 混合权重 标量 0-1 该分布的重要性
μi\mu_iμi 均值 标量/向量 与I_t相同 分布的中心位置
σi\sigma_iσi 标准差 标量 >0 数据的分散程度
Σi\Sigma_iΣi 协方差 矩阵 半正定 多维度相关性
DDD 匹配阈值 标量 2.0-3.5 匹配宽容度
α\alphaα 学习率 标量 0.001-0.01 更新速度
ρ\rhoρ 学习因子 标量 实际更新步长
MiM_iMi 匹配标志 布尔 {0,1} 是否匹配
η\etaη 高斯密度 标量 0~1 概率密度值




E.2. 混合高斯模型(MOG2)中 D、σ 和 Σ 的详细解释

问题:D是什么?σ和Σ有什么不同?

这是一个非常好的问题,涉及到混合高斯模型中的关键符号理解。让我详细解释:


一、符号含义对照表

符号 名称 含义 维度
D 匹配阈值系数 控制匹配检测的宽松程度,通常取2.5~3.5 标量
σ (sigma) 标准差 衡量像素值偏离均值的程度 标量
σ² 方差 标准差的平方,衡量数据离散程度 标量
Σ (Sigma) 协方差矩阵 衡量多维数据各维度之间的相关性 矩阵

二、D 是什么?

D 是匹配阈值系数(Match Threshold Coefficient),用于判断当前像素值是否与某个高斯分布"匹配"。

数学表达式:

∣It−μi,t−1∣≤D⋅σi,t−1|I_t - \mu_{i,t-1}| \leq D \cdot \sigma_{i,t-1}Itμi,t1Dσi,t1

物理意义:

D值 含义 效果
小(D=2.0) 严格匹配 更敏感,更多像素被判为前景
大(D=3.5) 宽松匹配 更宽容,更多像素被判为背景

典型取值:

  • OpenCV MOG2 中 D = 2.5(默认值)
  • 取值范围:2.0 ~ 3.5

直观理解:

假设 μ = 128, σ = 10

D = 2.5 时:匹配范围 = [128 - 2.5×10, 128 + 2.5×10] = [103, 153]
D = 3.0 时:匹配范围 = [128 - 3.0×10, 128 + 3.0×10] = [98, 158]

D值越大 → 匹配范围越宽 → 更多像素被判为背景

三、σ 和 Σ 的区别

这是一个关键概念σ 是标量,Σ 是矩阵

3.1 σ - 标准差(标量)

含义:一维数据中,衡量像素值偏离均值的程度。

对于灰度图像

  • 像素值是单维的 (灰度值 0-255)
  • 每个高斯分布有一个标准差 σ
σ² = 像素值围绕均值 μ 的离散程度

μ = 120, σ = 15 → 大部分像素值在 [105, 135] 范围内

对于灰度图像
P(It)=12πσ2e−(It−μ)22σ2P(I_t) = \frac{1}{\sqrt{2\pi\sigma^2}} e^{-\frac{(I_t - \mu)^2}{2\sigma^2}}P(It)=2πσ2 1e2σ2(Itμ)2

3.2 Σ - 协方差矩阵(矩阵)

含义:在多维数据中,描述各维度之间的相关性

对于彩色图像(RGB三通道)

  • 像素值是3维向量 (R, G, B)
  • 需要协方差矩阵 Σ 来描述三通道之间的关系

Σ=[σr2σrgσrbσgrσg2σgbσbrσbgσb2]\Sigma = \begin{bmatrix} \sigma_r^2 & \sigma_{rg} & \sigma_{rb} \\ \sigma_{gr} & \sigma_g^2 & \sigma_{gb} \\ \sigma_{br} & \sigma_{bg} & \sigma_b^2 \end{bmatrix}Σ= σr2σgrσbrσrgσg2σbgσrbσgbσb2

协方差矩阵的含义

矩阵元素 含义 示例
σr2\sigma_r^2σr2 红色通道的方差 红色值的离散程度
σg2\sigma_g^2σg2 绿色通道的方差 绿色值的离散程度
σb2\sigma_b^2σb2 蓝色通道的方差 蓝色值的离散程度
σrg\sigma_{rg}σrg R与G的协方差 红色与绿色的相关程度
σrb\sigma_{rb}σrb R与B的协方差 红色与蓝色的相关程度
σgb\sigma_{gb}σgb G与B的协方差 绿色与蓝色的相关程度

3.3 为什么MOG2的计算公式使用σ而不是Σ?

MOG2算法在OpenCV实现中,为简化计算,做了以下假设:

假设:颜色通道之间相互独立

这意味着:

  • 协方差矩阵 Σ 是对角矩阵(非对角线元素为0)
  • 只需要计算每个通道的方差 σ²

Σ≈[σr2000σg2000σb2]\Sigma \approx \begin{bmatrix} \sigma_r^2 & 0 & 0 \\ 0 & \sigma_g^2 & 0 \\ 0 & 0 & \sigma_b^2 \end{bmatrix}Σ σr2000σg2000σb2

因此,论文中的通用公式:

η(It;μi,t,Σi,t)\eta(I_t; \mu_{i,t}, \Sigma_{i,t})η(It;μi,t,Σi,t)

在实际实现中简化为:

η(It;μi,t,σi,t)\eta(I_t; \mu_{i,t}, \sigma_{i,t})η(It;μi,t,σi,t)

这就是为什么你在参数更新公式中看到的是 σ 而不是 Σ。


关键区别总结:

┌─────────────────────────────────────────────────────────────────────────┐
│                        关键区别                                          │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│   σ (标准差)     : 一维 → 标量 → 灰度图像使用                               │
│                                                                         │
│   Σ (协方差矩阵) : 多维 → 矩阵 → 彩色图像理论使用                             │
│                                                                         │
│   MOG2实现中采用独立通道假设,因此使用σ替代Σ                                  │
│                                                                         │
│   D (匹配阈值)   : 控制匹配范围 → 参数 ≈ 2.5                                │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

实际意义:

符号 一句话解释
D “有多大差异才算不同?”——匹配的宽容度
σ “数据有多分散?”——一维的离散程度
Σ “RGB三通道之间有多相关?”——多维的相关性




E.3. 混合高斯模型(MOG2)中每个像素的独立模型

问题:640x480灰度图需要维护多少个参数?

答案:是的!每个像素都有自己独立的混合高斯模型。


一、参数数量计算

1.1 基础参数

对于一张 640 × 480 = 307,200 像素的灰度图:

参数 每像素数量 总数量
像素值 ItI_tIt 1个 307,200
高斯分布数 K 1个(通常K=3~5) 307,200
均值 μ\muμ K个 307,200 × K
方差 σ2\sigma^2σ2 K个 307,200 × K
权重 ω\omegaω K个 307,200 × K

1.2 总参数数量

假设 K = 5(实际OpenCV MOG2默认K=5):

总参数=307,200×(1+5+5+5)=307,200×16=4,915,200\text{总参数} = 307,200 \times (1 + 5 + 5 + 5) = 307,200 \times 16 = 4,915,200总参数=307,200×(1+5+5+5)=307,200×16=4,915,200

约 490万个参数!

参数类型 每像素数量 总数量
μ\muμ 5个 1,536,000
σ2\sigma^2σ2 5个 1,536,000
ω\omegaω 5个 1,536,000
其他标志 1个 307,200
合计 16个 ≈ 490万

二、数据结构示意图

┌─────────────────────────────────────────────────────────────────────────────┐
│                         640 × 480 图像网格                                   │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐                      │
│  │像素0  │ │像素1 │ │像素2  │ │像素3  │ │像素4 │ │ ...  │                      │
│  │位置   │ │位置  │ │位置   │ │位置   │ │位置  │ │      │                      │
│  │(0,0) │ │(0,1) │ │(0,2) │ │(0,3) │ │(0,4) │ │      │                      │
│  └──┬───┘ └──┬───┘ └──┬───┘ └──┬───┘ └──┬───┘ └──┬───┘                      │
│     │        │        │        │        │        │                          │
│     ▼        ▼        ▼        ▼        ▼        ▼                          │
│  ┌────────────────────────────────────────────────────────────────────┐     │
│  │              每个像素的混合高斯模型(K=5)                             │     │
│  │  ┌─────────────────────────────────────────────────────────────┐   │     │
│  │  │ 分布1: ω₁, μ₁, σ₁²                                           │  │     │
│  │  │ 分布2: ω₂, μ₂, σ₂²                                           │  │     │
│  │  │ 分布3: ω₃, μ₃, σ₃²                                           │  │     │
│  │  │ 分布4: ω₄, μ₄, σ₄²                                           │  │     │
│  │  │ 分布5: ω₅, μ₅, σ₅²                                           │  │     │
│  │  └─────────────────────────────────────────────────────────────┘   │     │
│  └────────────────────────────────────────────────────────────────────┘     │
│                                                                             │
│  每个像素独立维护自己的5个高斯分布模型                                            │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

三、为什么每个像素需要独立模型?

3.1 不同位置的统计特性不同

像素位置 典型场景 μ(均值) σ²(方差)
天空区域 稳定 高(~200) 小(~10)
草地区域 中等变化 中等(~100) 中等(~50)
水面区域 剧烈变化 不定 大(~200)
阴影边缘 快速切换 两峰值 大(~300)

3.2 实际数据示例

# 以640x480图像为例,不同像素位置的高斯模型参数完全不同

像素(100, 50) - 天空区域:
  μ = [210, 205, 200, 195, 190]  # 偏亮
  σ² = [5, 6, 7, 8, 9]           # 方差小,稳定

像素(320, 240) - 草地/道路交界:
  μ = [120, 115, 110, 50, 45]    # 混合亮暗
  σ² = [50, 55, 60, 80, 85]      # 方差较大

像素(500, 400) - 水面/反光:
  μ = [180, 170, 160, 90, 80]    # 变化大
  σ² = [120, 130, 140, 50, 60]   # 方差很大

四、内存占用计算

4.1 单精度浮点数(float32)

每个参数占4字节:

参数类型 每像素数量 总数量 内存占用
μ\muμ 5个 1,536,000 6.14 MB
σ2\sigma^2σ2 5个 1,536,000 6.14 MB
ω\omegaω 5个 1,536,000 6.14 MB
其他标志 1个 307,200 1.23 MB
合计 16个 4,915,200 ≈ 18.7 MB

4.2 双精度浮点数(float64)

每参数8字节 → 约 37.4 MB

4.3 实际OpenCV MOG2内存

OpenCV MOG2实际使用优化数据结构,额外存储:

  • 背景排序索引
  • 匹配标志
  • 学习计数器
  • 阴影检测标志

实际内存约 25-30 MB(K=5, 640x480)


五、计算复杂度

5.1 每帧每像素的计算量

对于一个像素在所有K个高斯分布上的操作:

操作 复杂度
匹配检测 O(K)
排序查找最匹配 O(K)
权重更新 O(K)
最匹配分布的μ更新 O(1)
最匹配分布的σ²更新 O(1)
背景模型选择 O(KlogK)
总计 约 20-30次浮点运算/像素

5.2 全图总计算量

总运算=307,200×25≈7.68百万次/帧\text{总运算} = 307,200 \times 25 \approx 7.68 \text{百万次/帧}总运算=307,200×257.68百万次/

以30fps计算:
7.68×30≈230百万次/秒7.68 \times 30 \approx 230 \text{百万次/秒}7.68×30230百万次/

这就是为什么MOG2需要实时优化GPU加速的原因!


六、优化策略

6.1 OpenCV MOG2的优化

优化策略 效果 原理
降低K值 K=3替代K=5 减少25%计算量
下采样 先缩小图像 减少像素数量
ROI处理 只处理感兴趣区域 减少无效像素
SIMD指令 SSE/AVX加速 并行处理多个像素

6.2 示例:ROI优化

# 不处理全图,只处理指定区域
roi = (100, 100, 400, 300)  # 只处理12万像素(原图的40%)
# 计算量从7.68M降到3.07M/帧

七、与其他方法对比

方法 每像素参数 内存占用 计算复杂度 适用场景
MOG2 16个 25MB 复杂背景、光照变化
帧差法 1个(前一帧) 0.3MB 极低 简单场景、实时需求
均值背景 2个(μ,σ²) 2.3MB 稳定背景
单高斯模型 2个(μ,σ²) 2.3MB 单模态背景
ViBe 20个样本 7.4MB 运动检测

八、总结

核心结论

┌─────────────────────────────────────────────────────────────────────────────┐
│                            总结                                              │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  1. 是的!640x480灰度图像中,每个像素都有独立的:                                 │
│     - K个高斯分布(μ, σ², ω)                                                 │
│     - 每个像素的参数完全不同                                                    │
│                                                                             │
│  2. 总参数数量:约 490万个(K=5)                                               │
│                                                                             │
│  3. 内存占用:约 25-30 MB(实际OpenCV实现)                                     │
│                                                                             │
│  4. 计算量:≈ 7.68百万次浮点运算/帧(全图)                                      │
│                                                                             │
│  5. 每个像素的模型相互独立,因为不同位置的:                                       │
│     - 光照条件不同                                                            │
│     - 物体运动模式不同                                                         │
│     - 背景纹理不同                                                            │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

记忆口诀

每个像素一个家,K个高斯来当家。
均值方差和权重,五千个像素百万参数。
内存二十多兆,计算百万次每帧。
各像素独立建,位置不同模型变。





E.4. 场景特征提取算法深度详解


一、符号含义对照表

符号 名称 含义 数据类型 取值范围
MMM 图像高度 图像垂直方向的像素数量 整数 ≥1
NNN 图像宽度 图像水平方向的像素数量 整数 ≥1
I(x,y)I(x,y)I(x,y) 像素强度 位置(x,y)(x,y)(x,y)处的灰度值 标量 0~255
LmeanL_{mean}Lmean 平均亮度 全图像素的平均灰度值 标量 0~255
LstdL_{std}Lstd 亮度标准差 像素值偏离平均值的程度 标量 ≥0
∇2I\nabla^2 I2I 拉普拉斯算子 图像的二阶导数,用于边缘检测 标量 -∞~∞
ElapE_{lap}Elap 拉普拉斯能量 图像边缘强度的度量 标量 ≥0
EdgeEdgeEdge 边缘像素集合 Canny算法检测出的边缘像素 集合 -
DedgeD_{edge}Dedge 边缘密度 边缘像素占总像素的比例 标量 0~1
Jc(y)J^c(y)Jc(y) 颜色通道值 位置yyyccc通道的像素值 标量 0~255
Ω(x)\Omega(x)Ω(x) 局部窗口 xxx为中心的局部区域 区域 -
Jdark(x)J^{dark}(x)Jdark(x) 暗通道 局部窗口内RGB通道的最小值 标量 0~255
AAA 大气光值 图像中最亮的像素值 向量 0~255
t(x)t(x)t(x) 透射率 光线穿过雾霾的透射比例 标量 0~1
ω\omegaω 去雾系数 控制去雾强度 标量 0~1

二、亮度特征

2.1 算法原理

亮度特征是最基础的图像统计特征,用于描述图像的整体明暗程度和对比度。

2.1.1 平均亮度 LmeanL_{mean}Lmean

数学定义
Lmean=1MN∑x=1M∑y=1NI(x,y)L_{mean} = \frac{1}{MN}\sum_{x=1}^{M}\sum_{y=1}^{N} I(x,y)Lmean=MN1x=1My=1NI(x,y)

数学含义

  • 这是一个一阶统计量(均值)
  • 反映图像的整体亮度水平
  • 对光照变化敏感

几何解释:可以理解为图像所有像素值的"重心",相当于将图像所有像素值累加后平均。

取值范围

  • Lmean∈[0,255]L_{mean} \in [0, 255]Lmean[0,255]
  • 000:全黑图像
  • 255255255:全白图像
  • 白天场景:Lmean≈150∼200L_{mean} \approx 150 \sim 200Lmean150200
  • 夜晚场景:Lmean≈30∼70L_{mean} \approx 30 \sim 70Lmean3070
2.1.2 亮度标准差 LstdL_{std}Lstd

数学定义
Lstd=1MN∑x=1M∑y=1N(I(x,y)−Lmean)2L_{std} = \sqrt{\frac{1}{MN}\sum_{x=1}^{M}\sum_{y=1}^{N} (I(x,y)-L_{mean})^2}Lstd=MN1x=1My=1N(I(x,y)Lmean)2

数学含义

  • 这是一个二阶统计量(标准差)
  • 反映像素值围绕均值的离散程度
  • 衡量图像的对比度

几何解释:标准差越大,数据分布越分散;标准差越小,数据分布越集中。

取值范围

  • Lstd≥0L_{std} \geq 0Lstd0
  • LstdL_{std}Lstd 越大 → 图像对比度越高
  • LstdL_{std}Lstd 越小 → 图像越平坦

2.2 公式推导

2.2.1 平均亮度推导

离散形式的均值
Iˉ=1n∑i=1nIi\bar{I} = \frac{1}{n}\sum_{i=1}^{n} I_iIˉ=n1i=1nIi

其中 n=M×Nn = M \times Nn=M×N 为总像素数。

矩阵形式的均值
Iˉ=1MN1TI\bar{I} = \frac{1}{MN}\mathbf{1}^T \mathbf{I}Iˉ=MN11TI

其中 1\mathbf{1}1 是全1向量,I\mathbf{I}I 是图像向量化后的向量。

2.2.2 标准差推导

方差定义
σ2=1n∑i=1n(Ii−Iˉ)2=1n∑i=1nIi2−Iˉ2\sigma^2 = \frac{1}{n}\sum_{i=1}^{n} (I_i - \bar{I})^2 = \frac{1}{n}\sum_{i=1}^{n} I_i^2 - \bar{I}^2σ2=n1i=1n(IiIˉ)2=n1i=1nIi2Iˉ2

标准差定义
σ=σ2\sigma = \sqrt{\sigma^2}σ=σ2

等价形式
σ=1n∑i=1nIi2−(1n∑i=1nIi)2\sigma = \sqrt{\frac{1}{n}\sum_{i=1}^{n} I_i^2 - \left(\frac{1}{n}\sum_{i=1}^{n} I_i\right)^2}σ=n1i=1nIi2(n1i=1nIi)2

推导过程

从定义出发:
σ2=1n∑i=1n(Ii−Iˉ)2\sigma^2 = \frac{1}{n}\sum_{i=1}^{n} (I_i - \bar{I})^2σ2=n1i=1n(IiIˉ)2

展开平方项:
σ2=1n∑i=1n(Ii2−2IiIˉ+Iˉ2)\sigma^2 = \frac{1}{n}\sum_{i=1}^{n} (I_i^2 - 2I_i\bar{I} + \bar{I}^2)σ2=n1i=1n(Ii22IiIˉ+Iˉ2)

拆分成三项:
σ2=1n∑i=1nIi2−2Iˉn∑i=1nIi+1n∑i=1nIˉ2\sigma^2 = \frac{1}{n}\sum_{i=1}^{n} I_i^2 - \frac{2\bar{I}}{n}\sum_{i=1}^{n} I_i + \frac{1}{n}\sum_{i=1}^{n} \bar{I}^2σ2=n1i=1nIi2n2Iˉi=1nIi+n1i=1nIˉ2

利用 ∑i=1nIi=nIˉ\sum_{i=1}^{n} I_i = n\bar{I}i=1nIi=nIˉ
σ2=1n∑i=1nIi2−2Iˉ2+Iˉ2\sigma^2 = \frac{1}{n}\sum_{i=1}^{n} I_i^2 - 2\bar{I}^2 + \bar{I}^2σ2=n1i=1nIi22Iˉ2+Iˉ2

化简得:
σ2=1n∑i=1nIi2−Iˉ2\sigma^2 = \frac{1}{n}\sum_{i=1}^{n} I_i^2 - \bar{I}^2σ2=n1i=1nIi2Iˉ2


2.3 计算范例

假设图像尺寸 M=4, N=4(16像素)

原始灰度图像矩阵:

I=[100110120130105115125135110120130140115125135145] I = \begin{bmatrix} 100 & 110 & 120 & 130 \\ 105 & 115 & 125 & 135 \\ 110 & 120 & 130 & 140 \\ 115 & 125 & 135 & 145 \end{bmatrix} I= 100105110115110115120125120125130135130135140145


第一步:计算平均亮度 LmeanL_{mean}Lmean

(1) 计算所有像素的和

逐行求和:

  • 第1行:100+110+120+130=460100 + 110 + 120 + 130 = 460100+110+120+130=460
  • 第2行:105+115+125+135=480105 + 115 + 125 + 135 = 480105+115+125+135=480
  • 第3行:110+120+130+140=500110 + 120 + 130 + 140 = 500110+120+130+140=500
  • 第4行:115+125+135+145=520115 + 125 + 135 + 145 = 520115+125+135+145=520

总和:
S=460+480+500+520=1960S = 460 + 480 + 500 + 520 = 1960S=460+480+500+520=1960

(2) 计算平均亮度

Lmean=SM×N=19604×4=196016=122.5L_{mean} = \frac{S}{M \times N} = \frac{1960}{4 \times 4} = \frac{1960}{16} = 122.5Lmean=M×NS=4×41960=161960=122.5


第二步:计算亮度标准差 LstdL_{std}Lstd

(1) 计算每个像素与均值的偏差 (I(x,y)−Lmean)(I(x,y) - L_{mean})(I(x,y)Lmean)

位置 III I−122.5I - 122.5I122.5 (I−122.5)2(I - 122.5)^2(I122.5)2
(1,1) 100 -22.5 506.25
(1,2) 110 -12.5 156.25
(1,3) 120 -2.5 6.25
(1,4) 130 7.5 56.25
(2,1) 105 -17.5 306.25
(2,2) 115 -7.5 56.25
(2,3) 125 2.5 6.25
(2,4) 135 12.5 156.25
(3,1) 110 -12.5 156.25
(3,2) 120 -2.5 6.25
(3,3) 130 7.5 56.25
(3,4) 140 17.5 306.25
(4,1) 115 -7.5 56.25
(4,2) 125 2.5 6.25
(4,3) 135 12.5 156.25
(4,4) 145 22.5 506.25

(2) 计算偏差平方和

逐行求和:

  • 第1行:506.25+156.25+6.25+56.25=725506.25 + 156.25 + 6.25 + 56.25 = 725506.25+156.25+6.25+56.25=725
  • 第2行:306.25+56.25+6.25+156.25=525306.25 + 56.25 + 6.25 + 156.25 = 525306.25+56.25+6.25+156.25=525
  • 第3行:156.25+6.25+56.25+306.25=525156.25 + 6.25 + 56.25 + 306.25 = 525156.25+6.25+56.25+306.25=525
  • 第4行:56.25+6.25+156.25+506.25=72556.25 + 6.25 + 156.25 + 506.25 = 72556.25+6.25+156.25+506.25=725

总和:
SS=725+525+525+725=2500SS = 725 + 525 + 525 + 725 = 2500SS=725+525+525+725=2500

(3) 计算方差

σ2=SSM×N=250016=156.25\sigma^2 = \frac{SS}{M \times N} = \frac{2500}{16} = 156.25σ2=M×NSS=162500=156.25

(4) 计算标准差

Lstd=σ2=156.25=12.5L_{std} = \sqrt{\sigma^2} = \sqrt{156.25} = 12.5Lstd=σ2 =156.25 =12.5

结果

  • Lmean=122.5L_{mean} = 122.5Lmean=122.5
  • Lstd=12.5L_{std} = 12.5Lstd=12.5

物理意义:图像平均亮度为122.5(中等亮度),标准差12.5表示像素值在均值附近波动,对比度适中。

标准差的百分比表示
相对标准差=LstdLmean×100%=12.5122.5×100%≈10.2%\text{相对标准差} = \frac{L_{std}}{L_{mean}} \times 100\% = \frac{12.5}{122.5} \times 100\% \approx 10.2\%相对标准差=LmeanLstd×100%=122.512.5×100%10.2%


三、纹理特征

3.1 拉普拉斯能量 ElapE_{lap}Elap

3.1.1 算法原理

拉普拉斯算子是一种二阶微分算子,用于检测图像中的边缘和纹理。

连续形式的拉普拉斯算子
∇2I=∂2I∂x2+∂2I∂y2\nabla^2 I = \frac{\partial^2 I}{\partial x^2} + \frac{\partial^2 I}{\partial y^2}2I=x22I+y22I

物理意义

  • 一阶导数:检测边缘的位置
  • 二阶导数:检测边缘的强度(变化率的变化率)

拉普拉斯算子的特性

  1. 各向同性(旋转不变)
  2. 对灰度突变敏感
  3. 对噪声敏感

3.1.2 离散化推导

一阶导数的离散近似(前向差分):
∂I∂x≈I(x+1,y)−I(x,y)\frac{\partial I}{\partial x} \approx I(x+1,y) - I(x,y)xII(x+1,y)I(x,y)

∂I∂y≈I(x,y+1)−I(x,y)\frac{\partial I}{\partial y} \approx I(x,y+1) - I(x,y)yII(x,y+1)I(x,y)

二阶导数的离散近似
∂2I∂x2≈∂∂x(∂I∂x)≈[I(x+1,y)−I(x,y)]−[I(x,y)−I(x−1,y)]\frac{\partial^2 I}{\partial x^2} \approx \frac{\partial}{\partial x}\left(\frac{\partial I}{\partial x}\right) \approx [I(x+1,y) - I(x,y)] - [I(x,y) - I(x-1,y)]x22Ix(xI)[I(x+1,y)I(x,y)][I(x,y)I(x1,y)]

化简得:
∂2I∂x2≈I(x+1,y)+I(x−1,y)−2I(x,y)\frac{\partial^2 I}{\partial x^2} \approx I(x+1,y) + I(x-1,y) - 2I(x,y)x22II(x+1,y)+I(x1,y)2I(x,y)

同理:
∂2I∂y2≈I(x,y+1)+I(x,y−1)−2I(x,y)\frac{\partial^2 I}{\partial y^2} \approx I(x,y+1) + I(x,y-1) - 2I(x,y)y22II(x,y+1)+I(x,y1)2I(x,y)

离散拉普拉斯算子
∇2I≈I(x+1,y)+I(x−1,y)+I(x,y+1)+I(x,y−1)−4I(x,y)\nabla^2 I \approx I(x+1,y) + I(x-1,y) + I(x,y+1) + I(x,y-1) - 4I(x,y)2II(x+1,y)+I(x1,y)+I(x,y+1)+I(x,y1)4I(x,y)

写成卷积核形式(四邻域):

L4=[0101−41010] L_4 = \begin{bmatrix} 0 & 1 & 0 \\ 1 & -4 & 1 \\ 0 & 1 & 0 \end{bmatrix} L4= 010141010

八邻域拉普拉斯核(包含对角线):

L8=[1111−81111] L_8 = \begin{bmatrix} 1 & 1 & 1 \\ 1 & -8 & 1 \\ 1 & 1 & 1 \end{bmatrix} L8= 111181111


3.1.3 拉普拉斯能量定义

Elap=1MN∑x=1M∑y=1N∣∇2I(x,y)∣E_{lap} = \frac{1}{MN}\sum_{x=1}^{M}\sum_{y=1}^{N} |\nabla^2 I(x,y)|Elap=MN1x=1My=1N2I(x,y)

为什么取绝对值

  • 拉普拉斯响应可正可负
  • 绝对值保留边缘强度信息
  • 正负号表示边缘的极性(由暗到亮或由亮到暗)

3.2 边缘密度 DedgeD_{edge}Dedge

3.2.1 Canny边缘检测流程

Canny边缘检测是John F. Canny在1986年提出的多阶段边缘检测算法,被认为是边缘检测的黄金标准。

┌─────────────────────────────────────────────────────────────────┐
│                      Canny边缘检测流程                            │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  ┌─────────┐    ┌─────────┐    ┌─────────┐    ┌─────────┐       │
│  │ 输入     │    │ 高斯    │    │ 梯度     │    │ 非极大   │       │
│  │ 图像     │───→│ 滤波    │───→│ 计算     │───→│ 值抑制   │       │
│  └─────────┘    └─────────┘    └─────────┘    └────┬────┘       │ 
│                                                    │            │
│                                                    ▼            │
│  ┌─────────┐    ┌─────────┐    ┌─────────┐    ┌─────────┐       │
│  │ 输出     │←───│ 边缘    │←───│ 双阈值   │←───│ 滞后     │       │
│  │ 边缘图   │    │ 连接    │    │ 检测     │    │ 阈值     │       │
│  └─────────┘    └─────────┘    └─────────┘    └─────────┘       │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘
3.2.2 步骤1:高斯滤波

高斯核函数:
G(x,y)=12πσ2e−x2+y22σ2G(x,y) = \frac{1}{2\pi\sigma^2} e^{-\frac{x^2+y^2}{2\sigma^2}}G(x,y)=2πσ21e2σ2x2+y2

截断后形成卷积核,例如3×3高斯核(σ=1\sigma=1σ=1):
G3=116[121242121] G_3 = \frac{1}{16}\begin{bmatrix} 1 & 2 & 1 \\ 2 & 4 & 2 \\ 1 & 2 & 1 \end{bmatrix} G3=161 121242121

目的:去除图像中的噪声,避免噪声被误检为边缘。

3.2.3 步骤2:梯度计算(Sobel算子)

Sobel-X算子(检测水平边缘):
Gx=[−101−202−101] G_x = \begin{bmatrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{bmatrix} Gx= 121000121

Sobel-Y算子(检测垂直边缘):
Gy=[−1−2−1000121] G_y = \begin{bmatrix} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \end{bmatrix} Gy= 101202101

梯度幅值
G=Gx2+Gy2G = \sqrt{G_x^2 + G_y^2}G=Gx2+Gy2

梯度方向
θ=arctan⁡(GyGx)\theta = \arctan\left(\frac{G_y}{G_x}\right)θ=arctan(GxGy)

3.2.4 步骤3:非极大值抑制

沿梯度方向比较相邻像素:

  • 如果当前像素的梯度幅值不是局部最大值 → 抑制为0
  • 如果当前像素的梯度幅值是局部最大值 → 保留

数学表达
GNMS(x,y)={G(x,y)if G(x,y) is local max along θ0otherwiseG_{NMS}(x,y) = \begin{cases} G(x,y) & \text{if } G(x,y) \text{ is local max along } \theta \\ 0 & \text{otherwise} \end{cases}GNMS(x,y)={G(x,y)0if G(x,y) is local max along θotherwise

目的:细化边缘,使边缘线变细(单像素宽度)。

3.2.5 步骤4:双阈值检测
  • 高阈值 ThighT_{high}Thigh:确定强边缘
  • 低阈值 TlowT_{low}Tlow:确定弱边缘
强边缘:G > T_high
弱边缘:T_low < G ≤ T_high
非边缘:G ≤ T_low

典型值Thigh≈2×TlowT_{high} \approx 2 \times T_{low}Thigh2×Tlow,例如 Thigh=150,Tlow=50T_{high}=150, T_{low}=50Thigh=150,Tlow=50

3.2.6 步骤5:边缘连接(滞后阈值)

只有与强边缘相连的弱边缘才被保留为最终边缘。

算法

  1. 从强边缘像素开始
  2. 八邻域搜索弱边缘像素
  3. 将相连的弱边缘提升为强边缘
  4. 重复直到没有新像素加入
3.2.7 边缘密度定义

Dedge=∣Edge∣M×ND_{edge} = \frac{|\text{Edge}|}{M \times N}Dedge=M×NEdge

其中 ∣Edge∣|\text{Edge}|Edge 是最终边缘像素的数量。


3.3 计算范例

3.3.1 拉普拉斯能量计算

使用拉普拉斯算子 L4L_4L4,图像尺寸 M=4, N=4

图像矩阵 III

I=[100110120130105115125135110120130140115125135145] I = \begin{bmatrix} 100 & 110 & 120 & 130 \\ 105 & 115 & 125 & 135 \\ 110 & 120 & 130 & 140 \\ 115 & 125 & 135 & 145 \end{bmatrix} I= 100105110115110115120125120125130135130135140145

第一步:理解拉普拉斯卷积计算

对于位置(x,y)(x,y)(x,y),拉普拉斯响应为:
∇2I(x,y)=I(x,y−1)+I(x,y+1)+I(x−1,y)+I(x+1,y)−4I(x,y)\nabla^2 I(x,y) = I(x,y-1) + I(x,y+1) + I(x-1,y) + I(x+1,y) - 4I(x,y)2I(x,y)=I(x,y1)+I(x,y+1)+I(x1,y)+I(x+1,y)4I(x,y)

由于拉普拉斯核需要3×3窗口,边界像素无法计算。我们只能计算内部2×2区域。


计算位置(2,2)(x=2,y=2)(x=2, y=2)(x=2,y=2),像素值 I(2,2)=115I(2,2)=115I(2,2)=115

相关像素(坐标按OpenCV的(row,col)约定):

  • I(2,1)=I(x,y−1)=105I(2,1) = I(x,y-1) = 105I(2,1)=I(x,y1)=105(左)
  • I(2,3)=I(x,y+1)=125I(2,3) = I(x,y+1) = 125I(2,3)=I(x,y+1)=125(右)
  • I(1,2)=I(x−1,y)=110I(1,2) = I(x-1,y) = 110I(1,2)=I(x1,y)=110(上)
  • I(3,2)=I(x+1,y)=120I(3,2) = I(x+1,y) = 120I(3,2)=I(x+1,y)=120(下)

代入公式:
∇2I(2,2)=105+125+110+120−4×115\nabla^2 I(2,2) = 105 + 125 + 110 + 120 - 4 \times 1152I(2,2)=105+125+110+1204×115

=105+125+110+120−460=460−460=0= 105 + 125 + 110 + 120 - 460 = 460 - 460 = 0=105+125+110+120460=460460=0


计算位置(2,3)(x=2,y=3)(x=2, y=3)(x=2,y=3),像素值 I(2,3)=125I(2,3)=125I(2,3)=125

相关像素:

  • I(2,2)=I(x,y−1)=115I(2,2) = I(x,y-1) = 115I(2,2)=I(x,y1)=115(左)
  • I(2,4)=I(x,y+1)=135I(2,4) = I(x,y+1) = 135I(2,4)=I(x,y+1)=135(右)
  • I(1,3)=I(x−1,y)=120I(1,3) = I(x-1,y) = 120I(1,3)=I(x1,y)=120(上)
  • I(3,3)=I(x+1,y)=130I(3,3) = I(x+1,y) = 130I(3,3)=I(x+1,y)=130(下)

∇2I(2,3)=115+135+120+130−4×125\nabla^2 I(2,3) = 115 + 135 + 120 + 130 - 4 \times 1252I(2,3)=115+135+120+1304×125

=115+135+120+130−500=500−500=0= 115 + 135 + 120 + 130 - 500 = 500 - 500 = 0=115+135+120+130500=500500=0


计算位置(3,2)(x=3,y=2)(x=3, y=2)(x=3,y=2),像素值 I(3,2)=120I(3,2)=120I(3,2)=120

相关像素:

  • I(3,1)=I(x,y−1)=110I(3,1) = I(x,y-1) = 110I(3,1)=I(x,y1)=110(左)
  • I(3,3)=I(x,y+1)=130I(3,3) = I(x,y+1) = 130I(3,3)=I(x,y+1)=130(右)
  • I(2,2)=I(x−1,y)=115I(2,2) = I(x-1,y) = 115I(2,2)=I(x1,y)=115(上)
  • I(4,2)=I(x+1,y)=125I(4,2) = I(x+1,y) = 125I(4,2)=I(x+1,y)=125(下)

∇2I(3,2)=110+130+115+125−4×120\nabla^2 I(3,2) = 110 + 130 + 115 + 125 - 4 \times 1202I(3,2)=110+130+115+1254×120

=110+130+115+125−480=480−480=0= 110 + 130 + 115 + 125 - 480 = 480 - 480 = 0=110+130+115+125480=480480=0


计算位置(3,3)(x=3,y=3)(x=3, y=3)(x=3,y=3),像素值 I(3,3)=130I(3,3)=130I(3,3)=130

相关像素:

  • I(3,2)=I(x,y−1)=120I(3,2) = I(x,y-1) = 120I(3,2)=I(x,y1)=120(左)
  • I(3,4)=I(x,y+1)=140I(3,4) = I(x,y+1) = 140I(3,4)=I(x,y+1)=140(右)
  • I(2,3)=I(x−1,y)=125I(2,3) = I(x-1,y) = 125I(2,3)=I(x1,y)=125(上)
  • I(4,3)=I(x+1,y)=135I(4,3) = I(x+1,y) = 135I(4,3)=I(x+1,y)=135(下)

∇2I(3,3)=120+140+125+135−4×130\nabla^2 I(3,3) = 120 + 140 + 125 + 135 - 4 \times 1302I(3,3)=120+140+125+1354×130

=120+140+125+135−520=520−520=0= 120 + 140 + 125 + 135 - 520 = 520 - 520 = 0=120+140+125+135520=520520=0


第二步:计算拉普拉斯能量

由于该图像是严格的线性渐变,所有内部点的拉普拉斯响应都为0!

∑x=14∑y=14∣∇2I(x,y)∣=0+0+0+0+0+0+0+0=0\sum_{x=1}^{4}\sum_{y=1}^{4} |\nabla^2 I(x,y)| = 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 = 0x=14y=142I(x,y)=0+0+0+0+0+0+0+0=0

Elap=016=0E_{lap} = \frac{0}{16} = 0Elap=160=0

验证线性渐变的性质

对于线性函数 I(x,y)=ax+by+cI(x,y) = ax + by + cI(x,y)=ax+by+c

  • 一阶导数为常数:∂I∂x=a,∂I∂y=b\frac{\partial I}{\partial x} = a, \frac{\partial I}{\partial y} = bxI=a,yI=b
  • 二阶导数为0:∂2I∂x2=0,∂2I∂y2=0\frac{\partial^2 I}{\partial x^2} = 0, \frac{\partial^2 I}{\partial y^2} = 0x22I=0,y22I=0
  • 拉普拉斯算子:∇2I=0\nabla^2 I = 02I=0

结论:线性渐变图像没有纹理,拉普拉斯能量为0。


3.3.2 具有纹理的图像范例

为了展示非零的拉普拉斯能量,考虑一个有纹理的图像:

I=[1001001001001005015010010015050100100100100100] I = \begin{bmatrix} 100 & 100 & 100 & 100 \\ 100 & 50 & 150 & 100 \\ 100 & 150 & 50 & 100 \\ 100 & 100 & 100 & 100 \end{bmatrix} I= 1001001001001005015010010015050100100100100100

计算中心区域(2,2)I(2,2)=50I(2,2) = 50I(2,2)=50

相关像素:

  • I(2,1)=100I(2,1) = 100I(2,1)=100
  • I(2,3)=150I(2,3) = 150I(2,3)=150
  • I(1,2)=100I(1,2) = 100I(1,2)=100
  • I(3,2)=150I(3,2) = 150I(3,2)=150

∇2I(2,2)=100+150+100+150−4×50\nabla^2 I(2,2) = 100 + 150 + 100 + 150 - 4 \times 502I(2,2)=100+150+100+1504×50

=100+150+100+150−200=500−200=300= 100 + 150 + 100 + 150 - 200 = 500 - 200 = 300=100+150+100+150200=500200=300

计算位置(2,3)I(2,3)=150I(2,3) = 150I(2,3)=150

相关像素:

  • I(2,2)=50I(2,2) = 50I(2,2)=50
  • I(2,4)=100I(2,4) = 100I(2,4)=100
  • I(1,3)=100I(1,3) = 100I(1,3)=100
  • I(3,3)=50I(3,3) = 50I(3,3)=50

∇2I(2,3)=50+100+100+50−4×150\nabla^2 I(2,3) = 50 + 100 + 100 + 50 - 4 \times 1502I(2,3)=50+100+100+504×150

=50+100+100+50−600=300−600=−300= 50 + 100 + 100 + 50 - 600 = 300 - 600 = -300=50+100+100+50600=300600=300

计算拉普拉斯能量

Elap=∣300∣+∣−300∣16=60016=37.5E_{lap} = \frac{|300| + |-300|}{16} = \frac{600}{16} = 37.5Elap=16∣300∣+300∣=16600=37.5


四、暗通道先验(雾霾检测)

4.1 算法原理

暗通道先验是何恺明等人于2009年提出的去雾算法核心理论,该工作获得了CVPR最佳论文奖。

4.1.1 暗通道先验理论

核心观察:在无雾的自然图像中,至少有一个颜色通道在某些局部区域的值非常低(趋近于0)。

Jdark(x)=min⁡y∈Ω(x)(min⁡c∈{r,g,b}Jc(y))→0J^{dark}(x) = \min_{y \in \Omega(x)} \left( \min_{c \in \{r,g,b\}} J^c(y) \right) \rightarrow 0Jdark(x)=yΩ(x)min(c{r,g,b}minJc(y))0

数学解释

  • min⁡c∈{r,g,b}Jc(y)\min_{c \in \{r,g,b\}} J^c(y)minc{r,g,b}Jc(y):取位置yyy处RGB三通道的最小值
  • min⁡y∈Ω(x)\min_{y \in \Omega(x)}minyΩ(x):取局部窗口Ω(x)\Omega(x)Ω(x)内的最小值
  • 对于无雾图像,这个值接近0

为什么暗通道先验成立

  1. 阴影:物体表面的阴影导致某些通道值很低
  2. 彩色物体:物体本身颜色饱和度高的区域,某些通道值低
  3. 暗色物体:深色物体或暗表面自然值低
4.1.2 雾图成像模型

物理模型(大气散射模型):
I(x)=J(x)⋅t(x)+A⋅(1−t(x))I(x) = J(x) \cdot t(x) + A \cdot (1 - t(x))I(x)=J(x)t(x)+A(1t(x))

各部分的物理意义

  • I(x)I(x)I(x):相机观测到的有雾图像
  • J(x)J(x)J(x):无雾的真实场景图像(目标恢复图像)
  • t(x)t(x)t(x):透射率,表示光线穿过雾霾到达相机的比例
  • AAA:大气光值,表示环境光的颜色和强度

透射率的物理模型(比尔-朗伯定律):
t(x)=e−βd(x)t(x) = e^{-\beta d(x)}t(x)=eβd(x)

其中:

  • β\betaβ:大气散射系数(雾的浓度)
  • d(x)d(x)d(x):场景深度(物体到相机的距离)

模型的分量形式
Ic(x)=Jc(x)⋅t(x)+Ac⋅(1−t(x)),c∈{r,g,b}I^c(x) = J^c(x) \cdot t(x) + A^c \cdot (1 - t(x)), \quad c \in \{r,g,b\}Ic(x)=Jc(x)t(x)+Ac(1t(x)),c{r,g,b}


4.2 公式推导

4.2.1 大气光值 AAA 估计

定义
A=max⁡x(∑cIc(x))A = \max_{x} \left( \sum_{c} I^c(x) \right)A=xmax(cIc(x))

推导思路

  1. 雾图中,大气光导致最亮的像素通常是天空或白色物体
  2. 取RGB三通道和最大的像素作为大气光估计
  3. 实际中常在暗通道前0.1%最亮的像素中取最大值

为什么这样估计

  • 雾图中,远处的物体亮度趋近于大气光
  • 最亮的像素最能代表大气光的颜色
4.2.2 暗通道的有雾图像性质

对雾图成像模型两边取最小值

min⁡y∈Ω(x)(min⁡cIc(y))=min⁡y∈Ω(x)(min⁡c[Jc(y)t(y)+Ac(1−t(y))])\min_{y \in \Omega(x)} \left( \min_{c} I^c(y) \right) = \min_{y \in \Omega(x)} \left( \min_{c} [J^c(y)t(y) + A^c(1 - t(y))] \right)yΩ(x)min(cminIc(y))=yΩ(x)min(cmin[Jc(y)t(y)+Ac(1t(y))])

关键假设:透射率在局部窗口Ω(x)\Omega(x)Ω(x)内是常数,记为t~(x)\tilde{t}(x)t~(x)

min⁡y∈Ω(x)(min⁡cIc(y))=t~(x)⋅min⁡y∈Ω(x)(min⁡cJc(y))+(1−t~(x))⋅min⁡y∈Ω(x)(min⁡cAc)\min_{y \in \Omega(x)} \left( \min_{c} I^c(y) \right) = \tilde{t}(x) \cdot \min_{y \in \Omega(x)} \left( \min_{c} J^c(y) \right) + (1 - \tilde{t}(x)) \cdot \min_{y \in \Omega(x)} \left( \min_{c} A^c \right)yΩ(x)min(cminIc(y))=t~(x)yΩ(x)min(cminJc(y))+(1t~(x))yΩ(x)min(cminAc)

由于AcA^cAc是常数:
min⁡cAc=min⁡(Ar,Ag,Ab)\min_{c} A^c = \min(A^r, A^g, A^b)cminAc=min(Ar,Ag,Ab)

利用暗通道先验
min⁡y∈Ω(x)(min⁡cJc(y))≈0\min_{y \in \Omega(x)} \left( \min_{c} J^c(y) \right) \approx 0yΩ(x)min(cminJc(y))0

代入得:
min⁡y∈Ω(x)(min⁡cIc(y))≈0+(1−t~(x))⋅min⁡cAc\min_{y \in \Omega(x)} \left( \min_{c} I^c(y) \right) \approx 0 + (1 - \tilde{t}(x)) \cdot \min_{c} A^cyΩ(x)min(cminIc(y))0+(1t~(x))cminAc

移项得
t~(x)≈1−min⁡y∈Ω(x)(min⁡cIc(y))min⁡cAc\tilde{t}(x) \approx 1 - \frac{\min_{y \in \Omega(x)} \left( \min_{c} I^c(y) \right)}{\min_{c} A^c}t~(x)1mincAcminyΩ(x)(mincIc(y))


4.2.3 归一化处理(稳定版本)

将图像每个通道除以大气光AcA^cAc

Ic(y)Ac=Jc(y)Ac⋅t(y)+(1−t(y))\frac{I^c(y)}{A^c} = \frac{J^c(y)}{A^c} \cdot t(y) + (1 - t(y))AcIc(y)=AcJc(y)t(y)+(1t(y))

取局部最小值
min⁡y∈Ω(x)(min⁡cIc(y)Ac)=t(x)⋅min⁡y∈Ω(x)(min⁡cJc(y)Ac)+(1−t(x))\min_{y \in \Omega(x)} \left( \min_{c} \frac{I^c(y)}{A^c} \right) = t(x) \cdot \min_{y \in \Omega(x)} \left( \min_{c} \frac{J^c(y)}{A^c} \right) + (1 - t(x))yΩ(x)min(cminAcIc(y))=t(x)yΩ(x)min(cminAcJc(y))+(1t(x))

由于min⁡cJc(y)Ac≈0\min_{c} \frac{J^c(y)}{A^c} \approx 0mincAcJc(y)0(暗通道先验),可得:
min⁡y∈Ω(x)(min⁡cIc(y)Ac)=1−t(x)\min_{y \in \Omega(x)} \left( \min_{c} \frac{I^c(y)}{A^c} \right) = 1 - t(x)yΩ(x)min(cminAcIc(y))=1t(x)

最终透射率公式
t(x)=1−min⁡c(min⁡y∈Ω(x)Ic(y)Ac)t(x) = 1 - \min_{c} \left( \min_{y \in \Omega(x)} \frac{I^c(y)}{A^c} \right)t(x)=1cmin(yΩ(x)minAcIc(y))

加入ω\omegaω参数(保留少量雾,使图像更自然):
t(x)=1−ω⋅min⁡c(min⁡y∈Ω(x)Ic(y)Ac)t(x) = 1 - \omega \cdot \min_{c} \left( \min_{y \in \Omega(x)} \frac{I^c(y)}{A^c} \right)t(x)=1ωcmin(yΩ(x)minAcIc(y))

其中ω=0.95\omega = 0.95ω=0.95通常取0.95。


4.3 计算范例

假设有一张3×3彩色图像(RGB三通道)

原始有雾图像 III

R通道:
IR=[180170160175165155170160150] I_R = \begin{bmatrix} 180 & 170 & 160 \\ 175 & 165 & 155 \\ 170 & 160 & 150 \end{bmatrix} IR= 180175170170165160160155150

G通道:
IG=[160150140155145135150140130] I_G = \begin{bmatrix} 160 & 150 & 140 \\ 155 & 145 & 135 \\ 150 & 140 & 130 \end{bmatrix} IG= 160155150150145140140135130

B通道:
IB=[140130120135125115130120110] I_B = \begin{bmatrix} 140 & 130 & 120 \\ 135 & 125 & 115 \\ 130 & 120 & 110 \end{bmatrix} IB= 140135130130125120120115110

第一步:估计大气光值 AAA

取全图最亮的像素值:

最亮像素位于(1,1):I(1,1)=[180,160,140]I(1,1) = [180, 160, 140]I(1,1)=[180,160,140]

因此:
A=[180,160,140]A = [180, 160, 140]A=[180,160,140]

第二步:计算归一化图像 Ic(y)Ac\frac{I^c(y)}{A^c}AcIc(y)

对于位置(1,1):

  • R:180/180=1.000180/180 = 1.000180/180=1.000
  • G:160/160=1.000160/160 = 1.000160/160=1.000
  • B:140/140=1.000140/140 = 1.000140/140=1.000

对于位置(1,2):

  • R:170/180=0.944170/180 = 0.944170/180=0.944
  • G:150/160=0.938150/160 = 0.938150/160=0.938
  • B:130/140=0.929130/140 = 0.929130/140=0.929

对于位置(3,3):

  • R:150/180=0.833150/180 = 0.833150/180=0.833
  • G:130/160=0.813130/160 = 0.813130/160=0.813
  • B:110/140=0.786110/140 = 0.786110/140=0.786

第三步:计算每个像素的通道最小值

M(x)=min⁡cIc(x)AcM(x) = \min_{c} \frac{I^c(x)}{A^c}M(x)=cminAcIc(x)

位置 R/180 G/160 B/140 min
(1,1) 1.000 1.000 1.000 1.000
(1,2) 0.944 0.938 0.929 0.929
(1,3) 0.889 0.875 0.857 0.857
(2,1) 0.972 0.969 0.964 0.964
(2,2) 0.917 0.906 0.893 0.893
(2,3) 0.861 0.844 0.821 0.821
(3,1) 0.944 0.938 0.929 0.929
(3,2) 0.889 0.875 0.857 0.857
(3,3) 0.833 0.813 0.786 0.786

第四步:应用最小值滤波(窗口大小3×3)

对每个3×3窗口取最小值。对于中心位置(2,2),窗口包含所有9个像素:

min⁡y∈Ω(2,2)M(y)=min⁡(1.000,0.929,0.857,0.964,0.893,0.821,0.929,0.857,0.786)\min_{y \in \Omega(2,2)} M(y) = \min(1.000, 0.929, 0.857, 0.964, 0.893, 0.821, 0.929, 0.857, 0.786)yΩ(2,2)minM(y)=min(1.000,0.929,0.857,0.964,0.893,0.821,0.929,0.857,0.786)

= 0.786

第五步:计算透射率 t(x)t(x)t(x)

ω=0.95\omega = 0.95ω=0.95

t(2,2)=1−0.95×0.786=1−0.7467=0.2533t(2,2) = 1 - 0.95 \times 0.786 = 1 - 0.7467 = 0.2533t(2,2)=10.95×0.786=10.7467=0.2533

结果:透射率约为0.25,表示该区域雾霾较重,只有25%的光线透过。


五、特征计算复杂度分析

特征 时间复杂度 空间复杂度 说明
LmeanL_{mean}Lmean O(MN)O(MN)O(MN) O(1)O(1)O(1) 单次遍历
LstdL_{std}Lstd O(MN)O(MN)O(MN) O(1)O(1)O(1) 两次遍历
ElapE_{lap}Elap O(MN)O(MN)O(MN) O(MN)O(MN)O(MN) 需要卷积
DedgeD_{edge}Dedge O(MNlog⁡(MN))O(MN \log(MN))O(MNlog(MN)) O(MN)O(MN)O(MN) 需要Canny
暗通道 O(MN⋅k2)O(MN \cdot k^2)O(MNk2) O(MN)O(MN)O(MN) 窗口滤波
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐