Changeset 1078 for trunk/src/phys_ima.m
- Timestamp:
- Mar 30, 2020, 3:48:19 PM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/phys_ima.m
r972 r1078 22 22 XmlData={XmlData}; 23 23 end 24 24 25 for icell=1:numel(A) 25 26 siz=size(A{icell}); … … 27 28 npy=[npy siz(1)]; 28 29 Calib=XmlData{icell}.GeometryCalib; 29 xima=[0.5 siz(2)-0.5 0.5 siz(2)-0.5];%image coordinates of corners 30 yima=[0.5 0.5 siz(1)-0.5 siz(1)-0.5]; 31 [xcorner_new,ycorner_new]=phys_XYZ(Calib,xima,yima,ZIndex);%corresponding physical coordinates 30 coord_x=[0.5 siz(2)-0.5]; 31 coord_y=[0.5 siz(1)-0.5]; 32 x_edge=[linspace(coord_x(1),coord_x(end),npx(icell)) coord_x(end)*ones(1,npy(icell))... 33 linspace(coord_x(end),coord_x(1),npx(icell)) coord_x(1)*ones(1,npy(icell))];%x coordinates of the image edge(four sides) 34 y_edge=[coord_y(1)*ones(1,npx(icell)) linspace(coord_y(1),coord_y(end),npy(icell))... 35 coord_y(end)*ones(1,npx(icell)) linspace(coord_y(end),coord_y(1),npy(icell))];%y coordinates of the image edge(four sides) 36 [xcorner_new,ycorner_new]=phys_XYZ(Calib,x_edge,y_edge,ZIndex);%corresponding physical coordinates 32 37 dx(icell)=(max(xcorner_new)-min(xcorner_new))/(siz(2)-1); 33 38 dy(icell)=(max(ycorner_new)-min(ycorner_new))/(siz(1)-1); … … 40 45 Rangy(1)=max(ycorner); 41 46 test_multi=(max(npx)~=min(npx)) || (max(npy)~=min(npy)); %different image lengths 42 % npX=1+round((Rangx(2)-Rangx(1))/min(dx));% nbre of pixels in the new image (use the finest resolution min(dx) in the set of images)43 % npY=1+round((Rangy(1)-Rangy(2))/min(dy));44 47 45 48 npX=1+round((Rangx(2)-Rangx(1))/max(dx));% nbre of pixels in the new image (use the largest resolution max(dx) in the set of images) 46 49 npY=1+round((Rangy(1)-Rangy(2))/max(dy)); 47 50 48 49 51 x=linspace(Rangx(1),Rangx(2),npX); 50 52 y=linspace(Rangy(1),Rangy(2),npY); 51 [X,Y]=meshgrid(x,y);%grid in physical coordiantes 52 %vec_B=[]; 53 [X,Y]=meshgrid(x,y);%grid in physical coordinates 53 54 A_out=cell(1,numel(A)); 54 for icell=1:length(A) 55 56 for icell=1:length(A) 55 57 Calib=XmlData{icell}.GeometryCalib; 56 58 % rescaling of the image coordinates without change of the image array … … 60 62 Rangy=[npy-0.5 0.5]; 61 63 [Rangx]=phys_XYZ(Calib,Rangx,[0.5 0.5],ZIndex);%case of translations without rotation and quadratic deformation 62 [ xx,Rangy]=phys_XYZ(Calib,[0.5 0.5],Rangy,ZIndex);64 [~,Rangy]=phys_XYZ(Calib,[0.5 0.5],Rangy,ZIndex); 63 65 else 64 66 % the image needs to be interpolated to the new coordinates 65 zphys=0; %default67 Z=0; %default 66 68 if isfield(Calib,'SliceCoord') %.Z= index of plane 67 69 SliceCoord=Calib.SliceCoord(ZIndex,:); 68 zphys=SliceCoord(3); %to generalize for non-parallel planes 69 if isfield(Calib, 'SliceAngle') && ~isequal(Calib.SliceAngle,[0 0 0]) && ~isequal(Calib.SliceAngle(ZIndex,:),[0 0 0]) 70 testangle=1; 71 om=norm(Calib.SliceAngle(ZIndex,:));%norm of rotation angle in radians 72 OmAxis=Calib.SliceAngle(ZIndex,:)/om; %unit vector marking the rotation axis 73 cos_om=cos(pi*om/180); 74 sin_om=sin(pi*om/180); 75 coeff=OmAxis(3)*(1-cos_om); 76 norm_plane(1)=OmAxis(1)*coeff+OmAxis(2)*sin_om; 77 norm_plane(2)=OmAxis(2)*coeff-OmAxis(1)*sin_om; 78 norm_plane(3)=OmAxis(3)*coeff+cos_om; 79 %Z0=norm_plane*Calib.SliceCoord(ZIndex,:)'/norm_plane(3); 80 Z0=Calib.SliceCoord(ZIndex,3); 81 zphys=Z0-(norm_plane(1)*X-norm_plane(2)*Y)/norm_plane(3); 70 Z=SliceCoord(3); 71 if isfield(Calib, 'SliceAngle') && size(Calib.SliceAngle,1)>=ZIndex && ~isequal(Calib.SliceAngle(ZIndex,:),[0 0 0]) 72 norm_plane=angle2normal(Calib.SliceAngle(ZIndex,:)); 73 Z=Z-(norm_plane(1)*(X-SliceCoord(1))+norm_plane(2)*(Y-SliceCoord(2)))/norm_plane(3); 82 74 end 83 % if isfield(Calib,'InterfaceCoord') && isfield(Calib,'RefractionIndex')84 % H=Calib.InterfaceCoord(3);85 % if H>zphys86 % zphys=H-(H-zphys)/Calib.RefractionIndex; %corrected z (virtual object)87 % end88 % end89 75 end 90 76 xima=0.5:npx(icell)-0.5;%image coordinates of corners 91 77 yima=npy(icell)-0.5:-1:0.5; 92 78 [XIMA_init,YIMA_init]=meshgrid(xima,yima);%grid of initial image in px coordinates 93 [XIMA,YIMA]=px_XYZ(XmlData{icell}.GeometryCalib,X,Y, zphys);% image coordinates for each point in the real79 [XIMA,YIMA]=px_XYZ(XmlData{icell}.GeometryCalib,X,Y,Z);% image coordinates for each point in the real 94 80 testuint8=isa(A{icell},'uint8'); 95 81 testuint16=isa(A{icell},'uint16'); 96 if ndims(A{icell})==2%(B/W images)97 A_out{icell}=interp2(XIMA_init,YIMA_init,double(A{icell}),XIMA,YIMA);98 elseif ndims(A{icell})==399 100 101 102 103 82 if ismatrix(A{icell}) %(B/W images) 83 A_out{icell}=interp2(XIMA_init,YIMA_init,double(A{icell}),XIMA,YIMA); 84 elseif ndims(A{icell})==3 85 for icolor=1:size(A{icell},3) 86 A{icell}=double(A{icell}); 87 A_out{icell}(:,:,icolor)=interp2(XIMA_init,YIMA_init,A{icell}(:,:,icolor),XIMA,YIMA); 88 end 89 end 104 90 if testuint8 105 91 A_out{icell}=uint8(A_out{icell}); … … 107 93 if testuint16 108 94 A_out{icell}=uint16(A_out{icell}); 109 end 95 end 110 96 end 111 97 end
Note: See TracChangeset
for help on using the changeset viewer.