You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: imtransform2.m
    path of file: ./repos/toolbox/images
    
    the code of the file until where you have to start completion: function J = imtransform2( I, H, varargin )
% Applies a linear or nonlinear transformation to an image I.
%
% Takes the center of the image as the origin, not the top left corner.
% Also, the coordinate system is row/column format, so H must be also.
%
% The bounding box of the image is set by the BBOX argument, a string that
% can be 'loose' (default) or 'crop'. When BBOX is 'loose', J includes the
% whole transformed image, which generally is larger than I. When BBOX is
% 'crop' J is cropped to include only the central portion of the
% transformed image and is the same size as I. The 'loose' flag is
% currently inexact (because of some padding/cropping). Preserves I's type.
%
% USAGE
%  J = imtransform2( I, H, varargin )
%
% INPUTS - common
%  I          - input image [converted to double]
%  H          - 3x3 nonsingular homography matrix
%  varargin   - additional params (struct or name/value pairs)
%    .method    - ['linear'] 'nearest', 'spline', 'cubic' (for interp2)
%    .bbox      - ['crop'] or 'loose'
%    .show      - [0] figure to use for optional display
%    .pad       - [0] padding value (scalar, 'replicate' or 'none')
%    .useCache  - [0] optionally cache precomp. for given transform/dims.
%    .us        - [] can specify source r/c for each target (instead of H)
%    .vs        - [] can specify source r/c for each target (instead of H)
%
% OUTPUTS
%  J       - transformed image
%
% EXAMPLE - rigid transformation (rotation + translation)
%  I=imread('peppers.png');
%  R = rotationMatrix(pi/4); T=[1; 3]; H=[R T; 0 0 1];
%  J = imtransform2(I,H,'show',1,'pad','replicate');
%
% EXAMPLE - general homography (out of plane rotation)
%  load trees; I=X;
%  S=eye(3); S([1 5])=1/500; % zoom out 500 pixels
%  H=S^-1*rotationMatrix([0 1 0],pi/4)*S;
%  J = imtransform2(I,H,'bbox','loose','show',1);
%
% EXAMPLE - rotation using three approaches (and timing)
%  load trees; I=imResample(X,4); angle=35; method='bilinear';
%  % (1) rotate using imrotate (slow)
%  tic; J1 = imrotate(I,angle,method,'crop'); toc
%  % (2) rotate using a homography matrix
%  R=rotationMatrix(angle/180*pi); H=[R [0; 0]; 0 0 1];
%  tic; J2 = imtransform2(I,H,'bbox','crop','method',method); toc
%  % (3) rotate by explicitly specifying target rs/cs
%  m=size(I,1)+4; n=size(I,2)+4; m2=(m-1)/2; n2=(n-1)/2;
%  [cs,rs]=meshgrid(-n2:n2,-m2:m2); vs=R*[cs(:) rs(:)]';
%  us=reshape(vs(2,:),m,n)-rs; vs=reshape(vs(1,:),m,n)-cs;
%  tic, J3=imtransform2(I,[],'us',us,'vs',vs,'method',method); toc
%  % compare all results
%  figure(1); clf; subplot(3,2,1); im(I); subplot(3,2,2); im(J1);
%  subplot(3,2,3); im(J2); subplot(3,2,4); im(abs(J1-J2)); title('J1-J2')
%  subplot(3,2,5); im(J3); subplot(3,2,6); im(abs(J2-J3)); title('J2-J3')
%
% See also TEXTUREMAP, INTERP2
%
% Piotr's Computer Vision Matlab Toolbox      Version 3.01

    
function J = imtransform2( I, H, varargin )
% Applies a linear or nonlinear transformation to an image I.
%
% Takes the center of the image as the origin, not the top left corner.
% Also, the coordinate system is row/column format, so H must be also.
%
% The bounding box of the image is set by the BBOX argument, a string that
% can be 'loose' (default) or 'crop'. When BBOX is 'loose', J includes the
% whole transformed image, which generally is larger than I. When BBOX is
% 'crop' J is cropped to include only the central portion of the
% transformed image and is the same size as I. The 'loose' flag is
% currently inexact (because of some padding/cropping). Preserves I's type.
%
% USAGE
%  J = imtransform2( I, H, varargin )
%
% INPUTS - common
%  I          - input image [converted to double]
%  H          - 3x3 nonsingular homography matrix
%  varargin   - additional params (struct or name/value pairs)
%    .method    - ['linear'] 'nearest', 'spline', 'cubic' (for interp2)
%    .bbox      - ['crop'] or 'loose'
%    .show      - [0] figure to use for optional display
%    .pad       - [0] padding value (scalar, 'replicate' or 'none')
%    .useCache  - [0] optionally cache precomp. for given transform/dims.
%    .us        - [] can specify source r/c for each target (instead of H)
%    .vs        - [] can specify source r/c for each target (instead of H)
%
% OUTPUTS
%  J       - transformed image
%
% EXAMPLE - rigid transformation (rotation + translation)
%  I=imread('peppers.png');
%  R = rotationMatrix(pi/4); T=[1; 3]; H=[R T; 0 0 1];
%  J = imtransform2(I,H,'show',1,'pad','replicate');
%
% EXAMPLE - general homography (out of plane rotation)
%  load trees; I=X;
%  S=eye(3); S([1 5])=1/500; % zoom out 500 pixels
%  H=S^-1*rotationMatrix([0 1 0],pi/4)*S;
%  J = imtransform2(I,H,'bbox','loose','show',1);
%
% EXAMPLE - rotation using three approaches (and timing)
%  load trees; I=imResample(X,4); angle=35; method='bilinear';
%  % (1) rotate using imrotate (slow)
%  tic; J1 = imrotate(I,angle,method,'crop'); toc
%  % (2) rotate using a homography matrix
%  R=rotationMatrix(angle/180*pi); H=[R [0; 0]; 0 0 1];
%  tic; J2 = imtransform2(I,H,'bbox','crop','method',method); toc
%  % (3) rotate by explicitly specifying target rs/cs
%  m=size(I,1)+4; n=size(I,2)+4; m2=(m-1)/2; n2=(n-1)/2;
%  [cs,rs]=meshgrid(-n2:n2,-m2:m2); vs=R*[cs(:) rs(:)]';
%  us=reshape(vs(2,:),m,n)-rs; vs=reshape(vs(1,:),m,n)-cs;
%  tic, J3=imtransform2(I,[],'us',us,'vs',vs,'method',method); toc
%  % compare all results
%  figure(1); clf; subplot(3,2,1); im(I); subplot(3,2,2); im(J1);
%  subplot(3,2,3); im(J2); subplot(3,2,4); im(abs(J1-J2)); title('J1-J2')
%  subplot(3,2,5); im(J3); subplot(3,2,6); im(abs(J2-J3)); title('J2-J3')
%
% See also TEXTUREMAP, INTERP2
%
% Piotr's Computer Vision Matlab Toolbox      Version 3.01
% Copyright 2014 Piotr Dollar.  [pdollar-at-gmail.com]
% Licensed under the Simplified BSD License [see external/bsd.txt]

% check and parse inputs
dfs={'method','linear','bbox','crop','show',0,'pad',0,'useCache',0,...
  'us',[],'vs',[]};
[method,bbox,show,pad,useCache,us,vs] = getPrmDflt(varargin,dfs,1);
looseFlag = strcmp(bbox,'loose'); if(show), Iorig=I; end