Changeset 214 for trunk/src/series/relabel_i_j.m
- Timestamp:
- Mar 6, 2011, 10:22:33 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/series/relabel_i_j.m
r184 r214 1 % relabel_i_j: relabel an image series with two indices, according to the time matrix given by ImaDoc 2 % (specific to RDvision system) 1 % relabel_i_j: relabel an image series with two indices, and correct errors from the RDvision transfer program 3 2 %---------------------------------------------------------------------- 4 3 function GUI_input=relabel_i_j(num_i1,num_i2,num_j1,num_j2,Series) 5 4 %requests for the visibility of input windows in the GUI series (activated directly by the selection in the menu ACTION) 6 if ~exist('num_i1','var') 7 GUI_input={}; 8 return %exit the function 9 end 5 6 GUI_input={}; 10 7 11 8 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%enable waitbar 12 hseries=guidata(Series.hseries);%handles of the GUI series 9 hGUI=findobj(allchild(0),'name','series'); 10 hseries=guidata(hGUI);%handles of the GUI series 13 11 WaitbarPos=get(hseries.waitbar_frame,'Position'); 14 12 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% … … 17 15 display('RDvision system') 18 16 first_label=0 %image numbers start from 0 19 errorfactor=2 %correct a factor of 2 in NbDk+1 20 21 %% create dir of the new images 22 basename=fullfile(Series.RootPath,Series.RootFile) ; 23 [dir_images,namebase]=fileparts(basename); 24 [path,subdir_ima]=fileparts(dir_images); 25 newdir=fullfile(path,[subdir_ima '_ij']); 26 mkdir(newdir); 27 [xx,msg2] = fileattrib(newdir,'+w','g'); %yield writing access (+w) to user group (g) 28 if ~strcmp(msg2,'') 29 msgbox_uvmat('ERROR',['pb of permission for ' subdir_ima ': ' msg2])%error message for directory creation 17 %errorfactor=1 %correct a factor of 2 in NbDk+1 18 19 %% read imadoc 20 RootPath=get(hseries.RootPath,'String'); 21 RootFile=get(hseries.RootFile,'String'); 22 basename=fullfile(RootPath{1},RootFile{1}); 23 SeriesData=get(hGUI,'UserData'); 24 if ~strcmp(SeriesData.NomType,'_000001') 25 msgbox_uvmat('WARNING','the input is not a file from RDvision: this function relabel_i_j has no action')%error message for directory creation 30 26 return 31 end 32 display(['relabelled images in the directory ' newdir]) 33 basename_new=fullfile(newdir,namebase); 34 35 %% read imadoc 36 [XmlData,warntext]=imadoc2struct([basename '.xml']); 37 nbfield1=size(XmlData.Time,1)/errorfactor; 27 else 28 msgbox_uvmat('CONFIRMATION','this function will relabel the file series from RDvision and correct the xml file')%error message for directory creation 29 end 30 [XmlData,warntext]=imadoc2struct([basename '.xml'])% read the xml file appended to the present function (containing bug corrections) 31 if ~isempty(warntext) 32 msgbox_uvmat('ERROR',warntext)%error message for xml file reading 33 end 34 nbfield1=size(XmlData.Time,1); 38 35 nbfield2=size(XmlData.Time,2); 36 39 37 set(hseries.first_i,'String',num2str(first_label))% display the first image in the process 40 38 set(hseries.last_i,'String',num2str(nbfield1*nbfield2-1+first_label))% display the last image in the process 39 set(hseries.nb_field,'String',{num2str(nbfield1*nbfield2-1+first_label)})% display the total nbre of images 40 41 %% stop program ther when it is selected in the menu (no run action) 42 if ~exist('num_i1','var') 43 return 44 end 45 46 answer=msgbox_uvmat('CONFIRMATION',[num2str(nbfield1) ' bursts containing ' num2str(nbfield2) ' images each'])%error message for directory creation 41 47 42 48 %% apply the image rescaling function 'level' (avoid bright particles) 43 answer=msgbox_uvmat('INPUT_Y-N','apply image rescaling function levels.m');44 test_level=isequal(answer,'Yes');49 % answer=msgbox_uvmat('INPUT_Y-N','apply image rescaling function levels.m'); 50 % test_level=isequal(answer,'Yes'); 45 51 46 52 %% copy and adapt the xml file 47 53 if exist([basename '.xml'],'file') 48 copyfile([basename '.xml'],[basename_new '.xml']);% copy the .civ file 49 t=xmltree([basename_new '.xml']); 54 try 55 copyfile([basename '.xml'],[basename '.xml~']);% backup the xml file 56 catch 57 errormsg=lasterr 58 msgbox_uvmat('ERROR',errormsg); 59 return 60 end 61 t=xmltree([basename '.xml']); 50 62 51 63 %update information on the first image name in the series … … 55 67 end 56 68 uid_ImageName=find(t,'ImaDoc/Heading/ImageName'); 57 ImageName=name_generator(basename _new,1,1,'.png','_i_j');69 ImageName=name_generator(basename,1,1,'.png','_i_j'); 58 70 [pth,ImageName]=fileparts(ImageName); 59 71 ImageName=[ImageName '.png'] … … 63 75 uid_value=children(t,uid_ImageName); 64 76 if isempty(uid_value) 65 t=add(t,uid_ImageName,'chardata',ImageName) %indicate name of the first image, with ;png extension77 t=add(t,uid_ImageName,'chardata',ImageName);%indicate name of the first image, with ;png extension 66 78 else 67 t=set(t,uid_value(1),'value',ImageName)%indicate name of the first image, with ;png extension 68 end 69 70 % %add information about image transform 71 % [t,new_uid]=add(t,1,'element','ImageTransform'); 72 % [t,NameFunction_uid]=add(t,new_uid,'element','NameFunction'); 73 % [t]=add(t,NameFunction_uid,'chardata','sub_background'); 74 % [t,NbSlice_uid]=add(t,new_uid,'element','NbSlice'); 75 % [t]=add(t,new_uid,'chardata',num2str(nbslice_i)); 76 % [t,NbSlidingImages_uid]=add(t,new_uid,'element','NbSlidingImages'); 77 % [t]=add(t,NbSlidingImages_uid,'chardata',num2str(nbaver)); 78 % [t,LuminosityRank_uid]=add(t,new_uid,'element','RankBackground'); 79 % [t]=add(t,LuminosityRank_uid,'chardata',num2str(rank));% luminosity rank almong the nbaver sliding images 80 save(t,[basename_new '.xml']) 79 t=set(t,uid_value(1),'value',ImageName);%indicate name of the first image, with ;png extension 80 end 81 82 %%%% correction RDvision %%%% 83 uid_NbDtj=find(t,'ImaDoc/Camera/BurstTiming/NbDtj'); 84 t=set(t,uid_NbDtj,'value',num2str(s.NbDtj)) 85 uid_NbDtk=find(t,'ImaDoc/Camera/BurstTiming/NbDtk'); 86 t=set(t,uid_NbDtk,'value',num2str(s.NbDtk)) 87 %%% 88 89 save(t,[basename '.xml']) 81 90 end 82 91 … … 87 96 num_j=mod(ifile-1+first_label,nbfield2)+1; 88 97 num_i=floor((ifile-1+first_label)/nbfield2)+1; 89 filename_new=name_generator(basename_new,num_i,num_j,'.png','_i_j'); 90 if test_level 91 A=imread(filename); 92 C=levels(A); 93 imwrite(C,filename_new) 94 else 95 copyfile(filename,filename_new); 96 end 97 end 98 98 filename_new=name_generator(basename,num_i,num_j,'.png','_i_j'); 99 try 100 movefile(filename,filename_new); 101 [s,errormsg] = fileattrib(filename_new,'-w','a'); %set images to read only '-w' for all users ('a') 102 if ~s 103 msgbox_uvmat('ERROR',errormsg); 104 return 105 end 106 catch 107 errormsg=lasterr 108 msgbox_uvmat('ERROR',errormsg); 109 return 110 end 111 % if test_level 112 % A=imread(filename); 113 % C=levels(A); 114 % imwrite(C,filename_new) 115 % else 116 % try 117 % copyfile(filename,filename_new); 118 % catch 119 % errormsg=lasterr 120 % msgbox_uvmat('ERROR',errormsg); 121 % return 122 % end 123 % end 124 end 99 125 100 126 … … 137 163 C=(C-cmin)/(cmax-cmin)*256; 138 164 C=uint8(C); 165 166 %'imadoc2struct': reads the xml file for image documentation 167 %------------------------------------------------------------------------ 168 % function [s,errormsg]=imadoc2struct(ImaDoc,option) 169 % 170 % OUTPUT: 171 % s: structure representing ImaDoc 172 % s.Heading: information about the data hierarchical structure 173 % s.Time: matrix of times 174 % s.TimeUnit 175 % s.GeometryCalib: substructure containing the parameters for geometric calibration 176 % errormsg: error message 177 % 178 % INPUT: 179 % ImaDoc: full name of the xml input file with head key ImaDoc 180 % option: ='GeometryCalib': read the data of GeometryCalib, including source point coordinates 181 182 function [s,errormsg]=imadoc2struct(ImaDoc,option) 183 %% default input and output 184 if ~exist('option','var') 185 option='*'; 186 end 187 errormsg=[];%default 188 s.Heading=[];%default 189 s.Time=[]; %default 190 s.TimeUnit=[]; %default 191 s.GeometryCalib=[]; 192 tsai=[];%default 193 194 %% opening the xml file 195 if exist(ImaDoc,'file')~=2, errormsg=[ ImaDoc ' does not exist']; return;end;%input file does not exist 196 try 197 t=xmltree(ImaDoc); 198 catch 199 errormsg={[ImaDoc ' is not a valid xml file']; lasterr}; 200 display(errormsg); 201 return 202 end 203 uid_root=find(t,'/ImaDoc'); 204 if isempty(uid_root), errormsg=[ImaDoc ' is not an image documentation file ImaDoc']; return; end;%not an ImaDoc .xml file 205 206 207 %% Heading 208 uid_Heading=find(t,'/ImaDoc/Heading'); 209 if ~isempty(uid_Heading), 210 uid_Campaign=find(t,'/ImaDoc/Heading/Campaign'); 211 uid_Exp=find(t,'/ImaDoc/Heading/Experiment'); 212 uid_Device=find(t,'/ImaDoc/Heading/Device'); 213 uid_Record=find(t,'/ImaDoc/Heading/Record'); 214 uid_FirstImage=find(t,'/ImaDoc/Heading/ImageName'); 215 s.Heading.Campaign=get(t,children(t,uid_Campaign),'value'); 216 s.Heading.Experiment=get(t,children(t,uid_Exp),'value'); 217 s.Heading.Device=get(t,children(t,uid_Device),'value'); 218 if ~isempty(uid_Record) 219 s.Heading.Record=get(t,children(t,uid_Record),'value'); 220 end 221 s.Heading.ImageName=get(t,children(t,uid_FirstImage),'value'); 222 end 223 224 %% Camera and timing 225 if strcmp(option,'*') || strcmp(option,'Camera') 226 uid_Camera=find(t,'/ImaDoc/Camera'); 227 if ~isempty(uid_Camera) 228 uid_ImageSize=find(t,'/ImaDoc/Camera/ImageSize'); 229 if ~isempty(uid_ImageSize); 230 ImageSize=get(t,children(t,uid_ImageSize),'value'); 231 xindex=findstr(ImageSize,'x'); 232 if length(xindex)>=2 233 s.Npx=str2double(ImageSize(1:xindex(1)-1)); 234 s.Npy=str2double(ImageSize(xindex(1)+1:xindex(2)-1)); 235 end 236 end 237 uid_TimeUnit=find(t,'/ImaDoc/Camera/TimeUnit'); 238 if ~isempty(uid_TimeUnit) 239 s.TimeUnit=get(t,children(t,uid_TimeUnit),'value'); 240 end 241 uid_BurstTiming=find(t,'/ImaDoc/Camera/BurstTiming'); 242 if ~isempty(uid_BurstTiming) 243 for k=1:length(uid_BurstTiming) 244 subt=branch(t,uid_BurstTiming(k));%subtree under BurstTiming 245 % reading Dtk 246 Frequency=get_value(subt,'/BurstTiming/FrameFrequency',1); 247 Dtj=get_value(subt,'/BurstTiming/Dtj',[]); 248 Dtj=Dtj/Frequency;%Dtj converted from frame unit to TimeUnit (e.g. 's') 249 NbDtj=get_value(subt,'/BurstTiming/NbDtj',1); 250 %%%% correction RDvision %%%% 251 NbDtj=NbDtj/numel(Dtj); 252 s.NbDtj=NbDtj; 253 %%%% 254 Dti=get_value(subt,'/BurstTiming/Dti',[]); 255 Dti=Dti/Frequency;%Dtj converted from frame unit to TimeUnit (e.g. 's') 256 NbDti=get_value(subt,'/BurstTiming/NbDti',1); 257 Time_val=get_value(subt,'/BurstTiming/Time',0);%time in TimeUnit 258 if ~isempty(Dti) 259 Dti=reshape(Dti'*ones(1,NbDti),NbDti*numel(Dti),1); %concatene Dti vector NbDti times 260 Time_val=[Time_val;Time_val(end)+cumsum(Dti)];%append the times defined by the intervals Dti 261 end 262 if ~isempty(Dtj) 263 Dtj=reshape(Dtj'*ones(1,NbDtj),1,NbDtj*numel(Dtj)); %concatene Dtj vector NbDtj times 264 Dtj=[0 Dtj]; 265 Time_val=Time_val*ones(1,numel(Dtj))+ones(numel(Time_val),1)*cumsum(Dtj);% produce a time matrix with Dtj 266 end 267 % reading Dtk 268 Dtk=get_value(subt,'/BurstTiming/Dtk',[]); 269 NbDtk=get_value(subt,'/BurstTiming/NbDtk',1); 270 %%%% correction RDvision %%%% 271 NbDtk=-1+(NbDtk+1)/(NbDti+1) 272 s.NbDtk=NbDtk; 273 %%%%% 274 if isempty(Dtk) 275 s.Time=[s.Time;Time_val]; 276 else 277 for kblock=1:NbDtk+1 278 Time_val_k=Time_val+(kblock-1)*Dtk; 279 s.Time=[s.Time;Time_val_k]; 280 end 281 end 282 end 283 end 284 end 285 end 286 287 %% motor 288 if strcmp(option,'*') || strcmp(option,'GeometryCalib') 289 uid_subtree=find(t,'/ImaDoc/TranslationMotor'); 290 if length(uid_subtree)==1 291 subt=branch(t,uid_subtree);%subtree under GeometryCalib 292 [s.TranslationMotor,errormsg]=read_subtree(subt,{'Nbslice','ZStart','ZEnd'},[1 1 1],[1 1 1]); 293 end 294 end 295 %% geometric calibration 296 if strcmp(option,'*') || strcmp(option,'GeometryCalib') 297 uid_GeometryCalib=find(t,'/ImaDoc/GeometryCalib'); 298 if ~isempty(uid_GeometryCalib) 299 if length(uid_GeometryCalib)>1 300 errormsg=['More than one GeometryCalib in ' filecivxml]; 301 return 302 end 303 subt=branch(t,uid_GeometryCalib);%subtree under GeometryCalib 304 cont=get(subt,1,'contents'); 305 if ~isempty(cont) 306 uid_CalibrationType=find(subt,'/GeometryCalib/CalibrationType'); 307 if isequal(length(uid_CalibrationType),1) 308 tsai.CalibrationType=get(subt,children(subt,uid_CalibrationType),'value'); 309 end 310 uid_CoordUnit=find(subt,'/GeometryCalib/CoordUnit'); 311 if isequal(length(uid_CoordUnit),1) 312 tsai.CoordUnit=get(subt,children(subt,uid_CoordUnit),'value'); 313 end 314 uid_fx_fy=find(subt,'/GeometryCalib/fx_fy'); 315 focal=[];%default fro old convention (Reg Wilson) 316 if isequal(length(uid_fx_fy),1) 317 tsai.fx_fy=str2num(get(subt,children(subt,uid_fx_fy),'value')); 318 else %old convention (Reg Wilson) 319 uid_focal=find(subt,'/GeometryCalib/focal'); 320 uid_dpx_dpy=find(subt,'/GeometryCalib/dpx_dpy'); 321 uid_sx=find(subt,'/GeometryCalib/sx'); 322 if ~isempty(uid_focal) && ~isempty(uid_dpx_dpy) && ~isempty(uid_sx) 323 dpx_dpy=str2num(get(subt,children(subt,uid_dpx_dpy),'value')); 324 sx=str2num(get(subt,children(subt,uid_sx),'value')); 325 focal=str2num(get(subt,children(subt,uid_focal),'value')); 326 tsai.fx_fy(1)=sx*focal/dpx_dpy(1); 327 tsai.fx_fy(2)=focal/dpx_dpy(2); 328 end 329 end 330 uid_Cx_Cy=find(subt,'/GeometryCalib/Cx_Cy'); 331 if ~isempty(uid_Cx_Cy) 332 tsai.Cx_Cy=str2num(get(subt,children(subt,uid_Cx_Cy),'value')); 333 end 334 uid_kc=find(subt,'/GeometryCalib/kc'); 335 if ~isempty(uid_kc) 336 tsai.kc=str2double(get(subt,children(subt,uid_kc),'value')); 337 else %old convention (Reg Wilson) 338 uid_kappa1=find(subt,'/GeometryCalib/kappa1'); 339 if ~isempty(uid_kappa1)&& ~isempty(focal) 340 kappa1=str2double(get(subt,children(subt,uid_kappa1),'value')); 341 tsai.kc=-kappa1*focal*focal; 342 end 343 end 344 uid_Tx_Ty_Tz=find(subt,'/GeometryCalib/Tx_Ty_Tz'); 345 if ~isempty(uid_Tx_Ty_Tz) 346 tsai.Tx_Ty_Tz=str2num(get(subt,children(subt,uid_Tx_Ty_Tz),'value')); 347 end 348 uid_R=find(subt,'/GeometryCalib/R'); 349 if ~isempty(uid_R) 350 RR=get(subt,children(subt,uid_R),'value'); 351 if length(RR)==3 352 tsai.R=[str2num(RR{1});str2num(RR{2});str2num(RR{3})]; 353 end 354 end 355 356 %look for laser plane definitions 357 uid_Angle=find(subt,'/GeometryCalib/PlaneAngle'); 358 uid_Pos=find(subt,'/GeometryCalib/SliceCoord'); 359 if isempty(uid_Pos) 360 uid_Pos=find(subt,'/GeometryCalib/PlanePos');%old convention 361 end 362 if ~isempty(uid_Angle) 363 tsai.PlaneAngle=str2num(get(subt,children(subt,uid_Angle),'value')); 364 end 365 if ~isempty(uid_Pos) 366 for j=1:length(uid_Pos) 367 tsai.SliceCoord(j,:)=str2num(get(subt,children(subt,uid_Pos(j)),'value')); 368 end 369 uid_DZ=find(subt,'/GeometryCalib/SliceDZ'); 370 uid_NbSlice=find(subt,'/GeometryCalib/NbSlice'); 371 if ~isempty(uid_DZ) && ~isempty(uid_NbSlice) 372 DZ=str2double(get(subt,children(subt,uid_DZ),'value')); 373 NbSlice=get(subt,children(subt,uid_NbSlice),'value'); 374 if isequal(NbSlice,'volume') 375 tsai.NbSlice='volume'; 376 NbSlice=NbDtj+1; 377 else 378 tsai.NbSlice=str2double(NbSlice); 379 end 380 tsai.SliceCoord=ones(NbSlice,1)*tsai.SliceCoord+DZ*(0:NbSlice-1)'*[0 0 1]; 381 end 382 end 383 tsai.SliceAngle=get_value(subt,'/GeometryCalib/SliceAngle',[0 0 0]); 384 tsai.VolumeScan=get_value(subt,'/GeometryCalib/VolumeScan','n'); 385 tsai.InterfaceCoord=get_value(subt,'/GeometryCalib/InterfaceCoord',[0 0 0]); 386 tsai.RefractionIndex=get_value(subt,'/GeometryCalib/RefractionIndex',1); 387 388 if strcmp(option,'GeometryCalib') 389 tsai.PointCoord=get_value(subt,'/GeometryCalib/SourceCalib/PointCoord',[0 0 0 0 0]); 390 end 391 s.GeometryCalib=tsai; 392 end 393 end 394 end 395 396 %-------------------------------------------------- 397 % read a subtree 398 % INPUT: 399 % t: xltree 400 % head_element: head elelemnt of the subtree 401 % Data, structure containing 402 % .Key: element name 403 % .Type: type of element ('charg', 'float'....) 404 % .NbOccur: nbre of occurrence, NaN for un specified number 405 function [s,errormsg]=read_subtree(subt,Data,NbOccur,NumTest) 406 %-------------------------------------------------- 407 s=[];%default 408 errormsg=''; 409 head_element=get(subt,1,'name'); 410 cont=get(subt,1,'contents'); 411 if ~isempty(cont) 412 for ilist=1:length(Data) 413 uid_key=find(subt,[head_element '/' Data{ilist}]); 414 if ~isequal(length(uid_key),NbOccur(ilist)) 415 errormsg=['wrong number of occurence for ' Data{ilist}]; 416 return 417 end 418 for ival=1:length(uid_key) 419 val=get(subt,children(subt,uid_key(ival)),'value'); 420 if ~NumTest(ilist) 421 eval(['s.' Data{ilist} '=val;']); 422 else 423 eval(['s.' Data{ilist} '=str2double(val);']) 424 end 425 end 426 end 427 end 428 429 430 %-------------------------------------------------- 431 % read an xml element 432 function val=get_value(t,label,default) 433 %-------------------------------------------------- 434 val=default; 435 uid=find(t,label);%find the element iud(s) 436 if ~isempty(uid) %if the element named label exists 437 uid_child=children(t,uid);%find the children 438 if ~isempty(uid_child) 439 data=get(t,uid_child,'type');%get the type of child 440 if iscell(data)% case of multiple element 441 for icell=1:numel(data) 442 val_read=str2num(get(t,uid_child(icell),'value')); 443 if ~isempty(val_read) 444 val(icell,:)=val_read; 445 end 446 end 447 % val=val'; 448 else % case of unique element value 449 val_read=str2num(get(t,uid_child,'value')); 450 if ~isempty(val_read) 451 val=val_read; 452 else 453 val=get(t,uid_child,'value');%char string data 454 end 455 end 456 end 457 end
Note: See TracChangeset
for help on using the changeset viewer.