Select Git revision
Transformation.m
bepi authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
Transformation.m 18.27 KiB
%% The code is written by Behnaz Pirzamanbein, bepi@dtu.dk last version 2020.08.04
%% Transformation
addpath(genpath('.\Functions'))
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