• 基于Lucas-Kanade算法的三维光流提取matlab仿真


    目录

    1.算法描述

    2.仿真效果预览

    3.MATLAB核心程序

    4.完整MATLAB


    1.算法描述

    光流的概念:(Optical flow or optic flow)
           它是一种运动模式,这种运动模式指的是一个物体、表面、边缘在一个视角下由一个观察者(比如眼睛、摄像头等)和背景之间形成的明显移动。光流技术,如运动检测和图像分割,时间碰撞,运动补偿编码,三维立体视差,都是利用了这种边缘或表面运动的技术。

    二维图像的移动相对于观察者而言是三维物体移动的在图像平面的投影。
    有序的图像可以估计出二维图像的瞬时图像速率或离散图像转移。

    光流算法:
          它评估了两幅图像的之间的变形,它的基本假设是体素和图像像素守恒。它假设一个物体的颜色在前后两帧没有巨大而明显的变化。基于这个思路,我们可以得到图像约束方程。不同的光流算法解决了假定了不同附加条件的光流问题。

    Lucas–Kanade算法:
          这个算法是最常见,最流行的。它计算两帧在时间t 到t + δt之间每个每个像素点位置的移动。 由于它是基于图像信号的泰勒级数,这种方法称为差分,这就是对于空间和时间坐标使用偏导数。
    图像约束方程可以写为I (x ,y ,z ,t ) = I (x + δx ,y + δy ,z + δz ,t + δt )
    I(x, y,z, t) 为在(x,y,z)位置的体素。

    我们假设移动足够的小,那么对图像约束方程使用泰勒公式,我们可以得到:

    H.O.T. 指更高阶,在移动足够小的情况下可以忽略。从这个方程中我们可以得到:

    2.仿真效果预览

    matlab2022a仿真如下:

    3.MATLAB核心程序

    1. function [ux,uy,uz]=LK3D( image1, image2, r )
    2. %This function estimates deformations between two subsequent 3-D images
    3. % June 2012
    4. % Default parameter
    5. if nargin==2
    6. r=2;
    7. end
    8. [height,width,depth]=size(image1);
    9. image1=im2double(image1);
    10. image2=im2double(image2);
    11. % Initializing flow vectors
    12. ux=zeros(size(image1)); uy=ux; uz=ux;
    13. % Computing image derivatives
    14. [Ix,Iy,Iz,It]=imageDerivatives3D(image1,image2);
    15. for i=(r+1):(height-r)
    16. for j=(r+1):(width-r)
    17. for k=(r+1):(depth-r)
    18. blockofIx=Ix(i-r:i+r,j-r:j+r,k-r:k+r);
    19. blockofIy=Iy(i-r:i+r,j-r:j+r,k-r:k+r);
    20. blockofIz=Iz(i-r:i+r,j-r:j+r,k-r:k+r);
    21. blockofIt=It(i-r:i+r,j-r:j+r,k-r:k+r);
    22. A=zeros(3,3);
    23. B=zeros(3,1);
    24. A(1,1)=sum(sum(sum(blockofIx.^2)));
    25. A(1,2)=sum(sum(sum(blockofIx.*blockofIy)));
    26. A(1,3)=sum(sum(sum(blockofIx.*blockofIz)));
    27. A(2,1)=sum(sum(sum(blockofIy.*blockofIx)));
    28. A(2,2)=sum(sum(sum(blockofIy.^2)));
    29. A(2,3)=sum(sum(sum(blockofIy.*blockofIz)));
    30. A(3,1)=sum(sum(sum(blockofIz.*blockofIx)));
    31. A(3,2)=sum(sum(sum(blockofIz.*blockofIy)));
    32. A(3,3)=sum(sum(sum(blockofIz.^2)));
    33. B(1,1)=sum(sum(sum(blockofIx.*blockofIt)));
    34. B(2,1)=sum(sum(sum(blockofIy.*blockofIt)));
    35. B(3,1)=sum(sum(sum(blockofIz.*blockofIt)));
    36. invofA=pinv(A);
    37. V=invofA*(-B);
    38. ux(i,j,k)=V(1,1);
    39. uy(i,j,k)=V(2,1);
    40. uz(i,j,k)=V(3,1);
    41. end
    42. end
    43. end
    44. end
    45. a92

    4.完整MATLAB

    V

  • 相关阅读:
    TCP协议
    前端页面大小自适应的问题
    【Xilinx AX7103 MicroBalze学习笔记6】MicroBlaze 自定义 IP 核封装实验
    Ubuntu22.04 安装配置流水账
    第二章-使用KNN和GBDT进行收入的预测分析
    Java方法的使用
    全网营销如何落地?全网营销的途径有哪些?
    面试突击:说一下 Spring 中 Bean 的生命周期?
    基于 Transformer 的中文对联生成器
    IC设计职位介绍|如何成为一名合格的数字前端设计工程师?
  • 原文地址:https://blog.csdn.net/hlayumi1234567/article/details/128192242