• 基于基于全局差错能量函数的双目图像立体匹配算法matlab仿真,并提取图像的深度信息


    目录

    1.算法概述

    2.仿真效果预览

    3.核心MATLAB代码预览

    4.完整MATLAB程序


    1.算法概述

            全局的能量函数公式如下: E(f)=Edata(f)+Esmooth(f) 其中,Edata 表示能量函数的数据项,意为该像素只考虑自身的视差值的倾向,不考虑 邻域内其他像素的影响;N 表示匹配聚合时的支持窗口;p 表示图像中的一个像素 点;dp∈D,D 表示视差取值范围;Dp(dp)表示 p 点的视差为 dp 时的匹配代 价;Esmooth 表示能量函数的平滑项,平滑项反映了像素间视差值的影响关系。 

           针对全局立体匹配算法计算量大的问题,引入全局差错能量函数对算法进行改进.将全局差错能量函数作为立体匹配的匹配代价,同时进行跳跃式区域生长,隔点求取差错能量函数值以获取视差图,并采用均值滤波器对其做平滑处理,设置影响滤波阈值大小的容差系数,使之更适合人眼的观察.针对不同像素的彩色图像对,自适应选取容差系数得到较优的滤波后视差图.实验结果表明,改进算法在保证准确性的基础上可有效减小计算耗时,提高匹配实时性.

     

     立体匹配算法步骤

    1)匹配代价计算(Cost Computation):

           计算匹配代价,即计算参考图像上每个像素点IR(P),以所有视差可能性去匹配目标图像上对应点IT(pd)的代价值,因此计算得到的代价值可以存储在一个h*w*d(MAX)的三维数组中,通常称这个三维数组为视差空间图(Disparity Space Image,DSI)。匹配代价时立体匹配的基础,设计抗噪声干扰、对光照变化不敏感的匹配代价,能提高立体匹配的精度。因此,匹配代价的设计在全局算法和局部算法中都是研究的重点。

    2)代价聚合(Cost Aggregation)

             通常全局算法不需要代价聚合,而局部算法需要通过求和、求均值或其他方法对一个支持窗口内的匹配代价进行聚合而得到参考图像上一点p在视差d处的累积代价CA(p,d),这一过程称为代价聚合。通过匹配代价聚合,可以降低异常点的影响,提高信噪比(SNR,Signal Noise Ratio)进而提高匹配精度。代价聚合策略通常是局部匹配算法的核心,策略的好坏直接关系到最终视差图(Disparity maps)的质量。

    3)视差计算(Disparity Computation):

            局部立体匹配算法的思想,在支持窗口内聚合完匹配代价后,获取视差的过程就比较简单。通常采用‘胜者为王’策略(WTA,Winner Take All),即在视差搜索范围内选择累积代价最优的点作为对应匹配点,与之对应的视差即为所求的视差。即P点的视差为。

    4)后处理(Post Process)

            一般的,分别以左右两图为参考图像,完成上述三个步骤后可以得到左右两幅视差图像。但所得的视差图还存在一些问题,如遮挡点视差不准确、噪声点、误匹配点等存在,因此还需要对视差图进行优化,采用进一步执行后处理步骤对视差图进行修正。常用的方法有插值(Interpolation)、亚像素增强(Subpixel Enhancement)、精细化(Refinement)、图像滤波(Image Filtering)等操作。

    2.仿真效果预览

    matlab2022a仿真结果如下:

     

    3.核心MATLAB代码预览

    1. % auto-presettings for the program
    2. [m n p]=size(XR);
    3. Edis=1000000*ones(m,n);
    4. disparity=zeros(m,n);
    5. XR=double(XR);
    6. XL=double(XL);
    7. % process by increasing disparity
    8. for d=0:dmax
    9. fprintf ('Computing for disparity: %d\n',d);
    10. % composing error energy matrix for every disparity.(Algorithm step:1)
    11. for j=3+d:n-2
    12. for i=2:m-1
    13. if p==3
    14. %kareselfark(i,j-d)=(XR(i,j,1)-XL(i,j-d,1))^2+(XR(i,j,2)-XL(i,j-d,2))^2+(XR(i,j,3)-XL(i,j-d,3))^2;
    15. if matching==1
    16. %point matching
    17. ErrorEnergy(i,j-d)=(1/3)*[(XL(i,j,1)-XR(i,j-d,1))^2+(XL(i,j,2)-XR(i,j-d,2))^2+(XL(i,j,3)-XR(i,j-d,3))^2];
    18. elseif matching==2
    19. %block matching with line type window
    20. ErrorEnergy(i,j-d)=(1/15)*[(XL(i,j,1)-XR(i,j-d,1))^2+(XL(i,j,2)-XR(i,j-d,2))^2+(XL(i,j,3)-XR(i,j-d,3))^2+(XL(i,j-1,1)-XR(i,j-1-d,1))^2+(XL(i,j-1,2)-XR(i,j-1-d,2))^2+(XL(i,j-1,3)-XR(i,j-1-d,3))^2+(XL(i,j+1,1)-XR(i,j+1-d,1))^2+(XL(i,j+1,2)-XR(i,j+1-d,2))^2+(XL(i,j+1,3)-XR(i,j+1-d,3))^2+(XL(i,j-2,1)-XR(i,j-2-d,1))^2+(XL(i,j-2,2)-XR(i,j-2-d,2))^2+(XL(i,j-2,3)-XR(i,j-2-d,3))^2+(XL(i,j+2,1)-XR(i,j+2-d,1))^2+(XL(i,j+2,2)-XR(i,j+2-d,2))^2+(XL(i,j+2,3)-XR(i,j+2-d,3))^2];
    21. else
    22. top=0;
    23. for k=i-1:i+1
    24. for l=j-1:j+1
    25. top=top+(XL(k,l,1)-XR(k,l-d,1))^2+(XL(k,l,2)-XR(k,l-d,2))^2+(XL(k,l,3)-XR(k,l-d,3))^2;
    26. end
    27. end
    28. ErrorEnergy(k,l-d)=(1/27)*top;
    29. end
    30. else
    31. Disp('ERROR WARNING: Use RGB color image for stereo pair');
    32. end
    33. end
    34. end
    35. % filtering. (Algorithm step:2)
    36. ErrorEnergyFilt=IterativeAveragingFilter(ErrorEnergy,1,[4 4]);
    37. % selecting disparity which has minimum error energy.(Algorithm step:3)
    38. [m1 n1]=size(ErrorEnergyFilt);
    39. for k=1:m1
    40. for l=1:n1
    41. if Edis(k,l)>ErrorEnergyFilt(k,l)
    42. disparity(k,l)=d;
    43. Edis(k,l)=ErrorEnergyFilt(k,l);
    44. end
    45. end
    46. end
    47. end
    48. % clear 1000000 pre-setting in Edis
    49. for k=1:m
    50. for l=1:n
    51. if Edis(k,l)==1000000
    52. Edis(k,l)=0;
    53. end
    54. end
    55. end
    56. % extracting calculated zone
    57. nx=n-dmax;
    58. for k=2:m-1
    59. for l=2:nx-1
    60. disparityx(k,l)=disparity(k,l);
    61. %Edisx(k,l)=Edis(k,l);
    62. %regMapx(k,l)=regMap(k,l);
    63. XLx(k,l)=XL(k,l);
    64. XRx(k,l)=XR(k,l);
    65. top=0;
    66. for x=k-1:k+1
    67. for y=l-1:l+1
    68. top=top+(XL(x,y+disparity(k,l),1)-XR(x,y,1))^2+(XL(x,y+disparity(k,l),2)-XR(x,y,2))^2+(XL(x,y+disparity(k,l),3)-XR(x,y,3))^2;
    69. end
    70. end
    71. Ed(k,l)=(1/27)*top;
    72. end
    73. end
    74. %calculates error energy treshold for reliablity of disparity
    75. Toplam=0;
    76. for k=1:m-1
    77. for l=1:nx-1
    78. Toplam=Toplam+Ed(k,l);
    79. end
    80. end
    81. % Error threshold Ve
    82. Ve=Alfa*(Toplam/((m-1)*(nx-1)));
    83. EdReliable=Ed;
    84. disparityReliable=disparityx;
    85. Ne=zeros(m,nx);
    86. for k=1:m-1
    87. for l=1:nx-1
    88. if Ed(k,l)>Ve
    89. % sets unreliable disparity to zero
    90. disparityReliable(k,l)=0;
    91. EdReliable(k,l)=0;
    92. Ne(k,l)=1; % indicates no-estimated state
    93. end
    94. end
    95. end
    96. % calculating reliablities both raw disparity and filtered disparity
    97. TopE=0;
    98. TopER=0;
    99. Sd=0;
    100. for k=1:m-1
    101. for l=1:nx-1
    102. TopE=TopE+Ed(k,l);
    103. if Ne(k,l)==0
    104. TopER=TopER+EdReliable(k,l);
    105. Sd=Sd+1;
    106. end
    107. end
    108. end
    109. ReliablityE=((nx-1)*(m-1))/(TopE);
    110. ReliablityER=(Sd)/(TopER);
    111. % median filtering for repairment of occulations
    112. %disparityF=IterativeAveragingFilter(disparity,5,[4 4]);
    113. disparityF=medfilt2(disparityReliable,[5 5]);
    114. for k=1:m-1
    115. for l=1:nx-1
    116. % Zero disparity produce zero dept
    117. if disparityF(k,l)<5;
    118. DepthMap(k,l)=0;
    119. else
    120. DepthMap(k,l)=foc*(T/disparityF(k,l));
    121. end
    122. end
    123. end
    124. fprintf ('******** Reliablity Report ********** \n')
    125. fprintf ('Reliablity of the disparity map: %f \n',ReliablityE)
    126. fprintf ('Reliablity of the disparity map filtered: %f \n',ReliablityER)
    127. fprintf ('******** Algoritm Speed Report ********** \n')
    128. fprintf ('Time Spend for calculation: %f \n',toc)
    129. figure(1)
    130. imagesc(disparityx);colorbar;
    131. colormap('gray')
    132. title('Disparity Map')
    133. % pixval on
    134. figure(2)
    135. colormap('gray')
    136. imagesc(disparityReliable);colorbar;
    137. title('Disparity Map with Reliable Disparities')
    138. % pixval on
    139. figure(3)
    140. colormap('gray')
    141. imagesc(disparityF);colorbar;
    142. title('Median Filtered Disparity Map with Reliable Disparities')
    143. % pixval on
    144. A69

    4.完整MATLAB程序

    matlab源码说明_我爱C编程的博客-CSDN博客

    V

  • 相关阅读:
    使用AfxGetApp()->GetMainWnd()而不是AfxGetMainWnd()使得MFC主程序接收辅助线程发送的消息
    大数据之LibrA数据库系统服务部署原则及运行环境要求
    Python日期处理库:掌握时间的艺术
    用人工智能预测彩票,利用大数据预测彩票
    【附源码】计算机毕业设计SSM网上书城系统
    thingsboard之源码规则链入口
    新知识经济时代,谁在生产知识?
    搭建vue后台管理系统框架
    【Linux系统编程】进程状态
    c/c++指针从浅入深介绍——基于数据内存分配的理解(上)
  • 原文地址:https://blog.csdn.net/hlayumi1234567/article/details/127893214