⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mlsd2dpointsprecompute.m

📁 meshless method programme for moving least square approximation
💻 M
字号:
function mlsd = MLSD2DpointsPrecompute(varargin)% MLSD2DPOINTSPRECOMPUTE  Generates a 2D MLSD structure.%% function mlsd = MLSD2DpointsPrecompute(p,v,type,a)%%  This function precomputes a set of values and generate an MLSD structure% that embeds infos about the deformation algorithm to be used and embeds% the parameters that must be used for the process. This function allows to% initialize a deformation process of one or more an images. For more% informations see [1].%%  [1] "Image Deformation Using Moving Least Squares",%      Scott Schaefer, Travis McPhail, Joe Warren%%  Parameters%  ----------% IN:%  p    = The starting position of the handles points.%  v    = The points to be moved (i.e. a grid).%  type = The algorithm type ('affine','similar','rigid'). (def='rigid')%  a    = The order. (def=2)% Parsing parameters:[p,v,type,a] = ParseParams(varargin{:});% Precomputing the weights:w = PrecomputeWeights(p,v,a);% Preparing the structure:mlsd.p = p;mlsd.v = v;mlsd.type = type;mlsd.w = w;mlsd.constr = 'points';% Selecting the generation function:switch type    case 'affine'        mlsd.data = PrecomputeAffine(p,v,w);    case 'similar'        mlsd.data = PrecomputeSimilar(p,v,w);    case 'rigid'        mlsd.data = PrecomputeRigid(p,v,w);end% ------------------------ LOCAL FUNCTIONS ------------------------% Precomputing the weights:function w = PrecomputeWeights(p,v,a)% Preparing the output buffer:w = zeros(size(p,2),size(v,2));% Iterating on handles:for i=1:size(p,2)    % Precomputing the norms^2:    norms_2 = sum((repmat(p(:,i),[1,size(v,2)])-v).^2,1);        % Precomputing the weights:    w(i,:) = 1./(norms_2.^a+1e-8);end% -----------------------------------------------------------------% Precomputing weighted centroids:function Pstar = PrecomputeWCentroids(p,w)% Computing the centroids:Pstar = (p*w)./repmat(sum(w,1),[size(p,1),1]);% -----------------------------------------------------------------% Precomputing the affine deformation:function data = PrecomputeAffine(p,v,w)% Computing the centroids:Pstar = PrecomputeWCentroids(p,w);% Precomputing the first matrix:M1 = v - Pstar;% Allocating the central matrix:a = zeros(1,size(Pstar,2));b = a;d = a;% Iterating on points:Phat = cell(1,size(p,2));for i=1:size(p,2)    % Computing the hat points:    Phat{i} = repmat(p(:,i),[1,size(Pstar,2)])-Pstar;        % Computing the matrix elements:    a = a + w(i,:).*Phat{i}(1,:).^2;    b = b + w(i,:).*Phat{i}(1,:).*Phat{i}(2,:);    d = d + w(i,:).*Phat{i}(2,:).^2;end% Computing the determinant:det = a.*d - b.^2;% Computing the inverse:Ia = d./det;Ib = -b./det;Id = a./det;% Computing the first product elements:F1 = [sum(M1.*[Ia;Ib],1);sum(M1.*[Ib;Id],1)];% Computing the A values:A = zeros(size(p,2),size(Pstar,2));for j=1:size(p,2)    % A single element:    A(j,:) = sum(F1.*Phat{j},1).*w(j,:);end% The data structure:data.A = A;% -----------------------------------------------------------------% Precomputing the Asimilar:function [A,R1] = PrecomputeA(Pstar,Phat,v,w)% Allocating:A = cell(1,numel(Phat));% Fixed part:R1 = v - Pstar;R2 = [R1(2,:);-R1(1,:)];% Iterating on points:for i=1:numel(Phat)    % Precomputing the blocks:    L1 = Phat{i};    L2 = [L1(2,:);-L1(1,:)];    % Computing the values:    A{i}.a = w(i,:).*sum(L1.*R1,1);    A{i}.b = w(i,:).*sum(L1.*R2,1);    A{i}.c = w(i,:).*sum(L2.*R1,1);    A{i}.d = w(i,:).*sum(L2.*R2,1);end% -----------------------------------------------------------------% Precomputing the similar deformation:function data = PrecomputeSimilar(p,v,w)% Computing the centroids:Pstar = PrecomputeWCentroids(p,w);% Iterating on points:Phat = cell(1,size(p,2));mu = zeros(1,size(Pstar,2));for i=1:size(p,2)    % Computing the hat points:    Phat{i} = repmat(p(:,i),[1,size(Pstar,2)])-Pstar;        % Updating the values of mu:    mu = mu + w(i,:).*sum(Phat{i}.^2,1);end% Computing the matrix A:A = PrecomputeA(Pstar,Phat,v,w);% Premultiplying A/mu:for i=1:numel(A)    % Managing a single matrix:    A{i}.a = A{i}.a./mu;    A{i}.b = A{i}.b./mu;    A{i}.c = A{i}.c./mu;    A{i}.d = A{i}.d./mu;end% The data structure:data.A = A;% -----------------------------------------------------------------% Precomputing the similar deformation:function data = PrecomputeRigid(p,v,w)% Computing the centroids:Pstar = PrecomputeWCentroids(p,w);% Iterating on points:Phat = cell(1,size(p,2));for i=1:size(p,2)    % Computing the hat points:    Phat{i} = repmat(p(:,i),[1,size(Pstar,2)])-Pstar;end% Computing the matrix A and v-Pstar:[A,v_Pstar] = PrecomputeA(Pstar,Phat,v,w);% The norm of v-Pstar:normof_v_Pstar = sqrt(sum(v_Pstar.^2,1));% The data structure:data.A = A;data.normof_v_Pstar = normof_v_Pstar;% -----------------------------------------------------------------% Parsing of parameters:function [p,v,type,a] = ParseParams(varargin)% Number of parameters:if nargin<2 error('Too few parameters'); endif nargin>4 error('Too many parameters'); end% Set up variables:varnames = {'p','v','type','a'};for ind=1:nargin    eval([varnames{ind} ' = varargin{ind} ;']);end% Default parameters:if nargin<3 type='rigid'; endif nargin<4 a=2; end% Checking the points p and v:p = points2dnormalize(p);v = points2dnormalize(v);% Checking the value of a:a = abs(a);if a==0    a = 1e-8;end% Check type param:if ~strin(type,{'affine','similar','rigid'})    error('Unknown algorithm type!');end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -