论文解读: Learning to AutoFocus (二)
前面介绍了 Learning to AutoFocus 这篇文章,这篇文章主要是基于深度学习的方式来实现自动对焦算法的,不过这篇文章的补充材料里面,也介绍了很多传统算法的自动对焦算法,总得来说,是基于反差的对焦技术和基于相位检测的对焦技术。
基于反差的对焦算法,就是给定一组 n n n 张不同对焦距离下的图, I k , k ∈ { 1 , 2 , . . . n } I_k, k \in \{ 1,2,...n \} Ik,k∈{1,2,...n},这样一组图像称为 focal stack,比较这组图像中,每幅图像的 contrast score ϕ \phi ϕ,选择其中值最大的那个 focal slice 作为我们的目标,从而得到最佳的对焦距离,这篇文章列举了很多的评估 contrast score 的方法,刚好可以学习学习基于反差的对焦算法都有哪些评价方式:
最常用的一个指标是方差信息,很明显,如果对焦不清晰的话,图像会比较模糊,这个时候的方差会比较小,反之,如果图像比较清晰,那么方差会比较大:
ϕ = V a r ( I ) \phi = Var(I) ϕ=Var(I)
这个指标,也是考虑对焦区域的变化程度,用标准差除以图像的均值:
ϕ = V a r ( I ) μ ( I ) \phi = \frac{\sqrt{Var(I)}}{\mu(I)} ϕ=μ(I)Var(I)
这个 TV 项简单来说,就是看图像的梯度的绝对值,梯度越大,对焦越清晰:
ϕ = ∑ x , y ∥ I [ x + 1 , y ] − I [ x , y ] ∥ + ∥ I [ x , y + 1 ] − I [ x , y ] ∥ \phi = \sum_{x, y} \| I[x+1,y] - I[x, y] \| + \| I[x,y+1] - I[x, y] \| ϕ=x,y∑∥I[x+1,y]−I[x,y]∥+∥I[x,y+1]−I[x,y]∥
这个是 TV 项的 L2 范数,就是梯度的平方和:
ϕ = ∑ x , y ( I [ x + 1 , y ] − I [ x , y ] ) 2 + ( I [ x , y + 1 ] − I [ x , y ] ) 2 \phi = \sum_{x,y} (I[x+1,y] - I[x, y])^2 + (I[x,y+1] - I[x, y])^2 ϕ=x,y∑(I[x+1,y]−I[x,y])2+(I[x,y+1]−I[x,y])2
这个评价方法就是利用拉普拉斯算子对图像做卷积,然后再求平方和。
ϕ = ∑ x , y Δ [ x , y ] 2 , Δ = I ∗ [ 0 1 0 1 − 4 1 0 1 0 ] \phi = \sum_{x, y} \Delta[x,y]^2, \quad \Delta = I * \begin{bmatrix} 0 & 1 & 0 \\ 1 & -4 & 1 \\ 0 & 1 & 0 \end{bmatrix} ϕ=x,y∑Δ[x,y]2,Δ=I∗⎣⎡0101−41010⎦⎤
这个评价方法是对拉普拉斯卷积后的图像求方差:
ϕ = V a r ( Δ [ x , y ] ) , Δ = I ∗ [ 0 1 0 1 − 4 1 0 1 0 ] \phi = Var(\Delta[x, y]),\quad \Delta = I * \begin{bmatrix} 0 & 1 & 0 \\ 1 & -4 & 1 \\ 0 & 1 & 0 \end{bmatrix} ϕ=Var(Δ[x,y]),Δ=I∗⎣⎡0101−41010⎦⎤
这个也是基于拉普拉斯算子的:
ϕ = ∑ x , y Δ [ x , y ] , Δ = ∣ I ∗ L x ∣ + ∣ I ∗ L y ∣ \phi = \sum_{x,y} \Delta[x, y], \quad \Delta = |I * L_x| + | I * L_y| ϕ=x,y∑Δ[x,y],Δ=∣I∗Lx∣+∣I∗Ly∣
L x = [ 0 0 0 1 − 2 1 0 0 0 ] , L y = L x T L_x = \begin{bmatrix} 0 & 0 & 0 \\ 1 & -2 & 1 \\ 0 & 0 & 0 \end{bmatrix},\quad L_y = L_x^{T} Lx=⎣⎡0100−20010⎦⎤,Ly=LxT
ϕ = ∑ x , y Δ [ x , y ] \phi = \sum_{x, y} \Delta[x, y] ϕ=x,y∑Δ[x,y]
Δ = ∣ I ∗ L x ∣ + ∣ I ∗ L y ∣ + ∣ I ∗ L x y ∣ + ∣ I ∗ L y x ∣ \Delta = |I * L_x| + | I * L_y| + | I * L_{xy}| + | I * L_{yx}| Δ=∣I∗Lx∣+∣I∗Ly∣+∣I∗Lxy∣+∣I∗Lyx∣
L x y = 1 2 [ 0 0 1 0 − 2 0 1 0 0 ] , L y x = L x y T L_{xy} = \frac{1}{\sqrt{2}} \begin{bmatrix} 0 & 0 & 1 \\ 0 & -2 & 0 \\ 1 & 0 & 0 \end{bmatrix} , \quad L_{yx} = L_{xy}^T Lxy=21⎣⎡0010−20100⎦⎤,Lyx=LxyT
这个利用 sobel 算子计算图像的梯度,然后再求平方和:
ϕ = 1 n ∑ x , y ∇ x [ x , y ] 2 + ∇ y [ x , y ] 2 \phi = \frac{1}{n} \sum_{x,y} \sqrt{\nabla_{x}[x,y]^2 + \nabla_{y}[x,y]^2} ϕ=n1x,y∑∇x[x,y]2+∇y[x,y]2
∇ x = I ∗ [ − 1 0 1 − 2 0 2 − 1 0 1 ] , ∇ y = I ∗ [ − 1 − 2 − 1 0 0 0 1 2 1 ] \nabla_{x} = I * \begin{bmatrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{bmatrix} , \quad \nabla_{y} = I * \begin{bmatrix} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \end{bmatrix} ∇x=I∗⎣⎡−1−2−1000121⎦⎤,∇y=I∗⎣⎡−101−202−101⎦⎤
这个评估方式是统计梯度值大于某一阈值的个数:
ϕ = 1 n ∑ x , y [ ∣ ∇ x [ x , y ] ∣ > t ] + [ ∣ ∇ y [ x , y ] ∣ > t ] \phi = \frac{1}{n} \sum_{x,y} [|\nabla_{x}[x, y]| > t] + [|\nabla_{y}[x, y]| > t] ϕ=n1x,y∑[∣∇x[x,y]∣>t]+[∣∇y[x,y]∣>t]
ϕ = V a r ( ∇ x [ x , y ] 2 + ∇ y [ x , y ] 2 ) \phi = Var( \sqrt{\nabla_{x}[x, y]^2 + \nabla_{y}[x, y]^2} ) ϕ=Var(∇x[x,y]2+∇y[x,y]2)
ϕ = P e r c e n t i l e ( I , 100 − p ) − P e r c e n t i l e ( I , p ) \phi = Percentile(I, 100 - p) - Percentile(I, p) ϕ=Percentile(I,100−p)−Percentile(I,p)
ϕ = ∑ i n i l o g ( n i ) \phi = \sum_{i} n_i log(n_i) ϕ=i∑nilog(ni)
n i n_i ni 表示图像的直方图分布
ϕ = ( ∑ u , v D [ u , v ] 2 ) − D [ 0 , 0 ] 2 D [ 0 , 0 ] 2 , D = D C T ( I ) \phi = \frac{(\sum_{u, v}D[u, v]^2) - D[0, 0]^2}{D[0, 0]^2}, \quad D = DCT(I) ϕ=D[0,0]2(∑u,vD[u,v]2)−D[0,0]2,D=DCT(I)
ϕ = D [ 0 , 1 ] 2 + D [ 1 , 0 ] 2 + D [ 0 , 2 ] 2 + D [ 2 , 0 ] 2 + D [ 1 , 1 ] 2 D [ 0 , 0 ] 2 \phi = \frac{D[0, 1]^2 + D[1, 0]^2 + D[0, 2]^2 + D[2, 0]^2 + D[1, 1]^2}{D[0, 0]^2} ϕ=D[0,0]2D[0,1]2+D[1,0]2+D[0,2]2+D[2,0]2+D[1,1]2
ϕ = ∑ x , y ( I ∗ [ 1 1 − 1 − 1 1 1 − 1 − 1 − 1 − 1 1 1 − 1 − 1 1 1 ] ) [ x , y ] \phi = \sum_{x, y} \left( I * \begin{bmatrix} 1 & 1 & -1 & -1 \\ 1 & 1 & -1 & -1 \\ -1 & -1 & 1 & 1 \\ -1 & -1 & 1 & 1 \\ \end{bmatrix} \right) [x, y] ϕ=x,y∑⎝⎜⎜⎛I∗⎣⎢⎢⎡11−1−111−1−1−1−111−1−111⎦⎥⎥⎤⎠⎟⎟⎞[x,y]
ϕ = ∑ x , y ∣ W L H ( l ) [ x , y ] ∣ + ∣ W H L ( l ) [ x , y ] ∣ + ∣ W H H ( l ) [ x , y ] ∣ \phi = \sum_{x, y} | W_{LH}^{(l)}[x, y] | + | W_{HL}^{(l)}[x, y] | + | W_{HH}^{(l)}[x, y] | ϕ=x,y∑∣WLH(l)[x,y]∣+∣WHL(l)[x,y]∣+∣WHH(l)[x,y]∣
( W L L ( l ) , W L H ( l ) , W H L ( l ) , W H H ( l ) ) = C D F 9 / 7 ( I , l ) \left( W_{LL}^{(l)}, W_{LH}^{(l)}, W_{HL}^{(l)}, W_{HH}^{(l)} \right) = CDF9/7(I, l) (WLL(l),WLH(l),WHL(l),WHH(l))=CDF9/7(I,l)
ϕ = V a r ( W L H ( l ) [ x , y ] ) + V a r ( W H L ( l ) [ x , y ] ) + V a r ( W H H ( l ) [ x , y ] ) \phi = Var\left(W_{LH}^{(l)}[x, y] \right) + Var\left(W_{HL}^{(l)}[x, y] \right) + Var\left(W_{HH}^{(l)}[x, y] \right) ϕ=Var(WLH(l)[x,y])+Var(WHL(l)[x,y])+Var(WHH(l)[x,y])
ϕ = ∑ x , y W L H ( l ) [ x , y ] 2 + W H L ( l ) [ x , y ] 2 + W H H ( l ) [ x , y ] 2 ∑ x , y W L L ( l ) [ x , y ] 2 \phi = \frac{\sum_{x,y} W_{LH}^{(l)}[x, y]^2 + W_{HL}^{(l)}[x, y]^2 + W_{HH}^{(l)}[x, y]^2}{\sum_{x,y} W_{LL}^{(l)}[x, y]^2} ϕ=∑x,yWLL(l)[x,y]2∑x,yWLH(l)[x,y]2+WHL(l)[x,y]2+WHH(l)[x,y]2
ϕ = 1 n ∑ x , y log ( W L H ( l ) [ x , y ] 2 + W H L ( l ) [ x , y ] 2 + W H H ( l ) [ x , y ] 2 W L L ( l ) [ x , y ] 2 + 1 ) \phi = \frac{1}{n} \sum_{x,y} \log \left( \frac{ W_{LH}^{(l)}[x, y]^2 + W_{HL}^{(l)}[x, y]^2 + W_{HH}^{(l)}[x, y]^2}{ W_{LL}^{(l)}[x, y]^2 + 1} \right) ϕ=n1x,y∑log(WLL(l)[x,y]2+1WLH(l)[x,y]2+WHL(l)[x,y]2+WHH(l)[x,y]2)
基于 dual pixel 的方法,就是计算左右两幅视图的视差,视差的计算主要基于图像的匹配,图像的匹配,就是寻找两幅图像中相似的地方,可以利用统计信息,或者图像的特征,为了让左右两幅图像匹配的时候,不受亮度的影响,可以先对左右两幅图像的亮度做一个校正:
L ^ = L − μ ( L ) V a r ( L ) , R ^ = R − μ ( R ) V a r ( R ) \hat{L} = \frac{L - \mu(L)}{Var(L)}, \quad \hat{R} = \frac{R - \mu(R)}{Var(R)} L^=Var(L)L−μ(L),R^=Var(R)R−μ(R)
亮度校正之后,可以对左右两幅图像计算视差,也是基于不同的评价准则,几种典型的计算方式如下:
f = ∑ x , y ∣ ∣ C e n s u s ( L ) [ x , y ] − C e n s u s ( R ) [ x , y ] ∣ ∣ 0 f = \sum_{x, y} || Census(L)[x, y] - Census(R)[x, y] ||_{0} f=x,y∑∣∣Census(L)[x,y]−Census(R)[x,y]∣∣0
C e n s u s ( I ) [ x , y ] = [ I [ x + Δ x , y + Δ y ] > I [ x , y ] ∣ Δ x ∈ [ − 1 , 0 , 1 ] , Δ y ∈ [ − 1 , 0 , 1 ] , Δ x ≠ Δ y ≠ 0 ] Census(I)[x, y] = \left [ I[x+\Delta_x, y+\Delta_y] > I[x, y] | \Delta_x \in [-1, 0, 1], \Delta_y \in [-1, 0, 1], \Delta_x \neq \Delta_y \neq 0 \right ] Census(I)[x,y]=[I[x+Δx,y+Δy]>I[x,y]∣Δx∈[−1,0,1],Δy∈[−1,0,1],Δx=Δy=0]
f = − ⟨ L ^ , R ^ ⟩ f = - \left \langle \hat{L}, \hat{R} \right \rangle f=−⟨L^,R^⟩
f = ∑ x , y ∣ L ^ [ x , y ] − R ^ [ x , y ] ∣ f = \sum_{x, y} |\hat{L}[x, y] - \hat{R}[x, y]| f=x,y∑∣L^[x,y]−R^[x,y]∣