Skip to content
Snippets Groups Projects
Transformation.m 18.3 KiB
Newer Older
  • Learn to ignore specific revisions
  • bepi's avatar
    bepi committed
    %% The code is written by Behnaz Pirzamanbein, bepi@dtu.dk last version 2020.08.04
    %% Transformation
    
    addpath(genpath('.\Functions'))
    
    bepi's avatar
    bepi committed
    
    samples = {'out_out_CD','out_out_MD','in_in_CD','in_in_MD'};
    layer_name = {'outer','inner'};
    
    %% move the mesh between the degree
    % go from 
    % 0dg 2D (points) to 0dg 2D in 180 then 0dg 3D in 180 -> T0 transform then G180 transform
    %  -   -             -   -         then T45 inverse 2D 0dg to 45 space then G45
    %  -   -             -   -         then T90 inverse 2D 0dg to 90 space then G90
    % this gives us the representation of 0 degree in 45 90 and 180
    load_folder_Reg = 'Results\registration\layer\';
    load_folder_layers = 'Results\layer\';
    
    save_folder =  'Results\layer\transfer\0dg_rest\';
    if ~exist(save_folder,'dir')
        mkdir(save_folder)
    end
    
    % if you want to run the measure separately you can use the for loop
    %for i = 1:4
        sample = samples{i};
        disp(['Load Data ',sample])
                
        % registrtaion
        ref = load(['Results\registration\tform\reg_tfrom_inner_',sample]);
        sz180 = size(ref.dg180_inner);
        sz90 = size(ref.dg90_inner);
        sz45 = size(ref.dg45_inner);
        sz0 = size(ref.dg0_inner);
        
        % T
        tform0 = ref.Reg_dg0_inner.Transformation;
        tform45 = ref.Reg_dg45_inner.Transformation;
        tform90 = ref.Reg_dg90_inner.Transformation;
        
        % location of the mesh (points) in 180 degree;
        dg180 = load([load_folder_Reg,'Reg_inner_points_',sample,'_180']);
        dg0 = load([load_folder_Reg,'Reg_inner_points_',sample,'_0']);
        dg45 = load([load_folder_Reg,'Reg_inner_points_',sample,'_45']);
        dg90 = load([load_folder_Reg,'Reg_inner_points_',sample,'_90']);
        
        % meshes in 3D as reference for G transform
        inner180 = load([load_folder_layers,'inner_converted_layer_',sample,'_180']); % 3D surface
        outer180 = load([load_folder_layers,'outer_converted_layer_',sample,'_180']); % 3D surface
        
        inner90 = load([load_folder_layers,'inner_converted_layer_',sample,'_90']); % 3D surface
        outer90 = load([load_folder_layers,'outer_converted_layer_',sample,'_90']); % 3D surface
        
        inner45 = load([load_folder_layers,'inner_converted_layer_',sample,'_45']); % 3D surface
        outer45 = load([load_folder_layers,'outer_converted_layer_',sample,'_45']); % 3D surface
        
        inner0 = load([load_folder_layers,'inner_converted_layer_',sample,'_0']); % 3D surface
        outer0 = load([load_folder_layers,'outer_converted_layer_',sample,'_0']); % 3D surface
        
        % 2D of 0dg T0 to 2D 180 dg -> 2D of 0 dg in 180 space to 3D of 0 dg in 180 space
        [inner_surface_0_180, outer_surface_0_180] = extrapolate_mesh(dg0.points,sz0,inner180,outer180,sz180);% this is equavalnt of reading load('['Results\layer\transfer\',sample,'_transfomred_90to180']')
        % to 45
        for s = 1:2
            [p_0to45(:,1,s), p_0to45(:,2,s)] = transformPointsInverse(tform45, dg0.points(:,1,s), dg0.points(:,2,s));
        end
        [inner_surface_0_45, outer_surface_0_45] = extrapolate_mesh(p_0to45,sz0,inner45,outer45,sz45);% this is equavalnt of reading load('['Results\layer\transfer\',sample,'_transfomred_90to180']')
        % 90
        for s = 1:2
            [p_0to90(:,1,s), p_0to90(:,2,s)] = transformPointsInverse(tform90, dg0.points(:,1,s), dg0.points(:,2,s));
        end
        [inner_surface_0_90, outer_surface_0_90] = extrapolate_mesh(p_0to90,sz0,inner90,outer90,sz90);% this is equavalnt of reading load('['Results\layer\transfer\',sample,'_transfomred_90to180']')
        
        if flag_fig
            p = 10;
            % outer
            for s = 1:2
                figure
                title([sample,' outer 0 to 45,90,180 dg surface: ',s])
                surf(outer_surface_0_180(1:p:end,1:p:end,1,s),outer_surface_0_180(1:p:end,1:p:end,2,s),outer_surface_0_180(1:p:end,1:p:end,3,s),...
                    'EdgeColor','k','FaceColor','none','FaceAlpha',0.6, 'FaceLighting','phong')
                hold on 
                surf(outer_surface_0_45(1:p:end,1:p:end,1,s),outer_surface_0_45(1:p:end,1:p:end,2,s),outer_surface_0_45(1:p:end,1:p:end,3,s),...
                    'EdgeColor','r','FaceColor','none','FaceAlpha',0.6, 'FaceLighting','phong')
                surf(outer_surface_0_90(1:p:end,1:p:end,1,s),outer_surface_0_90(1:p:end,1:p:end,2,s),outer_surface_0_90(1:p:end,1:p:end,3,s),...
                    'EdgeColor','g','FaceColor','none','FaceAlpha',0.6, 'FaceLighting','phong')
    
                surf(outer0.surface_XYZ(1:p:end,1:p:end,1,s),outer0.surface_XYZ(1:p:end,1:p:end,2,s),outer0.surface_XYZ(1:p:end,1:p:end,3,s),...
                    'EdgeColor','b','FaceColor','none','FaceAlpha',0.6, 'FaceLighting','phong')
                saveas(gcf,[save_folder,sample,'_outer_s',int2str(s),'.png'])
                
                % inner
                figure
                title([sample,' inner 0 to 45,90,180 dg surface: ',s])
                surf(inner_surface_0_180(1:p:end,1:p:end,1,s),inner_surface_0_180(1:p:end,1:p:end,2,s),inner_surface_0_180(1:p:end,1:p:end,3,s),...
                    'EdgeColor','k','FaceColor','none','FaceAlpha',0.6, 'FaceLighting','phong')
                hold on 
                surf(inner_surface_0_45(1:p:end,1:p:end,1,s),inner_surface_0_45(1:p:end,1:p:end,2,s),inner_surface_0_45(1:p:end,1:p:end,3,s),...
                    'EdgeColor','r','FaceColor','none','FaceAlpha',0.6, 'FaceLighting','phong')
                surf(inner_surface_0_90(1:p:end,1:p:end,1,s),inner_surface_0_90(1:p:end,1:p:end,2,s),inner_surface_0_90(1:p:end,1:p:end,3,s),...
                    'EdgeColor','g','FaceColor','none','FaceAlpha',0.6, 'FaceLighting','phong')
    
                surf(inner0.surface_XYZ(1:p:end,1:p:end,1,s),inner0.surface_XYZ(1:p:end,1:p:end,2,s),inner0.surface_XYZ(1:p:end,1:p:end,3,s),...
                    'EdgeColor','b','FaceColor','none','FaceAlpha',0.6, 'FaceLighting','phong')
                saveas(gcf,[save_folder,sample,'_inner_s',int2str(s),'.png'])
                
            end
        end
        if flag_save
            save([save_folder,sample],'inner0','outer0','inner_surface_0_45', 'outer_surface_0_45','inner_surface_0_90', 'outer_surface_0_90','inner_surface_0_180', 'outer_surface_0_180')
        end
        clear p_0to45 p_0to90 inner_surface_0_180 outer_surface_0_180 inner_surface_0_45 outer_surface_0_45 inner_surface_0_90 outer_surface_0_90
    %end
    
    %% move 90,45,0 dg to 180 dg 
    load_folder_Reg = 'Results\registration\layer\';
    load_folder_layers = 'Results\layer\';
    
    save_folder =  'Results\layer\transfer\all_to_180dg\';
    if ~exist(save_folder,'dir')
        mkdir(save_folder)
    end
    
    % if you want to run the measure separately you can use the for loop
    %for i = 1:4
        sample = samples{i};
        disp(['Load Data ',sample])
                
        % registrtaion
        ref = load(['Results\registration\tform\reg_tfrom_inner_',sample]);
        
        % location of the mesh (points); this is same for inner and outer but
        % the interpolation value of 180 is different
        %dg180 = load(['Results\registration\layer\Reg_inner_points_',sample,'_180']);
        dg0 = load([load_folder_Reg,'Reg_inner_points_',sample,'_0']);
        dg45 = load([load_folder_Reg,'Reg_inner_points_',sample,'_45']);
        dg90 = load([load_folder_Reg,'Reg_inner_points_',sample,'_90']);
        
        %% extrapolate from 2D into 3D --- 90,45,0 dg to 180 dg:
        %load(['Results\layer\stitched\smoothed_layers_',sample,'_180'])% smooth 3D surface
        inner = load([load_folder_layers,'inner_converted_layer_',sample,'_180']); % 3D surface
        outer = load([load_folder_layers,'outer_converted_layer_',sample,'_180']); % 3D surface
        
        %% 90 dg 
        [inner_surface_90, outer_surface_90] = extrapolate_mesh(dg90.points,size(ref.dg90_inner),inner,outer,size(ref.dg180_inner),0);
        
        %% 45 dg 
        [inner_surface_45, outer_surface_45] = extrapolate_mesh(dg45.points,size(ref.dg45_inner),inner,outer,size(ref.dg180_inner),0);
        
        %% 0 dg   
        [inner_surface_0, outer_surface_0] = extrapolate_mesh(dg0.points,size(ref.dg0_inner),inner,outer,size(ref.dg180_inner),0);
    
        %% figure
        if flag_fig
            figure
            s = 1;
            p = 10;
            title([sample,' inner 0,45,90 to 180 dg'],'Interpreter','none')
            surf(inner.surface_XYZ(1:p:end,1:p:end,1,s),inner.surface_XYZ(1:p:end,1:p:end,2,s),inner.surface_XYZ(1:p:end,1:p:end,3,s),...
                'EdgeColor','none','FaceColor','r','FaceAlpha',0.2, 'FaceLighting','phong')
            hold on 
            surf(inner_surface_45(1:p:end,1:p:end,1,s),inner_surface_45(1:p:end,1:p:end,2,s),inner_surface_45(1:p:end,1:p:end,3,s),...
                'EdgeColor','none','FaceColor','r','FaceAlpha',0.4, 'FaceLighting','phong')
            surf(inner_surface_90(1:p:end,1:p:end,1,s),inner_surface_90(1:p:end,1:p:end,2,s),inner_surface_90(1:p:end,1:p:end,3,s),...
                'EdgeColor','none','FaceColor','g','FaceAlpha',0.4, 'FaceLighting','phong')
    
            surf(inner_surface_0(1:p:end,1:p:end,1,s),inner_surface_0(1:p:end,1:p:end,2,s),inner_surface_0(1:p:end,1:p:end,3,s),...
                'EdgeColor','none','FaceColor','b','FaceAlpha',0.4, 'FaceLighting','phong')
            saveas(gcf,[save_folder,sample,'_inner_allto180.png'])
    
            figure
            title([sample,' outer 0,45,90 to 180 dg'],'Interpreter','none')
            surf(outer.surface_XYZ(1:p:end,1:p:end,1,s),outer.surface_XYZ(1:p:end,1:p:end,2,s),outer.surface_XYZ(1:p:end,1:p:end,3,s),...
                'EdgeColor','none','FaceColor','k','FaceAlpha',0.2, 'FaceLighting','phong')
            hold on 
            surf(outer_surface_45(1:p:end,1:p:end,1,s),outer_surface_45(1:p:end,1:p:end,2,s),outer_surface_45(1:p:end,1:p:end,3,s),...
                'EdgeColor','none','FaceColor','r','FaceAlpha',0.4, 'FaceLighting','phong')
            surf(outer_surface_90(1:p:end,1:p:end,1,s),outer_surface_90(1:p:end,1:p:end,2,s),outer_surface_90(1:p:end,1:p:end,3,s),...
                'EdgeColor','none','FaceColor','g','FaceAlpha',0.4, 'FaceLighting','phong')
    
            surf(outer_surface_0(1:p:end,1:p:end,1,s),outer_surface_0(1:p:end,1:p:end,2,s),outer_surface_0(1:p:end,1:p:end,3,s),...
                'EdgeColor','none','FaceColor','b','FaceAlpha',0.4, 'FaceLighting','phong')
            saveas(gcf,[save_folder,sample,'_outer_allto180.png'])
        end
        %% save the mesh
        if flag_save
            save([save_folder,sample,'_transfomred_90to180'],'inner_surface_90', 'outer_surface_90')
            save([save_folder,sample,'_transfomred_45to180'],'inner_surface_45', 'outer_surface_45')
            save([save_folder,sample,'_transfomred_0to180'],'inner_surface_0', 'outer_surface_0')
        end    
    %end
     
    %% move all the bend to the concave part for inner
    
    load_folder_layers = 'Results\layer\transfer\0dg_rest\';
    
    save_folder = 'Results\layer\transfer\align_0dg_rest\';
    if ~exist(save_folder,'dir')
        mkdir(save_folder)
    end
    
    % if you want to run the measure separately you can use the for loop
    %for i = 1
        sample = samples{i};
        disp(['Load Data ',sample])
    
        load([load_folder_layers,sample])
        sz0 = size(outer0.surface_XYZ);
        
        p = 10;
        for s = 1:2
    
            % move dg 180,90,45 to the most concave part
            % 180 dg
            X180 = outer_surface_0_180(:,:,1,s);
            Y180 = outer_surface_0_180(:,:,2,s);
            Z180 = outer_surface_0_180(:,:,3,s);
            
            mY180 = min(Y180,[],'all');
            indmY180 = find(Y180 == mY180);
            mY180X = X180(indmY180);
            mY180Z = Z180(indmY180);
            
            mX180 = min(X180,[],'all');
            MX180 = max(X180,[],'all');
            rX0 =  (mY180X - mX180)/(MX180-mX180);
            
            nX180 = X180;
            nY180 = Y180 - mY180;
            nZ180 = Z180;
            
            aligned_outer_dg180(:,:,:,s) = cat(3,nX180,nY180,nZ180);
            
            % same translation on inner
            X180_inner = inner_surface_0_180(:,:,1,s);
            Y180_inner = inner_surface_0_180(:,:,2,s);
            Z180_inner = inner_surface_0_180(:,:,3,s);
            
            nX180_inner = X180_inner;
            nY180_inner = Y180_inner - mY180;
            nZ180_inner = Z180_inner;
    
            aligned_inner_dg180(:,:,:,s) = cat(3,nX180_inner,nY180_inner,nZ180_inner);
            
            % 45 dg
            X45 = outer_surface_0_45(:,:,1,s);
            Y45 = outer_surface_0_45(:,:,2,s);
            Z45 = outer_surface_0_45(:,:,3,s);
    
            mY45 = min(Y45,[],'all');
            indmY45 = find(Y45 == mY45);
            mY45X = X45(indmY45);
            mY45Z = Z45(indmY45);
            
            nX45 = X45 - (mY45X - mY180X);
            nY45 = Y45 - mY45;
            nZ45 = Z45;
            
            aligned_outer_dg45(:,:,:,s) = cat(3,nX45,nY45,nZ45);
            
            % same translation on inner
            X45_inner = inner_surface_0_45(:,:,1,s);
            Y45_inner = inner_surface_0_45(:,:,2,s);
            Z45_inner = inner_surface_0_45(:,:,3,s);
                         
            nX45_inner = X45_inner - (mY45X - mY180X);
            nY45_inner = Y45_inner - mY45;
            nZ45_inner = Z45_inner;        
            
            aligned_inner_dg45(:,:,:,s) = cat(3,nX45_inner,nY45_inner,nZ45_inner);
            
            % 90 dg
            X90 = outer_surface_0_90(:,:,1,s);
            Y90 = outer_surface_0_90(:,:,2,s);
            Z90 = outer_surface_0_90(:,:,3,s);
            
            mY90 = min(Y90,[],'all');
            indmY90 = find(Y90 == mY90);
            mY90X = X90(indmY90);
            mY90Z = Z90(indmY90);
            
            nX90 = X90 - (mY90X - mY180X);
            nY90 = Y90 - mY90;
            nZ90 = Z90;
            
            aligned_outer_dg90(:,:,:,s) = cat(3,nX90,nY90,nZ90);
            
            % same translation on inner
            X90_inner = inner_surface_0_90(:,:,1,s);
            Y90_inner = inner_surface_0_90(:,:,2,s);
            Z90_inner = inner_surface_0_90(:,:,3,s);
                    
            nX90_inner = X90_inner - (mY90X - mY180X);
            nY90_inner = Y90_inner - mY90;
            nZ90_inner = Z90_inner;  
    
            aligned_inner_dg90(:,:,:,s) = cat(3,nX90_inner,nY90_inner,nZ90_inner);
            
            % 0 dg
            % since there is no concavity we move it according to the ratio of
            % the lenght on each side of the curve
            X0 = outer0.surface_XYZ(:,:,1,s);
            Y0 = outer0.surface_XYZ(:,:,2,s);
            Z0 = outer0.surface_XYZ(:,:,3,s);
            
            mY0 = min(Y0,[],'all');
            mX0 = min(X0,[],'all');
            
            lX = max(X0,[],'all') - mX0;
            indmX0 = find(X0 < lX*rX0);
            mX0Y180X = X0(indmX0(end)) - mY180X;
            
            nX0 = X0 - (mX0Y180X - mX0);
            nY0 = Y0 - ( mY0);
            nZ0 = Z0;
            
            aligned_outer_dg0(:,:,:,s) = cat(3,nX0,nY0,nZ0);
            
            % inner
            X0_inner = inner0.surface_XYZ(:,:,1,s);
            Y0_inner = inner0.surface_XYZ(:,:,2,s);
            Z0_inner = inner0.surface_XYZ(:,:,3,s);
                  
            nX0_inner = X0_inner - (mX0Y180X - mX0);
            nY0_inner = Y0_inner - ( mY0);
            nZ0_inner = Z0_inner;
            
            aligned_inner_dg0(:,:,:,s) = cat(3,nX0_inner,nY0_inner,nZ0_inner);
            
            if flag_fig 
                % illustration
                figure(1)
                subplot(122)
                title('aligned')
                hold on
                surf(nX0(1:p:end,1:p:end),nY0(1:p:end,1:p:end),nZ0(1:p:end,1:p:end),...
                       'EdgeColor','b','FaceColor','none','FaceAlpha',0.4, 'FaceLighting','phong') 
                surf(nX45(1:p:end,1:p:end),nY45(1:p:end,1:p:end),nZ45(1:p:end,1:p:end),...
                       'EdgeColor','r','FaceColor','none','FaceAlpha',0.4, 'FaceLighting','phong')
                surf(nX90(1:p:end,1:p:end),nY90(1:p:end,1:p:end),nZ90(1:p:end,1:p:end),...
                       'EdgeColor','g','FaceColor','none','FaceAlpha',0.4, 'FaceLighting','phong')
                surf(nX180(1:p:end,1:p:end),nY180(1:p:end,1:p:end),nZ180(1:p:end,1:p:end),...
                       'EdgeColor','k','FaceColor','none','FaceAlpha',0.4, 'FaceLighting','phong')
                % inner
                surf(nX0_inner(1:p:end,1:p:end),nY0_inner(1:p:end,1:p:end),nZ0_inner(1:p:end,1:p:end),...
                       'EdgeColor','b','FaceColor','none','FaceAlpha',0.4, 'FaceLighting','phong')
                surf(nX45_inner(1:p:end,1:p:end),nY45_inner(1:p:end,1:p:end),nZ45_inner(1:p:end,1:p:end),...
                       'EdgeColor','r','FaceColor','none','FaceAlpha',0.4, 'FaceLighting','phong')
                surf(nX90_inner(1:p:end,1:p:end),nY90_inner(1:p:end,1:p:end),nZ90_inner(1:p:end,1:p:end),...
                       'EdgeColor','g','FaceColor','none','FaceAlpha',0.4, 'FaceLighting','phong')
                surf(nX180_inner(1:p:end,1:p:end),nY180_inner(1:p:end,1:p:end),nZ180_inner(1:p:end,1:p:end),...
                       'EdgeColor','k','FaceColor','none','FaceAlpha',0.4, 'FaceLighting','phong')
                axis image
                view(0,90)
                hold off
                % before transformation
                subplot(121)
                title('original')
                hold on
                surf(X0(1:p:end,1:p:end),Y0(1:p:end,1:p:end),Z0(1:p:end,1:p:end),...
                       'EdgeColor','none','FaceColor','b','FaceAlpha',0.2, 'FaceLighting','phong')
                surf(X45(1:p:end,1:p:end),Y45(1:p:end,1:p:end),Z45(1:p:end,1:p:end),...
                       'EdgeColor','none','FaceColor','r','FaceAlpha',0.2, 'FaceLighting','phong')
                surf(X90(1:p:end,1:p:end),Y90(1:p:end,1:p:end),Z90(1:p:end,1:p:end),...
                       'EdgeColor','none','FaceColor','g','FaceAlpha',0.2, 'FaceLighting','phong')
                surf(X180(1:p:end,1:p:end),Y180(1:p:end,1:p:end),Z180(1:p:end,1:p:end),...
                       'EdgeColor','none','FaceColor','k','FaceAlpha',0.2, 'FaceLighting','phong')
                % inner   
                surf(X0_inner(1:p:end,1:p:end),Y0_inner(1:p:end,1:p:end),Z0_inner(1:p:end,1:p:end),...
                       'EdgeColor','none','FaceColor','b','FaceAlpha',0.2, 'FaceLighting','phong')
                surf(X45_inner(1:p:end,1:p:end),Y45_inner(1:p:end,1:p:end),Z45_inner(1:p:end,1:p:end),...
                       'EdgeColor','none','FaceColor','r','FaceAlpha',0.2, 'FaceLighting','phong')
                surf(X90_inner(1:p:end,1:p:end),Y90_inner(1:p:end,1:p:end),Z90_inner(1:p:end,1:p:end),...
                       'EdgeColor','none','FaceColor','g','FaceAlpha',0.2, 'FaceLighting','phong')
                surf(X180_inner(1:p:end,1:p:end),Y180_inner(1:p:end,1:p:end),Z180_inner(1:p:end,1:p:end),...
                       'EdgeColor','none','FaceColor','k','FaceAlpha',0.2, 'FaceLighting','phong')
                view(0,90)
                axis image
                hold off
            end
        end
        if flag_fig
            legend('0 dg','45 dg','90 dg','180 dg')
            suptitle_modified(sample,'none')
            saveas(gcf,[save_folder,sample,'_aligned.png'])
        end
        
        if flag_save
            save([save_folder,sample,'_aligned'],'aligned_outer_dg0','aligned_inner_dg0','aligned_outer_dg45','aligned_inner_dg45','aligned_outer_dg90','aligned_inner_dg90','aligned_outer_dg180','aligned_inner_dg180')
        end
        clear aligned_outer_dg0 aligned_inner_dg0 aligned_outer_dg45 aligned_inner_dg45 aligned_outer_dg90 aligned_inner_dg90 aligned_outer_dg180 aligned_inner_dg180
    %end