近来研究立体匹配,从入门开始,先学习一些基本的算法思想。
立体匹配算法中,全局匹配是一个很重要的部分,利用图像的全局约束信息,对局部图像的模糊不敏感,它的计算代价很高。全局匹配算法通过构建全局能量函数,然后通过优化方法最小化全局能量函数以求得致密视差图。
全局匹配算法一般有动态规划、置信传播、模拟退火、图割法、遗传学等,这里首先介绍动态规划,也是从一些论文中提取的思想,可能有不对的地方,望指正。
动态规划的思想就是把求解整个图像深度值的过程分解为一些子过程,逐个求解子过程,具体过程为根据外极线顺序约束,通过在视差图像上寻找最小代价路径得到最终视差图,从而减少了算法的复杂度,动态规划的思想体现了顺序约束和连续性约束。传统的动态规划算法可以很好的处理因局部纹理单一而造成的误匹配,算法复杂度不高,缺点是匹配过程忽略了每条极线间视差的约束,导致了视差图有条纹瑕疵现象。
参考论文:
双目视觉立体匹配方法研究-魏朋玉-重庆大学
基于动态规划的立体匹配算法研究-龚文-南昌航空大学
基于动态规划和置信传播 的立体匹配算法的研究 -刘英杰-燕山大学
1:首先了解下动态规划算法的思想:
解决爬楼梯的问题:
一个人每次只能走一层楼梯或者两层楼梯,问走到80层一共有多少种方法。
解:设DP[i]为走到第i层一共有多少种方法,那么DP[80]就是所求的目标。很显然DP[1]=1,DP[2]=2(走到第一层只有一种就是走一层楼梯,第二层有两种:走两次一层楼梯或者走一次两层楼梯)。同理走到第[i]层楼梯可以从第i-1层走一层,或者从i-2走两层。很容易得到:
递推公式:DP[i]=DP[i-1]+DP[i-2]
边界条件:DP[1]=1 DP[2]=2
则自顶向下的解法:
long long dp[81] = {
0};/*用于保存中间结果
否则会重复计算很多重复的子问题*/
long long DP(int n)
{
if(dp[n])
return dp[n];
if(n == 1)
return 1;
if(n == 2)
return 2;
dp[n] = DP(n-1) + DP(n-