【论文精读系列】之《Turbulence-Induced 2D Correlated Image Distortion》其二

论文地址:《Turbulence-Induced 2D Correlated Image Distortion》

3 Background(背景)

3.1 Turbulence and Variance(湍流和方差)

3D湍流的特点是在一定范围内具有独立的流体涡流。一个涡流在最大(外部)空间尺度 L 0 L_0 L0 处分解为较小的涡流,而较小的涡流类似上述过程进一步减小。这个过程一直持续到最小的涡流达到湍流的内尺度 l 0 l_0 l0 。惯性范围由 [ L 0 , l 0 ] [L_0,l_0] [L0,l0] 定义。在那里,动能被转移到尺度越来越小的漩涡中。在 l 0 l_0 l0 以下,流体运动中的能量完全消散为热量。湍流的外部尺度通常被建模为 L 0 = 0.4 h L_0=0.4h L0=0.4h ,其中 h h h 是地面以上的高度。
湍流伴随着压力和温度的波动,这会影响介质的折射率。在统计上均匀且局部各向同性的湍流中,折射波动的特征用折射率结构常数 C n 2 C_n^2 Cn2 刻画,它表示湍流强度,且以 m − 2 / 3 m^{-2/3} m2/3 为单位进行测量。 C n 2 C_n^2 Cn2 的值越大表示湍流越强烈,而 C n 2 = 0 C_n^2=0 Cn2=0 表示没有湍流的介质。在空气中, C n 2 C_n^2 Cn2 的范围一般在 1 0 − 17 − 1 0 − 13 m − 2 / 3 10^{-17}-10^{-13}m^{-2/3} 10171013m2/3 ,夏季的白天这个值一般在 8 × 1 0 − 13 m − 2 / 3 8\times10^{-13}m^{-2/3} 8×1013m2/3 的高值。由于湍流强度取决于环境,因此通常 C n 2 C_n^2 Cn2 会在成像路径上变化,特别易受低海拔地区的高压和高海拔地区的强风的影响,这两者都会影响天文望远镜的放置和性能。在本文中,我们将重点放在水平视图上,这是远距离观测等应用中的典型视图。
焦距为 f f f 的相机在距离 L L L 处观察到一个物点 o o o 。在没有湍流的情况下,视线由单位矢量 o {\boldsymbol o} o 表示。如图2所示,由于折射率波动,湍流导致从物点发出的光线发生随机折射。因此,此光线以随机到达角( A A AA AA)到达相机,该角度是围绕 o {\boldsymbol o} o 方向的扰动。 A A AA AA 扰动会扭曲 o o o 在像平面的投影。

(图2:在没有湍流的情况下,到达目标点 o o o 的视线是 o {\boldsymbol o} o ,然后将该点投影到 p {\boldsymbol p} p 上。这里 L L L 是路径长度, f f f 是焦距, D D D 是透镜孔径直径。湍流介质中的随机折射产生一个到达角( A A AA AA)扰动,导致 p + e ( p ) {\boldsymbol p}+{\boldsymbol e}({\boldsymbol p}) p+e(p) 的畸变投影)

球形光的波前的 A A AA AA 方差为: σ A A 2 = γ ( q ) C n 2 L D − 1 / 3 (1) \sigma_{AA}^2=\gamma(q)C_n^2LD^{-1/3} \tag{1} σAA2=γ(q)Cn2LD1/3(1) 其中 D D D 是相机镜头的直径, q q q 是菲涅尔数: q = D λ L (2) q=\frac{D}{\sqrt{\lambda L}} \tag{2} q=λL D(2) 其中 λ \lambda λ 是光线的波长。球面波的系数 γ ( q ) \gamma(q) γ(q) 为: γ ( q ) = 3 16 Γ ( 1 6 ) Γ ( 8 3 ) ( 2 β ) 1 3 [ 1 + 6 17 8 3 ⋅ R e { ( − π ( β q ) 2 2 j ) 1 6 [ 2 F 1 ( 1 6 , 17 6 ; 23 6 ; 1 + π ( β q ) 2 2 j ) ] } ] (3) \gamma(q)=\frac{\sqrt{3}}{16}\Gamma(\frac{1}{6})\Gamma(\frac{8}{3})(\frac{2}{\beta})^{\frac{1}{3}}[1+\frac{6}{17}\frac{8}{3}\cdot Re\{(-\frac{\pi(\beta q)^2}{2j})^\frac{1}{6}[_2F_1(\frac{1}{6},\frac{17}{6};\frac{23}{6};1+\frac{\pi(\beta q)^2}{2j})]\}] \tag{3} γ(q)=163 Γ(61)Γ(38)(β2)31[1+17638Re{(2jπ(βq)2)61[2F1(61,617;623;1+2jπ(βq)2)]}](3) 其中 β = 0.5216 \beta=0.5216 β=0.5216 且: Γ ( μ ) = ∫ 0 ∞ τ μ − 1 e − τ d τ (4) \Gamma(\mu)=\int_0^{\infty}\tau^{\mu-1}e^{-\tau}d\tau \tag{4} Γ(μ)=0τμ1eτdτ(4) 是Gamma函数。在公式(3)中, 2 F 1 ( ) _2F_1() 2F1() 是超几何函数: 2 F 1 ( a , d ; c ; ζ ) = ∑ m = 0 ∞ ( a ) m ( d ) m ( c ) m ζ m m ! (5) _2F_1(a,d;c;\zeta)=\sum_{m=0}^{\infty}\frac{(a)_m(d)_m}{(c)_m}\frac{\zeta^m}{m!} \tag{5} 2F1(a,d;c;ζ)=m=0(c)m(a)m(d)mm!ζm(5) 对于 q ≫ 1 q\gg 1 q1 ,公式(3)可以简化为: γ ( q ) ≈ 1.09 (6) \gamma(q)\approx1.09 \tag{6} γ(q)1.09(6)

