自动聚焦清晰度评价指标算法
自动聚焦简介
自动聚焦最简单的做法是遍历所有的聚焦点,判断每个聚焦点成像图片的清晰程度或聚焦程度,使得成像镜头停在图片清晰度最高的聚焦位置上。这样做的缺点非常明显,聚焦点的数量是非常多的,判断每个聚焦点的图片清晰程度会使得自动聚焦过程特别长。更一般的做法是定义搜索策略,根据搜索算法遍历有限个数的聚焦点。
这些做法都有一个关键的问题,如何判断图片的清晰度,如何设计一个清晰度评价指标?下面介绍现有的清晰度评价指标,或者说聚焦程度指标,因为清晰度评价指标是通过某个函数计算出一个代表清晰度的数值,因此称这个函数为聚焦函数。
原理
不同的聚焦位置,图片的清晰度不同,观察图片的像素值,可以发现,图片越清晰,相邻像素之间的差值越大,从而图片的边缘越尖锐。从频域上讲,图片越清晰,高频成分就越多。因此,可以在空域或频域中设计聚焦函数。但是采集图片一般是RGB格式,转换成频域需要复杂的计算,因此大多数聚焦函数都是在空域中对像素进行计算。
类型
目前有许多种聚焦函数1,下面一一讲解。
基于导数的聚焦函数
基于导数的聚焦函数的原理是图片越清晰,相邻像素的差值越大。因此基于导数的聚焦函数一般都是计算相邻像素的差值,具体做法是使用一个卷积核与图片进行卷积,把每次卷积结果加起来作为清晰度评价指标。这种算法的缺点是对图片中的噪声敏感。
Thresholded Absolute Gradient:
(F-1) F th_grad = ∑ Height ∑ Width ∣ i ( x + 1 , y ) − i ( x , y ) ∣ F_{\text{th\_grad}} = \sum_{\text{Height}} \sum_{\text{Width}} \left | i(x + 1, y) - i(x, y) \right | \tag{F-1} Fth_grad=Height∑Width∑∣i(x+1,y)−i(x,y)∣(F-1)
其中 ∣ i ( x + 1 , y ) − i ( x , y ) ∣ ≥ θ \left | i(x + 1, y) - i(x, y) \right | \ge \theta ∣i(x+1,y)−i(x,y)∣≥θ, θ \theta θ为阈值。
Squared Gradient:
(F-2) F th_grad = ∑ Height ∑ Width ( i ( x + 1 , y ) − i ( x , y ) ) 2 F_{\text{th\_grad}} = \sum_{\text{Height}} \sum_{\text{Width}} \left ( i(x + 1, y) - i(x, y) \right )^2 \tag{F-2} Fth_grad=Height∑Width∑(i(x+1,y)−i(x,y))2(F-2)
其中 ( i ( x + 1 , y ) − i ( x , y ) ) 2 ≥ θ \left ( i(x + 1, y) - i(x, y) \right )^2 \ge \theta (i(x+1,y)−i(x,y))2≥θ。
Brenner Gradient:
(F-3) F Brenner = ∑ Height ∑ Width ( i ( x + 2 , y ) − i ( x , y ) ) 2 F_{\text{Brenner}} = \sum_{\text{Height}} \sum_{\text{Width}} \left ( i(x + 2, y) - i(x, y) \right )^2 \tag{F-3} FBrenner=Height∑Width∑(i(x+2,y)−i(x,y))2(F-3)
其中 ( i ( x + 2 , y ) − i ( x , y ) ) 2 ≥ θ \left ( i(x + 2, y) - i(x, y) \right )^2 \ge \theta (i(x+2,y)−i(x,y))2≥θ。
Tenenbaum Gradient:
(F-4) F Tenengrad = ∑ Height ∑ Width ( S x ( x , y ) 2 + S y ( x , y ) 2 ) F_{\text{Tenengrad}} = \sum_{\text{Height}} \sum_{\text{Width}} \left ( S_x (x, y)^2 + S_y (x, y)^2 \right ) \tag{F-4} FTenengrad=Height∑Width∑(Sx(x,y)2+Sy(x,y)2)(F-4)
其中 S x ( x , y ) S_x (x, y)