自动对焦之斐波那契(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),则执行第5步,否则执行第6步;

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

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;
}

 

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值