NIFTI_20090325/rri_orient.m
87b08fd7
 %  Convert image of different orientations to standard Analyze orientation
 %
 %  Usage: nii = rri_orient(nii);
 
 %  Jimmy Shen (jimmy@rotman-baycrest.on.ca), 26-APR-04
 %___________________________________________________________________
 
 function [nii, orient, pattern] = rri_orient(nii, varargin)
 
    if nargin > 1
       pattern = varargin{1};
    else
       pattern = [];
    end
 
    orient = [1 2 3];
    dim = double(nii.hdr.dime.dim([2:4]));
 
    if ~isempty(pattern) & ~isequal(length(pattern), prod(dim))
       return;
    end
 
    %  get orient of the current image
    %
    orient = rri_orient_ui;
    pause(.1);
 
    %  no need for conversion
    %
    if isequal(orient, [1 2 3])
       return;
    end
 
    if isempty(pattern)
       pattern = 1:prod(dim);
    end
 
    pattern = reshape(pattern, dim);
    img = nii.img;
 
    %  calculate after flip orient
    %
    rot_orient = mod(orient + 2, 3) + 1;
 
    %  do flip:
    %
    flip_orient = orient - rot_orient;
 
    for i = 1:3
       if flip_orient(i)
          pattern = flipdim(pattern, i);
          img = flipdim(img, i);
       end
    end
 
    %  get index of orient (do inverse)
    %
    [tmp rot_orient] = sort(rot_orient);
 
    %  do rotation:
    %
    pattern = permute(pattern, rot_orient);
    img = permute(img, [rot_orient 4 5 6]);
 
    %  rotate resolution, or 'dim'
    %
    new_dim = nii.hdr.dime.dim([2:4]);
    new_dim = new_dim(rot_orient);
    nii.hdr.dime.dim([2:4]) = new_dim;
 
    %  rotate voxel_size, or 'pixdim'
    %
    tmp = nii.hdr.dime.pixdim([2:4]);
    tmp = tmp(rot_orient);
    nii.hdr.dime.pixdim([2:4]) = tmp;
 
    %  re-calculate originator
    %
    tmp = nii.hdr.hist.originator([1:3]);
    tmp = tmp(rot_orient);
    flip_orient = flip_orient(rot_orient);
 
    for i = 1:3
       if flip_orient(i) & ~isequal(double(tmp(i)), 0)
          tmp(i) = int16(double(new_dim(i)) - double(tmp(i)) + 1);
       end
    end
 
    nii.hdr.hist.originator([1:3]) = tmp;
 
    nii.img = img;
    pattern = pattern(:);
 
    return;						% rri_orient