• 增强拉格朗日数字图像相关和跟踪研究(Matlab代码实现)


     👨‍🎓个人主页:研学社的博客 

     

    💥💥💞💞欢迎来到本博客❤️❤️💥💥

    🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

    ⛳️座右铭:行百里者,半于九十。

    📋📋📋本文目录如下:🎁🎁🎁

    目录

    💥1 概述

    📚2 运行结果

    🌈3 Matlab代码实现

    🎉4 参考文献


    💥1 概述

    2D-AL-DIC(增强拉格朗日DIC)是一种快速并行计算的DIC算法,它还考虑了全局运动学兼容性。

    AL-DIC(增强拉格朗日DIC)是一种快速并行计算混合DIC算法,它结合了局部子集DIC方法(快速计算速度和并行计算)和基于有限元的全局DIC方法(保证全局运动学兼容性并降低噪声)的优点。

    • [1] 这是一种使用分布式并行计算的快速算法。
    • [2] 将全局运动学兼容性作为全局约束以增强拉格朗日的形式添加,并使用乘法器交替方向法方案求解。
    • [3] 位移场和仿射变形梯度同时相关。
    • [4] 选择位移平滑滤波器无需太多手动经验。

    📚2 运行结果

     也可以换上自己的图片

    部分代码:

     % ====== Deal with incremental mode ======
            fNormalizedNewIndex = ImgSeqNum-mod(ImgSeqNum-2,DICpara.ImgSeqIncUnit)-1;
            if DICpara.ImgSeqIncUnit == 1, fNormalizedNewIndex = fNormalizedNewIndex-1; end
            ResultFEMesh{1+floor(fNormalizedNewIndex/DICpara.ImgSeqIncUnit)} = ... % To save first mesh info
                struct( 'coordinatesFEM',DICmesh.coordinatesFEM,'elementsFEM',DICmesh.elementsFEM, ...
                'winsize',DICpara.winsize,'winstepsize',DICpara.winstepsize,'gridxyROIRange',DICpara.gridxyROIRange );
            
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        elseif mod(ImgSeqNum-2,DICpara.ImgSeqIncUnit) == 0 % To update ref image in incremental mode
            fNormalizedNewIndex = ImgSeqNum-mod(ImgSeqNum-2,DICpara.ImgSeqIncUnit)-1;
            if DICpara.ImgSeqIncUnit == 1,  fNormalizedNewIndex = fNormalizedNewIndex-1; end
            fNormalized = ImgNormalized{fNormalizedNewIndex}; % Update reference
            [DICpara,DICmesh] = ReadImageRefUpdate(file_name,ImgSeqNum,ResultDisp{ImgSeqNum-2}.U,DICpara,DICmesh); % Update reference image if needed;
            U0 = zeros(2*size(DICmesh.coordinatesFEM,1),1); % PlotuvInit;
            ResultFEMesh{1+floor(fNormalizedNewIndex/DICpara.ImgSeqIncUnit)} = ... % To save first mesh info
                struct( 'coordinatesFEM',DICmesh.coordinatesFEM,'elementsFEM',DICmesh.elementsFEM, ...
                'winsize',DICpara.winsize,'winstepsize',DICpara.winstepsize,'gridxyROIRange',DICpara.gridxyROIRange );
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        else % Use the solved results from the last frame as the new initial guess
            if ImgSeqNum < 7 % Import previous U for ImgSeqNum [2,6] 
                U0 = ResultDisp{ImgSeqNum-2}.U;
                 
            else % When ImgSeqNum > 6: POD predicts next disp U0 from previous results of (ImgSeqNum+[-5:1:-1])
                nTime = 5; np = length(ResultDisp{ImgSeqNum-2}.U)/2; % "nTime" value 5 is an empirical value, can be changed.
                T_data_u = zeros(nTime,np); T_data_v = zeros(nTime,np); 
                for tempi = 1:nTime
                    T_data_u(tempi,:) = ResultDisp{ImgSeqNum-(2+nTime)+tempi, 1}.U(1:2:np*2)';
                    T_data_v(tempi,:) = ResultDisp{ImgSeqNum-(2+nTime)+tempi, 1}.U(2:2:np*2)';
            
                end
                nB = 3; t_train = [ImgSeqNum-1-nTime:ImgSeqNum-2]'; t_pre = [ImgSeqNum-1]';
                [u_pred,~,~,~] = funPOR_GPR(T_data_u,t_train,t_pre,nB);
                [v_pred,~,~,~] = funPOR_GPR(T_data_v,t_train,t_pre,nB);
                tempu = u_pred(1,:); tempv = v_pred(1,:);
                U0 = [tempu(:),tempv(:)]'; U0 = U0(:);
             
                % %%%%% After running the new ImgSeqNum, you can uncomment these 
                % %%%%% lines to compare how the initial guess has been improved.  
                % Plotdisp_show(U0-ResultDisp{ImgSeqNum-1}.U,DICmesh.coordinatesFEMWorld,DICmesh.elementsFEM(:,1:4));
                % Plotdisp_show(ResultDisp{ImgSeqNum-2}.U-ResultDisp{ImgSeqNum-1}.U,DICmesh.coordinatesFEMWorld,DICmesh.elementsFEM(:,1:4));
            end
        end
        
        % ====== Compute f(X)-g(x+u) ======
        % PlotImgDiff(x0,y0,u,v,fNormalized,gNormalized);
        ResultFEMeshEachFrame{ImgSeqNum-1} = struct( 'coordinatesFEM',DICmesh.coordinatesFEM,'elementsFEM',DICmesh.elementsFEM);
        fprintf('------------ Section 3 Done ------------ \n \n')
        
        
        %% Section 4: Subproblem 1 -or- Local ICGN Subset DIC
        fprintf('------------ Section 4 Start ------------ \n')
        % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        % This section is to solve the first local step in ALDIC: Subproblem 1
        % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        
        % ====== ALStep 1 Subproblem1: Local Subset DIC ======
        mu=0; beta=0; tol=1e-2; ALSolveStep=1; ALSub1Time=zeros(6,1); ALSub2Time=zeros(6,1); 
        ConvItPerEle=zeros(size(DICmesh.coordinatesFEM,1),6); ALSub1BadPtNum=zeros(6,1);
        disp(['***** Start step',num2str(ALSolveStep),' Subproblem1 *****'])
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        % ------ Start Local DIC IC-GN iteration ------
        [USubpb1,FSubpb1,HtempPar,ALSub1Timetemp,ConvItPerEletemp,LocalICGNBadPtNumtemp] = ...
            LocalICGN(U0,DICmesh.coordinatesFEM,Df,fNormalized,gNormalized,DICpara,'GaussNewton',tol);
        ALSub1Time(ALSolveStep) = ALSub1Timetemp; ConvItPerEle(:,ALSolveStep) = ConvItPerEletemp; ALSub1BadPtNum(ALSolveStep) = LocalICGNBadPtNumtemp; toc
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        % ------  Manually find some bad points from Local Subset ICGN step ------
        % Comment these lines below if you don't need to manually remove local bad points
        % %%%%% Comment START %%%%%   
            close all; USubpb1World = USubpb1; USubpb1World(2:2:end) = -USubpb1(2:2:end);
            Plotuv(USubpb1World,DICmesh.x0,DICmesh.y0World);
            disp('--- Start to manually remove bad points ---')
            u = reshape(USubpb1(1:2:end),size(DICmesh.x0,1),size(DICmesh.x0,2)); 
            v = reshape(USubpb1(2:2:end),size(DICmesh.x0,1),size(DICmesh.x0,2));
            [u,v,~,Local_BadptRow,Local_BadptCol,RemoveOutliersList] = funRemoveOutliers(u',v',[],0.5,100); u=u';v=v';
            USubpb1(1:2:end) = reshape(u,size(DICmesh.coordinatesFEM,1),1); USubpb1(2:2:end) = reshape(v,size(DICmesh.coordinatesFEM,1),1);
            f11 = reshape(FSubpb1(1:4:end),size(DICmesh.x0,1),size(DICmesh.x0,2)); 
            f21 = reshape(FSubpb1(2:4:end),size(DICmesh.x0,1),size(DICmesh.x0,2));
            f12 = reshape(FSubpb1(3:4:end),size(DICmesh.x0,1),size(DICmesh.x0,2)); 
            f22 = reshape(FSubpb1(4:4:end),size(DICmesh.x0,1),size(DICmesh.x0,2));
            f11=f11'; f11(RemoveOutliersList) = NaN; f11 = inpaint_nans(f11,4); f11=f11';  
            f21=f21'; f21(RemoveOutliersList) = NaN; f21 = inpaint_nans(f21,4); f21=f21'; 
            f12=f12'; f12(RemoveOutliersList) = NaN; f12 = inpaint_nans(f12,4); f12=f12'; 
            f22=f22'; f22(RemoveOutliersList) = NaN; f22 = inpaint_nans(f22,4); f22=f22';
            FSubpb1(1:4:end) = reshape(f11,size(DICmesh.coordinatesFEM,1),1); 
            FSubpb1(2:4:end) = reshape(f21,size(DICmesh.coordinatesFEM,1),1);
            FSubpb1(3:4:end) = reshape(f12,size(DICmesh.coordinatesFEM,1),1); 
            FSubpb1(4:4:end) = reshape(f22,size(DICmesh.coordinatesFEM,1),1);
            disp('--- Remove bad points done ---')
        % %%%%% Comment END %%%%%
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
         
        % ------ Plot ------
        USubpb1World = USubpb1; USubpb1World(2:2:end) = -USubpb1(2:2:end); 
        FSubpb1World = FSubpb1; FSubpb1World(2:4:end) = -FSubpb1World(2:4:end); FSubpb1World(3:4:end) = -FSubpb1World(3:4:end); 
        close all; Plotuv(USubpb1World,DICmesh.x0,DICmesh.y0World); 
        Plotdisp_show(USubpb1World,DICmesh.coordinatesFEMWorld,DICmesh.elementsFEM,[],'NoEdgeColor');
        Plotstrain_show(FSubpb1World,DICmesh.coordinatesFEMWorld,DICmesh.elementsFEM,[],'NoEdgeColor');
        save(['Subpb1_step',num2str(ALSolveStep)],'USubpb1','FSubpb1');
        fprintf('------------ Section 4 Done ------------ \n \n')
        
        
        %% Section 5: Subproblem 2 -- solve the global compatible displacement field
        fprintf('------------ Section 5 Start ------------ \n'); tic;
        % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        % This section is to solve the global step in ALDIC Subproblem 2
        % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        
        % ======= ALStep 1 Subproblem 2: Global constraint =======
        % ------ Smooth displacements for a better F ------
        DICpara.DispFilterSize=0; DICpara.DispFilterStd=0; DICpara.StrainFilterSize=0; DICpara.StrainFilterStd=0; LevelNo=1;
        FSubpb1 = funSmoothStrain(FSubpb1,DICmesh,DICpara);
        
        % ====== Define penalty parameter ======
        mu = 1e-3; udual = 0*FSubpb1; vdual = 0*USubpb1;
        betaList = [1e-3,sqrt(1e-5),1e-2,sqrt(1e-3),1e-1,sqrt(1e-1)]*mean(DICpara.winstepsize).^2.*mu; % Tune beta in the betaList
        Err1 = zeros(length(betaList),1); Err2 = Err1;
        

    🌈3 Matlab代码实现

    🎉4 参考文献

    部分理论来源于网络,如有侵权请联系删除。

    • [1] For full details, and to use this code, please cite our paper: Yang, J. and Bhattacharya, K. Augmented Lagrangian Digital Image Correlation. Exp.Mech. 59: 187, 2018. https://doi.org/10.1007/s11340-018-00457-0. Full text can be requested at: 
    • [2] Yang, J. (2019, March 6). 2D_ALDIC (Version 3.3). CaltechDATA. 
       
    • [3] Yang, J. and Bhattacharya, K. Combining Image Compression with Digital Image Correlation. Exp.Mech. 59: 629-642, 2019. . Full text can be requested at: 
    • [4] Finite-element-based Global DIC code is also available at: 
    • [5] Besides 2D-DIC, our new code "ALDVC" (augmented Lagrangian Digital Volume Correlation) to track deformations in volumetric images is also available:

  • 相关阅读:
    制作一个简单HTML个人网页网页(HTML+CSS)大话西游之大圣娶亲电影网页设计
    MySQL表的增删改查初阶(上篇)
    Feign-Hystrix 熔断降级,一文看透本质
    Airpods的电池健不健康不直观,但例行检查很重要!如何检查Airpods的电池健康状况
    【数据结构-栈】栈基础
    数据结构树与二叉树的实现
    玩家最关心的绝地求生游戏作战干货大揭秘,助你击败敌人登顶王者!
    在C++和C中static关键字的用法,在C++和C中const关键字的用法
    3交换机的配置与使用
    超市促销叫卖的语音是怎么做的?介绍简单小方法,方便又快捷
  • 原文地址:https://blog.csdn.net/weixin_46039719/article/details/128177657