自动对焦之斐波那契(Fibonacci)搜索算法原理和实现

  • 搜索算法原理

       斐波那契搜索是一种有限区间中单峰函数的搜索技术。设此区间为L1,记为$\begin{Bmatrix}F_k\end{Bmatrix}$斐波那契数:$F_0 = 1$$F_1= 1$,当k≥2时,满足$F_k= F_k_-_1 + F_k_-_2$

       第一次估值点为:

                                               x_1=$$\frac{F_k-_2}{F_k}$$*L_1   和    x_2=(1-$$\frac{F_k-_2}{F_k}$$)*L_1

其中,$$\frac{1}{F_k}$$应等于或小于搜索的预期精度。

        若f(x1)>f(x2),则删去(x2,1],反之删去[0,x1)。以L1记删去的区间,再对留下的区间L2取:

                                                x_3=$$\frac{F_k-_3}{F_k-_1}$$*L_2   和  x_4=(1-$$\frac{F_k-_3}{F_k-_1}$$)*L_2

        对L2重复上述步骤。如此反复直到:

                                                                 L_n=$$\frac{F_0}{F_k}$$*L_1

  • 搜索步骤

1.确定Z轴行程length;

2.给定n值,创建斐波那契数列F[0],...,F[n-1],将Z轴行程按平均分为F[n-1]段,顺序从下而上,则搜索精度为step =length/F[n-1]。初始化pos = F[0]*step,最低点low = F[0]*step,用于确定绝对位置;

3.若n≥3,则执行第4步,否则,执行第8步;

4.取估值点index1和index2,分别计算index1和index2处所采图像的梯度Gradient(index1)和Gradient(index2)并比较。若Gradient(index1)> Gradient(index2),则执行第4步,否则执行第5步;

5.舍弃上部F[n-3]*step长度,更新pos = index1;执行第6步;

6.舍弃下部F[n-3]*step长度,更新pos = index2,更新low = index1 + step;

7.n自减1,即下一次只需从F[n -2]段搜索,执行第3步;

8.返回结果pos。

  • 代码实现

int Fibonacci_Search(int n)
{
    int pos(0);
    //create a array
    int F[n];
    F[0] = 1;
    F[1] = 1;
    for (int i = 2; i < n; i++)
    {
        F[i] = F[i-1] + F[i-2];
    }
    //search
    int low(0);
    int index1, index2;
    double gIndex1, gIndex2;

    while(n >= 3)
    {
        index1 = low + F[n - 3] - 1;
        index2 = low + F[n - 2];
        n--;
        gIndex1 = GetGradientValue(index1);//此处用图像梯度,也可以是其他判断标准
        gIndex2 = GetGradientValue(index2);

        if( gIndex1 > gIndex2 )  
        {
            pos = index1;
        }
        else
        {
            low = index1 + 1;
            pos = index2;
        }
    }
    return pos;
}
发布了9 篇原创文章 · 获赞 3 · 访问量 894

猜你喜欢

转载自blog.csdn.net/qq_23516957/article/details/105111845
今日推荐