3.2 Pair-wise Distortion Correlation(成对失真的相关性)

(图3:在没有湍流的情况下,到达两目标点 o o o o ′ o' o 的视线分别是 o {\boldsymbol o} o o ′ {\boldsymbol o'} o ,然后分别投影到 p {\boldsymbol p} p p + v {\boldsymbol p}+{\boldsymbol v} p+v

现在,考虑两个物点 o o o o ′ o' o 。在没有湍流的情况下,它们对应的视线由来自相机投影中心的单位向量 o {\boldsymbol o} o o ′ {\boldsymbol o'} o 定义,如图3所示。这两条线形成一个平面 Π = o × o ′ {\boldsymbol \Pi}={\boldsymbol o}\times{\boldsymbol o'} Π=o×o 。两线之间的夹角为: θ = a r c c o s ( o ⋅ o ′ ) (7) \theta=arccos({\boldsymbol o}\cdot{\boldsymbol o'}) \tag{7} θ=arccos(oo)(7) 湍流引起的随机折射扰动,会导致这些视线中的每条视线相应地偏离到达角 A A ( o ) AA(o) AA(o) A A ( o ′ ) AA(o') AA(o) A A ( o ) AA(o) AA(o) A A ( o ′ ) AA(o') AA(o) 之间存在相关性,且相关函数为: b ( θ ) = C o v [ A A ( o ) , A A ( o ′ ) ] σ A A 2 (8) b(\theta)=\frac{Cov[AA(o),AA(o')]}{\sigma_{AA}^2} \tag{8} b(θ)=σAA2Cov[AA(o),AA(o)](8) 其中Cov是协方差运算。该相关性通常随着 θ \theta θ 的增大而减小。此外,相关性取决于 A A AA AA 相对于 Π {\boldsymbol \Pi} Π 的方向。假设一个 A A AA AA 扰动在 Π {\boldsymbol \Pi} Π 平面内,该平面包括 o {\boldsymbol o} o o ′ {\boldsymbol o'} o ,那么这个扰动被称为平行的,用 ∥ \parallel 表示。如果 A A AA AA 扰动垂直于该平面,则表示为 ⊥ \bot 。一般来说,在 o o o 处的 A A AA AA 扰动既有平行分量,也有垂直分量。
注意,对于固定的 o o o ∥ \parallel ⊥ \bot 轴和分量是根据另一个点 o ′ o' o 来定义的。由于物点 o o o 在不同的相对方向上与大量其它 W W W 个点共存,因此对于任何特定 o o o 都有 ∥ \parallel ⊥ \bot O ( W ) \mathcal{O}(W) O(W) 定义。因此,我们处理一个非平凡的领域。
现在,让我们返回到分析两个特定的对象点 o o o o ′ o' o 。使用以下无量纲变量。从物体的角度来看,光圈的角度大小为: θ D = D L (9) \theta_D=\frac{D}{L} \tag{9} θD=LD(9) 物体间的视角可以标准化为: η = θ θ D (10) \eta=\frac{\theta}{\theta_D} \tag{10} η=θDθ(10) 湍流的外部尺度可以标准化为: ρ = L 0 D (11) \rho=\frac{L_0}{D} \tag{11} ρ=DL0(11) 对于无量纲参数 0 ≤ ξ ≤ 1 0\leq\xi\leq 1 0ξ1 ,定义函数: Q ( ξ ) = ( 1 − ξ ) 5 / 3 , M η = 2 η ξ ( 1 − ξ ) (12) Q(\xi)=(1-\xi)^{5/3},M_{\eta}=2\eta\xi(1-\xi) \tag{12} Q(ξ)=(1ξ)5/3,Mη=2ηξ(1ξ)(12) 这两个分量的相关函数是: b ∥ , ⊥ ( η ) = ∫ 0 1 { ∫ 0 ∞ H ( κ ) [ J 0 ( M η κ ) ∓ J 2 ( M η κ ) ] d κ } C n 2 ( L ξ ) Q ( ξ ) d ξ ∫ 0 1 { ∫ 0 ∞ H ( κ ) d κ } C n 2 ( L ξ ) Q ( ξ ) d ξ (13) b_{\parallel,\bot}(\eta)=\frac{\int_0^1\{\int_0^{\infty}H(\kappa)[J_0(M_{\eta}\kappa)\mp J_2(M_{\eta}\kappa)]d\kappa\}C_n^2(L\xi)Q(\xi)d\xi}{\int_0^1\{\int_0^{\infty}H(\kappa)d\kappa\}C_n^2(L\xi)Q(\xi)d\xi} \tag{13} b,(η)=01{0H(κ)dκ}Cn2(Lξ)Q(ξ)dξ01{0H(κ)[J0(Mηκ)J2(Mηκ)]dκ}Cn2(Lξ)Q(ξ)dξ(13) 其中 κ \kappa κ 是一个包含在非负实数中的无量纲积分变量, J 0 J_0 J0 J 2 J_2 J2 是第一类贝塞尔函数,且: H ( κ ) = [ ( 2 ρ κ ) 2 + 1 ] − 11 / 6 J 2 2 ( κ ) κ (14) H(\kappa)=\frac{[(2\rho\kappa)^2+1]^{-11/6}J_2^2(\kappa)}{\kappa} \tag{14} H(κ)=κ[(2ρκ)2+1]11/6J22(κ)(14) 公式(13)中的负号对应 b ∥ ( η ) b_{\parallel}(\eta) b(η) 而正号对应 b ⊥ ( η ) b_{\bot}(\eta) b(η) 。注意公式(13)的分母只是在 η = 0 \eta=0 η=0 时计算的分子,因此 b ∥ , ⊥ ( 0 ) = 1 b_{\parallel,\bot}(0)=1 b,(0)=1
C n 2 C_n^2 Cn2 为常数的水平路径中,公式(13)简化为: b ∥ , ⊥ ( η ) = ∫ 0 1 { ∫ 0 ∞ H ( κ ) [ J 0 ( M η κ ) ∓ J 2 ( M η κ ) ] d κ } Q ( ξ ) d ξ ∫ 0 1 { ∫ 0 ∞ H ( κ ) d κ } Q ( ξ ) d ξ (15) b_{\parallel,\bot}(\eta)=\frac{\int_0^1\{\int_0^{\infty}H(\kappa)[J_0(M_{\eta}\kappa)\mp J_2(M_{\eta}\kappa)]d\kappa\}Q(\xi)d\xi}{\int_0^1\{\int_0^{\infty}H(\kappa)d\kappa\}Q(\xi)d\xi} \tag{15} b,(η)=01{0H(κ)dκ}Q(ξ)dξ01{0H(κ)[J0(Mηκ)J2(Mηκ)]dκ}Q(ξ)dξ(15) 相关函数(15)不再依赖于 C n 2 C_n^2 Cn2 或范围 L L L ,而是依赖于 ρ \rho ρ η \eta η 。如图4所示,可以容易地计算相关函数(15)。

(图4:一对像素之间的、两个失真分量( ∥ , ⊥ \parallel,\bot ,)的相关函数(15),绘制 ρ = 4 \rho=4 ρ=4 ρ = 10 \rho=10 ρ=10

4 Designing the Field Autocorrelation(场自相关设计)

4.1 Autocorrelation of a Stationary Vector Field(平稳向量场的自相关)

(图5:图像平面。在没有失真的情况下,两个目标点投影到 p {\boldsymbol p} p p + v {\boldsymbol p}+{\boldsymbol v} p+v ,湍流引起的投影位移分别为 e ( p ) {\boldsymbol e}({\boldsymbol p}) e(p) e ( p + v ) {\boldsymbol e}({\boldsymbol p}+{\boldsymbol v}) e(p+v) 。任何位移矢量 e ( p ) {\boldsymbol e}({\boldsymbol p}) e(p) 都可以分成平行于 v {\boldsymbol v} v 和垂直于 v {\boldsymbol v} v 的分量,这些分量表示为 e ∥ ( p ) {\boldsymbol e}_{\parallel}({\boldsymbol p}) e(p) e ⊥ ( p ) {\boldsymbol e}_{\bot}({\boldsymbol p}) e(p)

在本节中,我们直接在二维图像域中工作。我们定义了失真向量场,并在此域中定义了矩阵值协方差函数。考虑图5,图像像素位置 p {\boldsymbol p} p o {\boldsymbol o} o 的无失真投影。在没有湍流的情况下,目标 o ′ o' o 的视线 o ′ {\boldsymbol o'} o 投影到2D像素位置 p + v {\boldsymbol p}+{\boldsymbol v} p+v 。湍流通过随机向量 e ( p ) {\boldsymbol e}({\boldsymbol p}) e(p) e ( p + v ) {\boldsymbol e}({\boldsymbol p}+{\boldsymbol v}) e(p+v) 变换各自的投影。因此, e {\boldsymbol e} e 是图像平面上的一个随机向量场。所有的向量 p {\boldsymbol p} p v {\boldsymbol v} v e {\boldsymbol e} e 都在图像域的 ( x , y ) (x,y) (x,y) 坐标系中给出。具体地说, v {\boldsymbol v} v 的笛卡尔分量是 v x v_x vx v y v_y vy 。所有空间分量以及焦距 f f f 都以像素为单位。对于窄视角: θ ≈ ∣ v ∣ f = r f (16) \theta\approx\frac{|\boldsymbol{v}|}{f}=\frac{r}{f} \tag{16} θfv=fr(16) 其中 r = ∣ v ∣ r=|\boldsymbol{v}| r=v 。因此,参考公式(10,15): b ∥ , ⊥ ( η ) = b ∥ , ⊥ ( r f θ D ) (17) b_{\parallel,\bot}(\eta)=b_{\parallel,\bot}(\frac{r}{f\theta_D}) \tag{17} b,(η)=b,(fθDr)(17) 为了模拟湍流失真图像,我们寻找一个具有正确空间相关性的随机场 e {\boldsymbol e} e ,并且它是一个均值为零的空间平稳向量场。由于我们对该场的自相关函数感兴趣,我们可以假定 e {\boldsymbol e} e 的方差为1,而不失一般性:方差可在之后根据需要使用公式(1)进行调整。自相关函数等于自协方差函数,由2×2矩阵给出: C ( v ) = E [ e ( p ) e T ( p + v ) ] (18) {\boldsymbol C}({\boldsymbol v})=E[{\boldsymbol e}({\boldsymbol p}){\boldsymbol e}^T({\boldsymbol p}+{\boldsymbol v})] \tag{18} C(v)=E[e(p)eT(p+v)](18) 其中 E E E 表示期望, T T T 表示转置。注意 C ( v ) {\boldsymbol C}({\boldsymbol v}) C(v) v x v_x vx v y v_y vy 的矩阵值函数。在平稳性假设下,自相关函数只依赖于两点间的差 v {\boldsymbol v} v ,并且在 C ( − v ) = C T ( v ) {\boldsymbol C}(-{\boldsymbol v})={\boldsymbol C}^T({\boldsymbol v}) C(v)=CT(v) 的意义上是对称的。
我们希望找到一个相关函数(18),使其推导出的纵向和横向自相关函数与公式(15)相匹配。定义单位向量: v ^ = v / r (19) \hat{\boldsymbol v}={\boldsymbol v}/r \tag{19} v^=v/r(19) 根据上图,位移矢量场 e ( p ) {\boldsymbol e}({\boldsymbol p}) e(p) 的纵向分量是 e ( p ) {\boldsymbol e}({\boldsymbol p}) e(p) v ^ \hat{\boldsymbol v} v^ 上的投影: e ∥ ( p ) = ⟨ v ^ , e ( p ) ⟩ = v ^ T e ( p ) (20) e_{\parallel}({\boldsymbol p})=\left\langle\hat{\boldsymbol v},{\boldsymbol e}({\boldsymbol p})\right\rangle=\hat{\boldsymbol v}^T{\boldsymbol e}({\boldsymbol p}) \tag{20} e(p)=v^,e(p)=v^Te(p)(20) 其中 ⟨ ⋅ , ⋅ ⟩ \left \langle \cdot,\cdot \right \rangle , 是内积操作,令: R = ( 0 − 1 1 0 ) (21) {\boldsymbol R}=\begin{pmatrix} 0 & -1 \\ 1 & 0 \\ \end{pmatrix} \tag{21} R=(0110)(21) 表示一个旋转矩阵,它在图像平面上将 v {\boldsymbol v} v 旋转90度。因此: v ^ T R v ^ = 0 (22) \hat{\boldsymbol v}^T{\boldsymbol R}\hat{\boldsymbol v}=0 \tag{22} v^TRv^=0(22) 垂直位移 e ⊥ ( p ) e_{\bot}({\boldsymbol p}) e(p) e ( p ) {\boldsymbol e}({\boldsymbol p}) e(p) 在垂直向量 R v ^ {\boldsymbol R}\hat{\boldsymbol v} Rv^ 上的投影: e ⊥ ( p ) = ⟨ R v ^ , e ( p ) ⟩ = v ^ T R T e ( p ) (23) e_{\bot}({\boldsymbol p})=\left \langle {\boldsymbol R}\hat{\boldsymbol v},{\boldsymbol e}({\boldsymbol p}) \right \rangle=\hat{\boldsymbol v}^T{\boldsymbol R}^T{\boldsymbol e}({\boldsymbol p}) \tag{23} e(p)=Rv^,e(p)=v^TRTe(p)(23) 根据公式(18),平行位移和垂直位移的自相关标量函数分别为: C ∥ ( v ) = E [ e ∥ ( p ) e ∥ T ( p + v ) ] = E [ v ^ T e ( p ) e T ( p + v ) v ^ ] = v ^ T C ( v ) v ^ (24) C_{\parallel}({\boldsymbol v})=E[e_{\parallel}({\boldsymbol p})e_{\parallel}^T({\boldsymbol p}+{\boldsymbol v})]=E[\hat{\boldsymbol v}^T{\boldsymbol e}({\boldsymbol p}){\boldsymbol e}^T({\boldsymbol p}+{\boldsymbol v})\hat{\boldsymbol v}]=\hat{\boldsymbol v}^T{\boldsymbol C}({\boldsymbol v})\hat{\boldsymbol v} \tag{24} C(v)=E[e(p)eT(p+v)]=E[v^Te(p)eT(p+v)v^]=v^TC(v)v^(24) C ⊥ ( v ) = E [ e ⊥ ( p ) e ⊥ T ( p + v ) ] = v ^ T R T C ( v ) R v ^ (25) C_{\bot}({\boldsymbol v})=E[e_{\bot}({\boldsymbol p})e_{\bot}^T({\boldsymbol p}+{\boldsymbol v})]=\hat{\boldsymbol v}^T{\boldsymbol R}^T{\boldsymbol C}({\boldsymbol v}){\boldsymbol R}\hat{\boldsymbol v} \tag{25} C(v)=E[e(p)eT(p+v)]=v^TRTC(v)Rv^(25)

4.2 A Solution to the Autocorrelation Function(自相关函数的一种解法)

在给定平行和垂直自相关标量函数 C ∥ ( v ) C_{\parallel}(\boldsymbol v) C(v) C ⊥ ( v ) C_{\bot}(\boldsymbol v) C(v) 的情况下,我们寻求一个分别与公式(24)和公式(25)一致的矩阵值自相关函数 C ( v ) {\boldsymbol C}(\boldsymbol v) C(v) 。解决这样一个问题的办法并不是唯一的。让我们使用解类: C ( v ) = A ( v ) I − B ( v ) v ^ v ^ T (26) {\boldsymbol C}(\boldsymbol v)=A(\boldsymbol v){\boldsymbol I}-B(\boldsymbol v)\hat{\boldsymbol v}\hat{\boldsymbol v}^T \tag{26} C(v)=A(v)IB(v)v^v^T(26) 其中 A ( v ) A(\boldsymbol v) A(v) B ( v ) B(\boldsymbol v) B(v) 是标量函数,且 I {\boldsymbol I} I 是2×2的单位阵。在公式(26)定义的类中,平行位移和垂直位移不相关。实际上,使用公式(26): E [ e ∥ ( p ) e ⊥ T ( p + v ) ] = E [ v ^ T e ( p ) e T ( p + v ) R v ^ ] = v ^ T C ( v ) R v ^ = v ^ T A ( v ) R v ^ − v ^ T B ( v ) v ^ v ^ T R v ^ = 0 (27) E[e_{\parallel}({\boldsymbol p})e_{\bot}^T({\boldsymbol p}+{\boldsymbol v})]=E[\hat{\boldsymbol v}^T{\boldsymbol e}({\boldsymbol p}){\boldsymbol e}^T({\boldsymbol p}+{\boldsymbol v}){\boldsymbol R}\hat{\boldsymbol v}]=\hat{\boldsymbol v}^T{\boldsymbol C}({\boldsymbol v}){\boldsymbol R}\hat{\boldsymbol v}=\hat{\boldsymbol v}^TA({\boldsymbol v}){\boldsymbol R}\hat{\boldsymbol v}-\hat{\boldsymbol v}^TB({\boldsymbol v})\hat{\boldsymbol v}\hat{\boldsymbol v}^T{\boldsymbol R}\hat{\boldsymbol v}=0 \tag{27} E[e(p)eT(p+v)]=E[v^Te(p)eT(p+v)Rv^]=v^TC(v)Rv^=v^TA(v)Rv^v^TB(v)v^v^TRv^=0(27) 其中我们使用了公式(22)和函数 A ( v ) A(\boldsymbol v) A(v) B ( v ) B(\boldsymbol v) B(v) 的标量值性质。
为了确定所需的函数 A A A B B B ,我们将公式(26)代入等式(24)和(25),则得到: C ∥ ( v ) = A ( v ) v ^ T v ^ − B ( v ) ( v ^ T v ^ ) 2 = A ( v ) − B ( v ) (28) C_{\parallel}(\boldsymbol v)=A(\boldsymbol v)\hat{\boldsymbol v}^T\hat{\boldsymbol v}-B(\boldsymbol v)(\hat{\boldsymbol v}^T\hat{\boldsymbol v})^2=A(\boldsymbol v)-B(\boldsymbol v) \tag{28} C(v)=A(v)v^Tv^B(v)(v^Tv^)2=A(v)B(v)(28) C ⊥ ( v ) = A ( v ) v ^ T R T R v ^ − B ( v ) v ^ T R T v ^ v ^ T R v ^ = A ( v ) (29) C_{\bot}(\boldsymbol v)=A(\boldsymbol v)\hat{\boldsymbol v}^T{\boldsymbol R}^T{\boldsymbol R}\hat{\boldsymbol v}-B(\boldsymbol v)\hat{\boldsymbol v}^T{\boldsymbol R}^T\hat{\boldsymbol v}\hat{\boldsymbol v}^T{\boldsymbol R}\hat{\boldsymbol v}=A(\boldsymbol v) \tag{29} C(v)=A(v)v^TRTRv^B(v)v^TRTv^v^TRv^=A(v)(29) 其中我们使用了 R T R = I {\boldsymbol R}^T{\boldsymbol R}={\boldsymbol I} RTR=I 和公式(22,26,28,29)推导出: C ( v ) = C ⊥ ( v ) I − [ C ⊥ ( v ) − C ∥ ( v ) ] v ^ v ^ T (30) {\boldsymbol C}(\boldsymbol v)=C_{\bot}(\boldsymbol v){\boldsymbol I}-[C_{\bot}(\boldsymbol v)-C_{\parallel}(\boldsymbol v)]\hat{\boldsymbol v}\hat{\boldsymbol v}^T \tag{30} C(v)=C(v)I[C(v)C(v)]v^v^T(30)

4.3 Consistency with Turbulence Correlation(与湍流相关的一致性)

给定公式(10,15,17),平行和垂直标量自相关函数必须设置为满足: C ∥ ( v ) = b ∥ ( r f θ D ) , C ⊥ ( v ) = b ⊥ ( r f θ D ) (31) C_{\parallel}(\boldsymbol v)=b_{\parallel}(\frac{r}{f\theta_D}),C_{\bot}(\boldsymbol v)=b_{\bot}(\frac{r}{f\theta_D}) \tag{31} C(v)=b(fθDr),C(v)=b(fθDr)(31) 因此,理想的自相关函数可以写成: C ( v ) = A ( r ) I − B ( r ) v ^ v ^ T (32) {\boldsymbol C}(\boldsymbol v)=A(r){\boldsymbol I}-B(r)\hat{\boldsymbol v}\hat{\boldsymbol v}^T \tag{32} C(v)=A(r)IB(r)v^v^T(32) 使用正函数: A ( r ) = b ⊥ ( r f θ D ) , B ( r ) = b ⊥ ( r f θ D ) − b ∥ ( r f θ D ) (33) A(r)=b_{\bot}(\frac{r}{f\theta_D}),B(r)=b_{\bot}(\frac{r}{f\theta_D})-b_{\parallel}(\frac{r}{f\theta_D}) \tag{33} A(r)=b(fθDr),B(r)=b(fθDr)b(fθDr)(33) 在尺寸为 U × U U\times U U×U 的2D空间图像域中,自相关域 v \boldsymbol v v 的大小为 2 U × 2 U 2U\times 2U 2U×2U

(图6:基于4.3详述的示例参数得到的2×2矩阵值 C ( v ) {\boldsymbol C}(\boldsymbol v) C(v) 。在每个子图中, v \boldsymbol v v 域的空间尺寸为2048×2048像素,对应于1024×1024的图像。右上角的比例尺对应于 C x y C_{xy} Cxy C y x C_{yx} Cyx ,具有负值和正值。右下角的比例尺对应于 C x x C_{xx} Cxx C y y C_{yy} Cyy ,具有非负值)

我们给出了一个使用以下参数的示例: λ = 550 n m \lambda=550nm λ=550nm ,像素大小 4 μ m 4\mu m 4μm U = 1024 U=1024 U=1024 像素,Nikon AF-S Nikkor 镜头, f = 300 m m f=300mm f=300mm f # = 5.6 f\#=5.6 f#=5.6 ,高度 h = 4 m h=4m h=4m 。目标距离 L = 2 k m L=2km L=2km C n 2 = 3.6 × 1 0 − 13 m − 2 / 3 C_n^2=3.6\times10^{-13}m^{-2/3} Cn2=3.6×1013m2/3 。然后使用公式(9-15)计算 A A AA AA 方差和相关性。如图6和7,绘制2×2矩阵 C ( v ) {\boldsymbol C}(\boldsymbol v) C(v) 的每个元素,作为 v \boldsymbol v v 的函数。使用相同的固定成像参数,在本文中(如下所述)进一步创建图8,9,10,13时,遵循此示例。

(图7:图6的10倍放大图)

# -*- coding: UTF-8 -*-
# Theme: Turbulence-Induced 2D Correlated Image Distortion
# Author: Tianqi Shen
# Date: 2020/08/31

import numpy as np
import scipy.special as sc
from scipy.integrate import quad
import matplotlib.pyplot as plt

class AA_variance:
    def __init__(self):
        self.lam    = 550*1e-9
        self.f      = 300*1e-3
        self.f_     = 5.6      # f#=f_=f/D
        self.D      = self.f/self.f_
        self.L      = 2*1e+3
        self.Cn2    = 3.6*1e-13
        self.beta   = 0.5216
        
    # 公式3
    def spherical_wave_coefficient(self, q):
        temp0 = (np.sqrt(3)/16)*sc.gamma(1/6)*sc.gamma(8/3)*np.power(2/beta,1/3)
        temp1 = (np.pi*(self.beta*q)**2)/(2j)
        temp2 = sc.hyp2f1(1/6,17/6,23/6,(1+temp1))
        temp3 = 1+(6/17)*(8/3)*(np.power(-temp1,1/6)*temp2).real
        return temp0*temp3
    # 公式1
    def variance(self):
        # 公式2
        temp0 = self.D / np.sqrt(self.lam * self.L)
        temp1 = self.spherical_wave_coefficient(temp0)
        temp2 = temp1*self.Cn2*self.L*np.power(self.D,-1/3)
        return temp2

class autocorrelation_function:
    def __init__(self):
        self.lam    = 550*1e-9
        self.pix    = 4*1e-6
        self.f      = 300*1e-3
        self.f_     = 5.6      # f#=f_=f/D
        self.h      = 4
        self.L      = 2*1e+3
        self.D      = self.f/self.f_
        self.thetaD = self.D/self.L
        self.L0     = 0.4*self.h
        self.Rho    = self.L0/self.D

    # 公式12
    def Q(self, xi):
        return np.power((1-xi), 5/3)
    # 公式12
    def M(self, xi, eta):
        return 2 * eta * xi * (1-xi)
    # 公式14
    def H(self, kappa, rho):
        temp0 = np.power((2*rho*kappa)**2+1, -11/6)
        temp1 = np.power(sc.jv(2, kappa), 2)
        return temp0 * temp1 / kappa
    # 公式15分子,里面那个积分的被积函数(平行)
    def integrand_function_para(self, kappa, xi, rho, eta):
        temp0 = sc.jv(0, self.M(xi, eta) * kappa)
        temp1 = sc.jv(2, self.M(xi, eta) * kappa)
        return self.H(kappa, rho) * (temp0 - temp1)
    # 公式15分子,里面那个积分的被积函数(垂直)
    def integrand_function_perp(self, kappa, xi, rho, eta):
        temp0 = sc.jv(0, self.M(xi, eta) * kappa)
        temp1 = sc.jv(2, self.M(xi, eta) * kappa)
        return self.H(kappa, rho) * (temp0 + temp1)
    # 公式15分子,外面那个积分的被积函数(平行)
    def integrate_numerator_para(self, xi, rho, eta):
        temp = quad(self.integrand_function_para, 0, np.inf, args=(xi, rho, eta))
        return temp[0] * self.Q(xi)
    # 公式15分子,外面那个积分的被积函数(垂直)
    def integrate_numerator_perp(self, xi, rho, eta):
        temp = quad(self.integrand_function_perp, 0, np.inf, args=(xi, rho, eta))
        return temp[0] * self.Q(xi)
    # 公式15分子(平行)
    def b_numerator_para(self, rho, eta):
        return quad(self.integrate_numerator_para, 0, 1, args=(rho, eta))[0]
    # 公式15分子(垂直)
    def b_numerator_perp(self, rho, eta):
        return quad(self.integrate_numerator_perp, 0, 1, args=(rho, eta))[0]
    # 公式15分母的被积函数
    def integrate_denominator(self, xi, rho):
        temp = quad(self.H, 0, np.inf, args=rho)
        return temp[0] * self.Q(xi)
    # 公式15分母
    def b_denominator(self, rho):
        return quad(self.integrate_denominator, 0, 1, args=rho)[0]
    # 公式15(kind=0平行,kind=1垂直)
    def correlation_function_b(self, rho, eta, kind):
        if kind == 0:
            return self.b_numerator_para(rho, eta)/self.b_denominator(rho)
        elif kind == 1:
            return self.b_numerator_perp(rho, eta)/self.b_denominator(rho)
        else:
            print("There is no such kind! Please choose 0 or 1!")
    # 公式33
    def A(self, vx, vy):
        temp = np.sqrt(vx**2 + vy**2) / (self.f * self.thetaD)
        return self.correlation_function_b(self.Rho, temp, 1)
    # 公式33
    def B(self, vx, vy):
        temp0 = np.sqrt(vx**2 + vy**2) / (self.f * self.thetaD)
        temp1 = self.correlation_function_b(self.Rho, temp0, 1)
        temp2 = self.correlation_function_b(self.Rho, temp0, 0)
        return temp1 - temp2
    # 公式32
    def C(self, vx, vy):
        temp = vx**2 + vy**2
        Cxx = self.A(vx, vy) - self.B(vx, vy) * vx * vx / temp
        Cxy = -self.B(vx, vy) * vx * vy / temp
        Cyx = -self.B(vx, vy) * vy * vx / temp
        Cyy = self.A(vx, vy) - self.B(vx, vy) * vy * vy / temp
        return np.array([Cxx, Cxy, Cyx, Cyy])
    # 计算自相关域v
    def autocorrelation_domain_v(self, halfU):
        cxx = np.zeros((2*halfU, 2*halfU))
        cxy = np.zeros((2*halfU, 2*halfU))
        cyx = np.zeros((2*halfU, 2*halfU))
        cyy = np.zeros((2*halfU, 2*halfU))
        for i in range(0, 2*halfU):
            for j in range(0, 2*halfU):
                vx = (j+1-0.5-halfU) * self.pix
                vy = (halfU+0.5-i-1) * self.pix
                '''
                print("i:", i)
                print("j:", j)
                print("vx:", vx)
                print("vy:", vy)
                print("temp:", vx**2+vy**2)
                print("B(vx,vy):", B(vx, vy))
                print("###########################")
                '''
                temp = self.C(vx, vy)
                cxx[i][j] = temp[0]
                cxy[i][j] = temp[1]
                cyx[i][j] = temp[2]
                cyy[i][j] = temp[3]
        return cxx, cxy, cyx, cyy

class PlotAll:
    def __init__(self):
        
        acf = autocorrelation_function()
        
        plt.figure('b')
        eta_array = np.linspace(0, 400, 401)
        b = np.vectorize(acf.correlation_function_b)
        b_10_perp = b(10, eta_array, 1)
        b_10_para = b(10, eta_array, 0)
        b_4_perp  = b(4, eta_array, 1)
        b_4_para  = b(4, eta_array, 0)
        plt.plot(eta_array, b_10_perp, color='red', linestyle = '-', zorder=2)
        plt.plot(eta_array, b_10_para, color='red', linestyle = '--', zorder=1)
        plt.plot(eta_array, b_4_perp, color='green', linestyle = '-', zorder=4)
        plt.plot(eta_array, b_4_para, color='green', linestyle = '--', zorder=3)
        plt.legend([r'$b_{\perp}(\rho=10)$', r'$b_{\parallel}(\rho=10)$', r'$b_{\perp}(\rho=4)$', r'$b_{\parallel}(\rho=4)$'], fontsize=17)
        plt.xlabel(r'$\eta=\theta/\theta_D$', fontsize=17)
        plt.ylabel('b', fontsize=17)
    
        cxx, cxy, cyx, cyy = acf.autocorrelation_domain_v(512)
        '''
        print("cxx:", cxx)
        print("cxy:", cxy)
        print("cyx:", cyx)
        print("cyy:", cyy)
        '''
        np.savetxt("cxx.txt", cxx)
        np.savetxt("cxy.txt", cxy)
        np.savetxt("cyx.txt", cyx)
        np.savetxt("cyy.txt", cyy)
        plt.figure("cxx")
        plt.imshow(cxx, cmap='jet')
        plt.figure("cxy")
        plt.imshow(cxy, cmap='jet')
        plt.figure("cyx")
        plt.imshow(cyx, cmap='jet')
        plt.figure("cyy")
        plt.imshow(cyy, cmap='jet')
    
        plt.show()

if __name__ == '__main__':
    plotall = PlotAll()

大家可以试一试上面的代码,可以发现跑的效率非常低!
慢的原因有两个:
① 积分(公式15)较复杂;
② 对每个像素点都进行操作;
建议改小两处的值先试试看部分效果:

eta_array = np.linspace(0, 10, 11)
cxx, cxy, cyx, cyy = acf.autocorrelation_domain_v(6)

代码还有待优化及加速,尽请期待!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值