0001 function [ varargout ] = vb_mri_point_select(avw,parent,command)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052 global vbmeg_inst;
0053
0054 if gcbf,
0055 AVWVIEW = get(gcf,'Userdata');
0056 end
0057
0058 if ~exist('command','var'), command = 'init'; end
0059
0060 command = lower(command);
0061
0062
0063 if strcmp(command, 'keypress'),
0064
0065 cc = get(AVWVIEW.gui,'CurrentCharacter');
0066 cc = double(cc);
0067 if cc,
0068 switch cc,
0069
0070 case 28, command = 'left';
0071 case 29, command = 'right';
0072 case 30, command = 'up';
0073 case 31, command = 'down';
0074 case 127, command = 'left';
0075 otherwise, return;
0076 end
0077 end
0078 end
0079
0080 switch command,
0081
0082 case 'init',
0083
0084 if ~exist('avw','var'),
0085 avw = avw_read_ras;
0086 end
0087
0088 if nargin == 0,
0089 AVWVIEW = init(avw);
0090 elseif isempty(inputname(1)),
0091 AVWVIEW = init(avw);
0092 else
0093 AVWVIEW = init(avw,inputname(1));
0094 end
0095
0096 AVWVIEW = set_coordinates(AVWVIEW);
0097
0098
0099
0100 case 'update'
0101 AVWVIEW = axial_update(AVWVIEW);
0102 AVWVIEW = coronal_update(AVWVIEW);
0103 AVWVIEW = sagittal_update(AVWVIEW);
0104
0105
0106
0107 case 'coordinates',
0108
0109 AVWVIEW = set_coordinates(AVWVIEW);
0110 AVWVIEW = axial_update(AVWVIEW);
0111 AVWVIEW = coronal_update(AVWVIEW);
0112 AVWVIEW = sagittal_update(AVWVIEW);
0113
0114
0115
0116 case 'crosshairs',
0117
0118 AVWVIEW = set_crosshairs(AVWVIEW);
0119
0120
0121
0122
0123 case {'axial_image','coronal_image','sagittal_image'},
0124
0125 switch command,
0126 case 'axial_image', AVWVIEW.view = 'axi'; axi_update = 0; cor_update = 1; sag_update = 1;
0127 case 'coronal_image', AVWVIEW.view = 'cor'; axi_update = 1; cor_update = 0; sag_update = 1;
0128 case 'sagittal_image', AVWVIEW.view = 'sag'; axi_update = 1; cor_update = 1; sag_update = 0;
0129 end
0130
0131 AVWVIEW = get_current_position(AVWVIEW);
0132
0133 if axi_update,
0134 AVWVIEW = axial_update(AVWVIEW);
0135 end
0136 if cor_update,
0137 AVWVIEW = coronal_update(AVWVIEW);
0138 end;
0139 if sag_update,
0140 AVWVIEW = sagittal_update(AVWVIEW);
0141 end;
0142
0143 set_display_values(AVWVIEW);
0144
0145 AVWVIEW = set_crosshairs(AVWVIEW);
0146
0147
0148
0149
0150
0151 case {'axial_slider','coronal_slider','sagittal_slider'},
0152
0153 switch command,
0154
0155 case 'axial_slider',
0156 AVWVIEW.view = 'axi';
0157 AVWVIEW = get_slider_position(AVWVIEW);
0158 AVWVIEW = axial_update(AVWVIEW);
0159
0160 case 'coronal_slider',
0161 AVWVIEW.view = 'cor';
0162 AVWVIEW = get_slider_position(AVWVIEW);
0163 AVWVIEW = coronal_update(AVWVIEW);
0164
0165 case 'sagittal_slider',
0166 AVWVIEW.view = 'sag';
0167 AVWVIEW = get_slider_position(AVWVIEW);
0168 AVWVIEW = sagittal_update(AVWVIEW);
0169 end
0170
0171 set_display_values(AVWVIEW);
0172
0173 AVWVIEW = set_crosshairs(AVWVIEW);
0174
0175
0176
0177
0178
0179 case {'left','right','up','down'},
0180
0181 AVWVIEW = get_slider_position(AVWVIEW);
0182 axi_update = 0; cor_update = 0; sag_update = 0;
0183
0184
0185 if isequal(gca, AVWVIEW.handles.axial_axes),
0186 switch command,
0187 case 'left',
0188
0189 if AVWVIEW.slices.sag > 1,
0190 AVWVIEW.slices.sag = AVWVIEW.slices.sag - 1;
0191 sag_update = 1;
0192 end
0193 case 'right',
0194
0195 if AVWVIEW.slices.sag < AVWVIEW.xdim,
0196 AVWVIEW.slices.sag = AVWVIEW.slices.sag + 1;
0197 sag_update = 1;
0198 end
0199 case 'up',
0200
0201 if AVWVIEW.slices.cor < AVWVIEW.ydim,
0202 AVWVIEW.slices.cor = AVWVIEW.slices.cor + 1;
0203 cor_update = 1;
0204 end
0205 case 'down',
0206
0207 if AVWVIEW.slices.cor > 1,
0208 AVWVIEW.slices.cor = AVWVIEW.slices.cor - 1;
0209 cor_update = 1;
0210 end
0211 end
0212 end
0213
0214 if isequal(gca, AVWVIEW.handles.coronal_axes),
0215 switch command,
0216 case 'left',
0217
0218 if AVWVIEW.slices.sag > 1,
0219 AVWVIEW.slices.sag = AVWVIEW.slices.sag - 1;
0220 sag_update = 1;
0221 end
0222 case 'right',
0223
0224 if AVWVIEW.slices.sag < AVWVIEW.xdim,
0225 AVWVIEW.slices.sag = AVWVIEW.slices.sag + 1;
0226 sag_update = 1;
0227 end
0228 case 'up',
0229
0230 if AVWVIEW.slices.axi < AVWVIEW.zdim,
0231 AVWVIEW.slices.axi = AVWVIEW.slices.axi + 1;
0232 axi_update = 1;
0233 end
0234 case 'down',
0235
0236 if AVWVIEW.slices.axi > 1,
0237 AVWVIEW.slices.axi = AVWVIEW.slices.axi - 1;
0238 axi_update = 1;
0239 end
0240 end
0241 end
0242
0243 if isequal(gca, AVWVIEW.handles.sagittal_axes),
0244 switch command,
0245 case 'left',
0246
0247 if AVWVIEW.slices.cor > 1,
0248 AVWVIEW.slices.cor = AVWVIEW.slices.cor - 1;
0249 cor_update = 1;
0250 end
0251 case 'right',
0252
0253 if AVWVIEW.slices.cor < AVWVIEW.ydim,
0254 AVWVIEW.slices.cor = AVWVIEW.slices.cor + 1;
0255 cor_update = 1;
0256 end
0257 case 'up',
0258
0259 if AVWVIEW.slices.axi < AVWVIEW.zdim,
0260 AVWVIEW.slices.axi = AVWVIEW.slices.axi + 1;
0261 axi_update = 1;
0262 end
0263 case 'down',
0264
0265 if AVWVIEW.slices.axi > 1,
0266 AVWVIEW.slices.axi = AVWVIEW.slices.axi - 1;
0267 axi_update = 1;
0268 end
0269 end
0270 end
0271
0272
0273 set(AVWVIEW.handles.sagittal_slider,'Value',AVWVIEW.slices.sag);
0274 set(AVWVIEW.handles.sagittal_sliderN,'String',num2str(AVWVIEW.slices.sag));
0275 set(AVWVIEW.handles.sagittal_sliderN,'Value',AVWVIEW.slices.sag);
0276
0277
0278 set(AVWVIEW.handles.coronal_slider,'Value',AVWVIEW.slices.cor);
0279 set(AVWVIEW.handles.coronal_sliderN,'String',num2str(AVWVIEW.slices.cor));
0280 set(AVWVIEW.handles.coronal_sliderN,'Value',AVWVIEW.slices.cor);
0281
0282
0283 set(AVWVIEW.handles.axial_slider,'Value',AVWVIEW.slices.axi);
0284 set(AVWVIEW.handles.axial_sliderN,'String',num2str(AVWVIEW.slices.axi));
0285 set(AVWVIEW.handles.axial_sliderN,'Value',AVWVIEW.slices.axi);
0286
0287
0288 AVWVIEW = set_crosshairs(AVWVIEW);
0289
0290 if axi_update
0291 AVWVIEW = axial_update(AVWVIEW);
0292 end
0293 if cor_update
0294 AVWVIEW = coronal_update(AVWVIEW);
0295 end
0296 if sag_update
0297 AVWVIEW = sagittal_update(AVWVIEW);
0298 end
0299
0300
0301
0302
0303 case {'add_point', 'remove_point', 'listbox_clicked'}
0304 switch(command)
0305 case 'add_point'
0306 def = vb_define_mri_point_select;
0307
0308 prompt = {'Enter the point name : '};
0309 dlgTitle = 'Input point name';
0310 contents = def.POINT_NAME_LIST;
0311 [selection, IsOK] = listdlg('PromptString', prompt, ...
0312 'SelectionMode', 'single', ...
0313 'ListString', contents);
0314 point_name = [];
0315 if IsOK
0316 if strcmp(contents{selection}, def.STR_OTHER)
0317 point_name = inputdlg(prompt, dlgTitle, 1);
0318 if ~isempty(point_name)
0319 point_name = point_name{1};
0320 end
0321 else
0322 point_name = contents{selection};
0323 end
0324 end
0325 if ~isempty(point_name)
0326 AVWVIEW = slices2metric(AVWVIEW);
0327 [AVWVIEW.point_list, result] =...
0328 vb_mps_pointlist_add_point(AVWVIEW.point_list, point_name, AVWVIEW.imgXYZ);
0329 if result == false
0330 errordlg('The name overlaps.', 'error');
0331 return;
0332 end
0333 update_point_list(AVWVIEW);
0334 NPoints = vb_mps_pointlist_get_pointnum(AVWVIEW.point_list);
0335 set(AVWVIEW.handles.save_point_listbox, 'Value', NPoints);
0336 end
0337 case 'remove_point'
0338 if vb_mps_pointlist_get_pointnum(AVWVIEW.point_list) == 0
0339 return;
0340 end
0341 ix = get(AVWVIEW.handles.save_point_listbox, 'Value');
0342 for k=1:length(ix)
0343 [name, point] = vb_mps_pointlist_get_point(AVWVIEW.point_list, ix(k));
0344 AVWVIEW.point_list = vb_mps_pointlist_delete_point(AVWVIEW.point_list, name);
0345 end
0346 update_point_list(AVWVIEW);
0347 case 'listbox_clicked'
0348 lineNo = get(AVWVIEW.handles.save_point_listbox, 'Value');
0349 AVWVIEW = change_listbox_line(AVWVIEW, lineNo);
0350 end
0351
0352
0353
0354
0355
0356
0357
0358
0359 case {'roi_9','roi_7','roi_5','roi_3'},
0360
0361 position = [ AVWVIEW.slices.sag, AVWVIEW.slices.cor, AVWVIEW.slices.axi ];
0362
0363 shape.type = 'block';
0364 if findstr(command,'9'), shape.size = [9,9,9]; end
0365 if findstr(command,'7'), shape.size = [7,7,7]; end
0366 if findstr(command,'5'), shape.size = [5,5,5]; end
0367 if findstr(command,'3'), shape.size = [3,3,3]; end
0368
0369 stats.roi = avw_roi(AVWVIEW.avw,position,shape);
0370
0371 AVWVIEW.avw.stats = avw_stats(stats);
0372
0373
0374
0375
0376
0377 case {'nasion','rpa','lpa','ac'},
0378
0379
0380 AVWVIEW = slices2metric(AVWVIEW);
0381
0382 if get(AVWVIEW.handles.coord,'value') == 2,
0383 format = '%7.3f %7.3f %7.3f';
0384 imgXYZ = AVWVIEW.imgXYZ.mm;
0385 string = sprintf('%7.3f %7.3f %7.3f',imgXYZ);
0386 elseif get(AVWVIEW.handles.coord,'value') == 3,
0387 format = '%7.3f %7.3f %7.3f';
0388 imgXYZ = AVWVIEW.imgXYZ.meters;
0389 string = sprintf('%7.3f %7.3f %7.3f',imgXYZ);
0390 else
0391 imgXYZ = AVWVIEW.imgXYZ.voxels;
0392 string = sprintf('%7.0f %7.0f %7.0f',imgXYZ);
0393 end;
0394
0395 switch command,
0396 case 'nasion',
0397 set(AVWVIEW.handles.nasion,'String',string);
0398 AVWVIEW.avw.fiducials.nasion.voxels(1,:) = AVWVIEW.imgXYZ.voxels;
0399 AVWVIEW.avw.fiducials.nasion.meters(1,:) = AVWVIEW.imgXYZ.meters;
0400 AVWVIEW.avw.fiducials.nasion.mm(1,:) = AVWVIEW.imgXYZ.mm;
0401 case 'rpa',
0402 set(AVWVIEW.handles.rpa,'String',string);
0403 AVWVIEW.avw.fiducials.rpa.voxels(1,:) = AVWVIEW.imgXYZ.voxels;
0404 AVWVIEW.avw.fiducials.rpa.meters(1,:) = AVWVIEW.imgXYZ.meters;
0405 AVWVIEW.avw.fiducials.rpa.mm(1,:) = AVWVIEW.imgXYZ.mm;
0406 case 'lpa',
0407 set(AVWVIEW.handles.lpa,'String',string);
0408 AVWVIEW.avw.fiducials.lpa.voxels(1,:) = AVWVIEW.imgXYZ.voxels;
0409 AVWVIEW.avw.fiducials.lpa.meters(1,:) = AVWVIEW.imgXYZ.meters;
0410 AVWVIEW.avw.fiducials.lpa.mm(1,:) = AVWVIEW.imgXYZ.mm;
0411 case 'ac',
0412 set(AVWVIEW.handles.ac,'String',string);
0413 AVWVIEW.avw.ac.voxels(1,:) = AVWVIEW.imgXYZ.voxels;
0414 AVWVIEW.avw.ac.meters(1,:) = AVWVIEW.imgXYZ.meters;
0415 AVWVIEW.avw.ac.mm(1,:) = AVWVIEW.imgXYZ.mm;
0416 end
0417
0418
0419
0420
0421
0422
0423
0424
0425
0426 case 'flip',
0427
0428
0429 AVWVIEW.avw.img = flipdim(AVWVIEW.avw.img,1);
0430
0431 if isfield(AVWVIEW.handles,'axial_image'),
0432 Saxi = squeeze(AVWVIEW.avw.img(:,:,AVWVIEW.slices.axi));
0433 set(AVWVIEW.handles.axial_image,'CData',Saxi');
0434 end;
0435 if isfield(AVWVIEW.handles,'coronal_image'),
0436 Scor = squeeze(AVWVIEW.avw.img(:,AVWVIEW.slices.cor,:));
0437 set(AVWVIEW.handles.coronal_image,'CData',Scor');
0438 end;
0439 if isfield(AVWVIEW.handles,'sagittal_image'),
0440 Ssag = squeeze(AVWVIEW.avw.img(AVWVIEW.slices.sag,:,:));
0441 set(AVWVIEW.handles.sagittal_image,'CData',Ssag');
0442 end;
0443
0444 flipStatus = get(AVWVIEW.handles.flipStatus,'string');
0445 if strmatch(flipStatus,'R>>L (radiological)'),
0446 flipStatus = 'L>>R (neurological)';
0447 else
0448 flipStatus = 'R>>L (radiological)';
0449 end;
0450 set(AVWVIEW.handles.flipStatus,'string',flipStatus);
0451
0452
0453
0454
0455
0456
0457
0458
0459 case {'brighter','dimmer','setclimit'},
0460
0461 switch command,
0462 case 'brighter',
0463 AVWVIEW.clim = AVWVIEW.clim .* 0.9;
0464 case 'dimmer',
0465 AVWVIEW.clim = AVWVIEW.clim .* 1.1;
0466 case 'setclimit',
0467 clim = get(AVWVIEW.handles.clim,'string');
0468 AVWVIEW.clim(2) = str2num(clim);
0469 end
0470 climString = sprintf('%05.2f',AVWVIEW.clim(2));
0471 set(AVWVIEW.handles.clim,'string',climString);
0472
0473 if isfield(AVWVIEW.handles,'axial_image'),
0474 set(AVWVIEW.handles.axial_axes,'Clim',AVWVIEW.clim);
0475 end;
0476 if isfield(AVWVIEW.handles,'coronal_image'),
0477 set(AVWVIEW.handles.coronal_axes,'Clim',AVWVIEW.clim);
0478 end;
0479 if isfield(AVWVIEW.handles,'sagittal_image'),
0480 set(AVWVIEW.handles.sagittal_axes,'Clim',AVWVIEW.clim);
0481 end;
0482
0483
0484
0485
0486
0487
0488 case 'contrast'
0489
0490 if isfield(AVWVIEW.handles,'axial_image'),
0491 X = squeeze(AVWVIEW.avw.img(:,:,AVWVIEW.slices.axi));
0492 AVWVIEW.cmap = contrast(X);
0493 colormap(AVWVIEW.handles.axial_axes,AVWVIEW.cmap);
0494 end;
0495 if isfield(AVWVIEW.handles,'coronal_image'),
0496 X = squeeze(AVWVIEW.avw.img(:,AVWVIEW.slices.cor,:));
0497 AVWVIEW.cmap = contrast(X);
0498 colormap(AVWVIEW.handles.axial_axes,AVWVIEW.cmap);
0499 end;
0500 if isfield(AVWVIEW.handles,'sagittal_image'),
0501 X = squeeze(AVWVIEW.avw.img(AVWVIEW.slices.sag,:,:));
0502 AVWVIEW.cmap = contrast(X);
0503 colormap(AVWVIEW.handles.axial_axes,AVWVIEW.cmap);
0504 end;
0505
0506
0507
0508
0509
0510
0511 case 'setcmap'
0512
0513 cmapIndex = get(AVWVIEW.handles.cmap,'value');
0514 cmapString = get(AVWVIEW.handles.cmap,'string');
0515
0516 AVWVIEW.cmapString = cmapString{cmapIndex};
0517
0518 if isfield(AVWVIEW.handles,'axial_image'),
0519 AVWVIEW.cmap = colormap(AVWVIEW.handles.axial_axes,AVWVIEW.cmapString);
0520 end;
0521 if isfield(AVWVIEW.handles,'coronal_image'),
0522 AVWVIEW.cmap = colormap(AVWVIEW.handles.coronal_axes,AVWVIEW.cmapString);
0523 end;
0524 if isfield(AVWVIEW.handles,'sagittal_image'),
0525 AVWVIEW.cmap = colormap(AVWVIEW.handles.sagittal_axes,AVWVIEW.cmapString);
0526 end;
0527
0528
0529
0530
0531
0532
0533 case 'histogram',
0534
0535 avw = AVWVIEW.avw;
0536
0537
0538
0539
0540
0541
0542
0543
0544
0545
0546
0547
0548
0549 intensity_min = min(min(min(avw.img)));
0550 intensity_max = max(max(max(avw.img)));
0551
0552 bins = intensity_min:intensity_max;
0553
0554 fprintf('...calculating histogram for %d bins.\n',length(bins));
0555
0556 for i=1:size(avw.img,3),
0557 n = hist(avw.img(:,:,i), bins);
0558 if i == 1,
0559 intensity_volume = sum(n,2);
0560 else
0561 intensity_slice = sum(n,2);
0562 intensity_volume = intensity_volume + intensity_slice;
0563 end
0564 end
0565 figure('name','intensity histogram');
0566 bar(bins,intensity_volume);
0567
0568
0569
0570
0571
0572
0573 case 'zoom'
0574
0575 x = AVWVIEW.slices.sag;
0576 y = AVWVIEW.slices.cor;
0577 z = AVWVIEW.slices.axi;
0578
0579 switch AVWVIEW.view,
0580 case 'axi',
0581 slice = rot90(AVWVIEW.avw.img(:,:,z));
0582 case 'cor',
0583 slice = rot90(squeeze(AVWVIEW.avw.img(:,y,:)));
0584 case 'sag',
0585 slice = rot90(squeeze(AVWVIEW.avw.img(x,:,:)));
0586 end
0587
0588 figure;
0589 imagesc(slice,AVWVIEW.clim);
0590 colormap(gray); axis off; zoom on;
0591 daspect(AVWVIEW.daspect);
0592
0593
0594
0595
0596
0597
0598 case 'save_image',
0599
0600 [filename, pathname] = uiputfile(...
0601 { '*.png','PNG Files (*.png)'; ...
0602 '*.jpg','JPG Files (*.jpg)'; ...
0603 '*.ppm;*.pgm;*.pbm','Portable Anymap (*.ppm,*.pgm,*.pbm)'; ...
0604 '*.*', 'All Files (*.*)'}, ...
0605 'IMWrite to file');
0606
0607 if filename,
0608
0609 x = AVWVIEW.slices.sag;
0610 y = AVWVIEW.slices.cor;
0611 z = AVWVIEW.slices.axi;
0612
0613 pixelsPerMM = 1 ./ double(AVWVIEW.avw.hdr.dime.pixdim(2:4));
0614 pixelsPerMeter = pixelsPerMM .* 1000;
0615
0616 switch AVWVIEW.view,
0617 case 'axi',
0618 slice = rot90(AVWVIEW.avw.img(:,:,z));
0619 xresolution = pixelsPerMeter(1);
0620 yresolution = pixelsPerMeter(2);
0621 case 'cor',
0622 slice = rot90(squeeze(AVWVIEW.avw.img(:,y,:)));
0623 xresolution = pixelsPerMeter(1);
0624 yresolution = pixelsPerMeter(3);
0625 case 'sag',
0626 slice = rot90(squeeze(AVWVIEW.avw.img(x,:,:)));
0627 xresolution = pixelsPerMeter(2);
0628 yresolution = pixelsPerMeter(3);
0629 end
0630
0631
0632
0633
0634
0635
0636 scaledSlice = slice ./ AVWVIEW.clim(2);
0637
0638
0639
0640
0641 file = [pathname,filename];
0642 fprintf('saving to:...%s\n',file);
0643
0644
0645
0646
0647
0648
0649
0650
0651
0652 [pathname,filename,ext] = fileparts([pathname,filename]);
0653
0654 switch ext,
0655
0656 case '.png',
0657
0658
0659
0660
0661
0662
0663
0664
0665
0666
0667 format = 'png';
0668 imwrite(scaledSlice,file,format,...
0669 'BitDepth',16,'ResolutionUnit','meter',...
0670 'XResolution',xresolution,...
0671 'YResolution',yresolution);
0672
0673 case '.jpg',
0674 format = 'jpg';
0675 imwrite(scaledSlice,file,format);
0676 case {'.ppm','.pgm','.pbm'},
0677 format = ext(2:end);
0678 imwrite(scaledSlice,file,format);
0679 otherwise
0680 fprintf('...cannot write %s image files\n',ext);
0681 end
0682 end
0683
0684
0685
0686
0687
0688
0689
0690 case 'save',
0691
0692 if ~isempty(AVWVIEW.invarname),
0693 fprintf('...returning data to base workspace struct ''%s''\n',AVWVIEW.invarname);
0694 assignin('base',AVWVIEW.invarname,AVWVIEW.avw);
0695 elseif evalin('base','exist(''mri'',''var'')'),
0696 fprintf('...returning data to base workspace struct ''mri''\n');
0697 string = ['AVWVIEW = get(', num2str(AVWVIEW.gui),...
0698 ',''Userdata''); mri.data = AVWVIEW.avw; clear AVWVIEW;'];
0699 evalin('base',string);
0700 else
0701 fprintf('...returning data into base workspace struct ''avw''\n');
0702 assignin('base','avw',AVWVIEW.avw);
0703 end
0704
0705
0706
0707
0708 h = file_dialog;
0709 h = set(h, 'current_dir', pwd);
0710 h = set(h, 'file_extensions', {'.mps.mat'});
0711 h = set(h, 'save_mode', 1);
0712 [pname, fname] = visible(h);
0713
0714 if length(pname) == 0
0715 disp('filename not specified.')
0716 else
0717 write = true;
0718 output_file = fullfile(pname, fname{1});
0719 if exist(output_file, 'file')
0720 res = questdlg('file is already exist. overwrite?', 'Confirm', ...
0721 'Yes', 'No',...
0722 'Yes');
0723 if strcmp(res, 'No')
0724 write = false;
0725 end
0726 end
0727
0728 if write
0729 AVWVIEW.mps_fileio = ...
0730 vb_mps_fileio_set_pointlist(AVWVIEW.mps_fileio, AVWVIEW.point_list);
0731 if vb_mps_fileio_write(AVWVIEW.mps_fileio, output_file) == FAILURE
0732 errordlg('mps file save failed.', 'error');
0733 else
0734 msgbox('mps file was saved.', 'confirm');
0735 end
0736 end
0737 end
0738
0739
0740
0741
0742 case 'load'
0743
0744
0745
0746 h = file_dialog;
0747 h = set(h, 'current_dir', pwd);
0748 h = set(h, 'file_extensions', {'.mps.mat'});
0749 h = set(h, 'save_mode', 0);
0750 [pname, fname] = visible(h);
0751
0752 if length(pname) == 0
0753 disp('filename not specified.')
0754 else
0755 input_file = fullfile(pname, fname{1});
0756 AVWVIEW.mps_fileio = vb_mps_fileio_read(AVWVIEW.mps_fileio, input_file);
0757 AVWVIEW.point_list = vb_mps_fileio_get_pointlist(AVWVIEW.mps_fileio);
0758 update_point_list(AVWVIEW);
0759 set(AVWVIEW.handles.save_point_listbox, 'Value', 1);
0760 AVWVIEW = change_listbox_line(AVWVIEW, 1);
0761 end
0762
0763
0764
0765
0766 case 'close',
0767
0768
0769
0770 global vbmeg_inst;
0771 const = vbmeg_inst.const;
0772
0773 NPoints = vb_mps_pointlist_get_pointnum(AVWVIEW.point_list);
0774 analyze_info = vb_mps_fileio_get_analyze_info(AVWVIEW.mps_fileio);
0775 Vdim = vb_analyze_info_get_voxdim(analyze_info);
0776 Vsize = vb_analyze_info_get_voxsize(analyze_info);
0777
0778
0779 point_selected = struct;
0780 point_selected.coord_type = const.COORDINATE_SPM_RIGHT_M;
0781 point_selected.name = cell(NPoints, 1);
0782 point_selected.pos = zeros(NPoints, 3);
0783 point_base = cell(NPoints, 1);
0784
0785 for k=1:NPoints
0786
0787 [name, point] = vb_mps_pointlist_get_point(AVWVIEW.point_list, k);
0788 p_spm_right_m = vb_analyze_right_to_spm_right(point.voxels, Vdim, Vsize);
0789 point_selected.name{k} = name;
0790 point_selected.pos(k, :) = p_spm_right_m;
0791
0792
0793 point_base{k}.name = name;
0794 point_base{k}.point = point;
0795 end
0796 AVWVIEW.avw.point_selected = point_selected;
0797 AVWVIEW.avw.point_base = point_base;
0798
0799
0800
0801
0802 fprintf('...returning data into base workspace struct ''avw''\n');
0803 assignin('base','avw',AVWVIEW.avw);
0804 close gcbf;
0805
0806 otherwise,
0807 end
0808
0809 switch command,
0810 case 'save',
0811 case 'close',
0812 otherwise,
0813 set(AVWVIEW.gui,'UserData',AVWVIEW);
0814 end
0815
0816 if nargout > 0,
0817 varargout{1} = AVWVIEW.avw;
0818 end
0819
0820 return
0821
0822
0823
0824
0825
0826
0827
0828
0829
0830
0831
0832
0833 function AVWVIEW = axial_update(AVWVIEW)
0834
0835 if isfield(AVWVIEW.handles,'axial_image'),
0836 Saxi = squeeze(AVWVIEW.avw.img(:,:,AVWVIEW.slices.axi));
0837 set(AVWVIEW.handles.axial_image,'CData',Saxi');
0838 end
0839 if isfield(AVWVIEW.handles,'axial_sliderN'),
0840 set(AVWVIEW.handles.axial_sliderN,'String',num2str(AVWVIEW.slices.axi));
0841 set(AVWVIEW.handles.axial_sliderN,'Value',AVWVIEW.slices.axi);
0842 end
0843 if isfield(AVWVIEW.handles,'axial_slider'),
0844 set(AVWVIEW.handles.axial_slider,'Value',AVWVIEW.slices.axi);
0845 end;
0846
0847 [space, space_name] = get_coordinate_space(AVWVIEW);
0848 AVWVIEW = vb_mri_point_select_display_layer(AVWVIEW, 'z', ...
0849 AVWVIEW.slices.axi, ...
0850 space_name);
0851
0852 return
0853
0854
0855
0856 function AVWVIEW = coronal_update(AVWVIEW)
0857
0858 if isfield(AVWVIEW.handles,'coronal_image'),
0859 Scor = squeeze(AVWVIEW.avw.img(:,AVWVIEW.slices.cor,:));
0860 set(AVWVIEW.handles.coronal_image,'CData',Scor');
0861 end
0862 if isfield(AVWVIEW.handles,'coronal_sliderN'),
0863 set(AVWVIEW.handles.coronal_sliderN,'String',num2str(AVWVIEW.slices.cor));
0864 set(AVWVIEW.handles.coronal_sliderN,'Value',AVWVIEW.slices.cor);
0865 end
0866 if isfield(AVWVIEW.handles,'coronal_slider'),
0867 set(AVWVIEW.handles.coronal_slider,'Value',AVWVIEW.slices.cor);
0868 end;
0869
0870 [space, space_name] = get_coordinate_space(AVWVIEW);
0871 AVWVIEW = vb_mri_point_select_display_layer(AVWVIEW, 'y', ...
0872 AVWVIEW.slices.cor, ...
0873 space_name);
0874
0875 return
0876
0877
0878
0879 function AVWVIEW = sagittal_update(AVWVIEW)
0880
0881 if isfield(AVWVIEW.handles,'sagittal_image'),
0882 Ssag = squeeze(AVWVIEW.avw.img(AVWVIEW.slices.sag,:,:));
0883 set(AVWVIEW.handles.sagittal_image,'CData',Ssag');
0884 end
0885 if isfield(AVWVIEW.handles,'sagittal_sliderN'),
0886 set(AVWVIEW.handles.sagittal_sliderN,'String',num2str(AVWVIEW.slices.sag));
0887 set(AVWVIEW.handles.sagittal_sliderN,'Value',AVWVIEW.slices.sag);
0888 end
0889 if isfield(AVWVIEW.handles,'sagittal_slider'),
0890 set(AVWVIEW.handles.sagittal_slider,'Value',AVWVIEW.slices.sag);
0891 end;
0892
0893 [space, space_name] = get_coordinate_space(AVWVIEW);
0894 AVWVIEW = vb_mri_point_select_display_layer(AVWVIEW, 'x', ...
0895 AVWVIEW.slices.sag, ...
0896 space_name);
0897
0898 return
0899
0900
0901
0902 function AVWVIEW = set_crosshairs(AVWVIEW)
0903
0904 fig = figure(AVWVIEW.gui);
0905 current_axes = get(fig, 'CurrentAxes');
0906
0907 [AVWVIEW, metric] = slices2metric(AVWVIEW);
0908
0909 if isfield(AVWVIEW.handles,'axial_axes'),
0910 set(fig, 'CurrentAxes', AVWVIEW.handles.axial_axes);
0911
0912 x_value = [metric.sag metric.sag];
0913 y_value = [metric.cor metric.cor];
0914
0915 AVWVIEW.handles.axial_xlim = get(AVWVIEW.handles.axial_axes,'Xlim');
0916 AVWVIEW.handles.axial_ylim = get(AVWVIEW.handles.axial_axes,'Ylim');
0917 set(AVWVIEW.handles.axial_xline, 'Xdata', x_value,'Ydata',AVWVIEW.handles.axial_ylim);
0918 set(AVWVIEW.handles.axial_yline, 'Ydata', y_value,'Xdata',AVWVIEW.handles.axial_xlim);
0919 set(AVWVIEW.handles.axial_xline,'Color','b','EraseMode','xor','Tag','XLINE');
0920 set(AVWVIEW.handles.axial_yline,'Color','b','EraseMode','xor','Tag','YLINE');
0921
0922 if get(AVWVIEW.handles.crosshairs,'value'),
0923 set(AVWVIEW.handles.axial_xline,'visible','on');
0924 set(AVWVIEW.handles.axial_yline,'visible','on');
0925 else
0926 set(AVWVIEW.handles.axial_xline,'visible','off');
0927 set(AVWVIEW.handles.axial_yline,'visible','off');
0928 end
0929
0930 end
0931
0932 if isfield(AVWVIEW.handles,'coronal_axes'),
0933 set(fig, 'CurrentAxes', AVWVIEW.handles.coronal_axes);
0934
0935 x_value = [metric.sag metric.sag];
0936 y_value = [metric.axi metric.axi];
0937
0938 AVWVIEW.handles.coronal_xlim = get(AVWVIEW.handles.coronal_axes,'Xlim');
0939 AVWVIEW.handles.coronal_ylim = get(AVWVIEW.handles.coronal_axes,'Ylim');
0940 set(AVWVIEW.handles.coronal_xline, 'Xdata',x_value,'Ydata',AVWVIEW.handles.coronal_ylim);
0941 set(AVWVIEW.handles.coronal_yline, 'Ydata',y_value,'Xdata',AVWVIEW.handles.coronal_xlim);
0942 set(AVWVIEW.handles.coronal_xline,'Color','b','EraseMode','xor','Tag','XLINE');
0943 set(AVWVIEW.handles.coronal_yline,'Color','b','EraseMode','xor','Tag','YLINE');
0944
0945
0946 if get(AVWVIEW.handles.crosshairs,'value'),
0947 set(AVWVIEW.handles.coronal_xline,'visible','on');
0948 set(AVWVIEW.handles.coronal_yline,'visible','on');
0949 else
0950 set(AVWVIEW.handles.coronal_xline,'visible','off');
0951 set(AVWVIEW.handles.coronal_yline,'visible','off');
0952 end
0953
0954 end
0955
0956 if isfield(AVWVIEW.handles,'sagittal_axes'),
0957 set(fig, 'CurrentAxes', AVWVIEW.handles.sagittal_axes);
0958
0959 x_value = [metric.cor metric.cor];
0960 y_value = [metric.axi metric.axi];
0961
0962 AVWVIEW.handles.sagittal_xlim = get(AVWVIEW.handles.sagittal_axes,'Xlim');
0963 AVWVIEW.handles.sagittal_ylim = get(AVWVIEW.handles.sagittal_axes,'Ylim');
0964 set(AVWVIEW.handles.sagittal_xline, 'Xdata',x_value,'Ydata',AVWVIEW.handles.sagittal_ylim);
0965 set(AVWVIEW.handles.sagittal_yline, 'Ydata',y_value,'Xdata',AVWVIEW.handles.sagittal_xlim);
0966 set(AVWVIEW.handles.sagittal_xline,'Color','b','EraseMode','xor','Tag','XLINE');
0967 set(AVWVIEW.handles.sagittal_yline,'Color','b','EraseMode','xor','Tag','YLINE');
0968
0969 if get(AVWVIEW.handles.crosshairs,'value'),
0970 set(AVWVIEW.handles.sagittal_xline,'visible','on');
0971 set(AVWVIEW.handles.sagittal_yline,'visible','on');
0972 else
0973 set(AVWVIEW.handles.sagittal_xline,'visible','off');
0974 set(AVWVIEW.handles.sagittal_yline,'visible','off');
0975 end
0976
0977 end
0978
0979 set(fig, 'CurrentAxes', current_axes);
0980
0981 return
0982
0983
0984 function AVWVIEW = set_coordinates(AVWVIEW)
0985
0986
0987
0988 s = size(AVWVIEW.avw.img);
0989 if length(s) > 0, xdim = s(1); else xdim = 1; end
0990 if length(s) > 1, ydim = s(2); else ydim = 1; end
0991 if length(s) > 2, zdim = s(3); else zdim = 1; end
0992
0993
0994 xpixdim = double(AVWVIEW.avw.hdr.dime.pixdim(2));
0995 ypixdim = double(AVWVIEW.avw.hdr.dime.pixdim(3));
0996 zpixdim = double(AVWVIEW.avw.hdr.dime.pixdim(4));
0997 xdata = [0 xdim];
0998 ydata = [0 ydim];
0999 zdata = [0 zdim];
1000
1001 aspect = 1./AVWVIEW.daspect;
1002
1003
1004 if get_coordinate_space(AVWVIEW) == COORDINATE_MM,
1005 xdata = xdata .* xpixdim;
1006 ydata = ydata .* ypixdim;
1007 zdata = zdata .* zpixdim;
1008 aspect = [1 1 1];
1009 end
1010
1011 if get_coordinate_space(AVWVIEW) == COORDINATE_M,
1012 xpixdim = xpixdim / 1000;
1013 ypixdim = ypixdim / 1000;
1014 zpixdim = zpixdim / 1000;
1015 xdata = xdata .* xpixdim;
1016 ydata = ydata .* ypixdim;
1017 zdata = zdata .* zpixdim;
1018 aspect = [1 1 1];
1019 end
1020
1021
1022 if isfield(AVWVIEW.handles,'axial_image'),
1023 set(AVWVIEW.handles.axial_axes,'Xlim',xdata);
1024 set(AVWVIEW.handles.axial_axes,'Ylim',ydata);
1025 set(AVWVIEW.handles.axial_axes,'Zlim',zdata);
1026 set(AVWVIEW.handles.axial_image,'Xdata',xdata);
1027 set(AVWVIEW.handles.axial_image,'Ydata',ydata);
1028 daspect(AVWVIEW.handles.axial_axes,aspect([1 2 3]));
1029 end;
1030 if isfield(AVWVIEW.handles,'coronal_image'),
1031 set(AVWVIEW.handles.coronal_axes,'Xlim',xdata);
1032 set(AVWVIEW.handles.coronal_axes,'Ylim',zdata);
1033 set(AVWVIEW.handles.coronal_axes,'Zlim',ydata);
1034 set(AVWVIEW.handles.coronal_image,'Xdata',xdata);
1035 set(AVWVIEW.handles.coronal_image,'Ydata',zdata);
1036 daspect(AVWVIEW.handles.coronal_axes,aspect([1 3 2]));
1037 end;
1038 if isfield(AVWVIEW.handles,'sagittal_image'),
1039 set(AVWVIEW.handles.sagittal_axes,'Xlim',ydata);
1040 set(AVWVIEW.handles.sagittal_axes,'Ylim',zdata);
1041 set(AVWVIEW.handles.sagittal_axes,'Zlim',xdata);
1042 set(AVWVIEW.handles.sagittal_image,'Xdata',ydata);
1043 set(AVWVIEW.handles.sagittal_image,'Ydata',zdata);
1044 daspect(AVWVIEW.handles.sagittal_axes,aspect([2 3 1]));
1045 end;
1046
1047 set_display_values(AVWVIEW);
1048 update_point_list(AVWVIEW);
1049 set_crosshairs(AVWVIEW);
1050
1051 return
1052
1053
1054
1055
1056
1057 function AVWVIEW = get_current_position(AVWVIEW)
1058
1059
1060
1061 if get_coordinate_space(AVWVIEW) == COORDINATE_M
1062 devide = 1000;
1063 else
1064 devide = 1;
1065 end
1066
1067 switch AVWVIEW.view,
1068 case 'sag',
1069 currentpoint = get(get(AVWVIEW.handles.sagittal_image,'Parent'),'CurrentPoint');
1070 metric.cor = currentpoint(1,1);
1071 metric.axi = currentpoint(1,2);
1072 metric.sag = get(AVWVIEW.handles.sagittal_slider,'Value') / devide;
1073 case 'cor',
1074 currentpoint = get(get(AVWVIEW.handles.coronal_image,'Parent'),'CurrentPoint');
1075 metric.sag = currentpoint(2,1);
1076 metric.axi = currentpoint(2,2);
1077 metric.cor = get(AVWVIEW.handles.coronal_slider,'Value') / devide;
1078 case 'axi',
1079 currentpoint = get(get(AVWVIEW.handles.axial_image,'Parent'),'CurrentPoint');
1080 metric.sag = currentpoint(2,1);
1081 metric.cor = currentpoint(2,2);
1082 metric.axi = get(AVWVIEW.handles.axial_slider,'Value') / devide;
1083 end
1084
1085 AVWVIEW = metric2slices(AVWVIEW,metric);
1086 AVWVIEW = check_slices(AVWVIEW);
1087
1088 return
1089
1090
1091
1092
1093
1094 function AVWVIEW = get_slider_position(AVWVIEW)
1095
1096 [AVWVIEW.slices.sag,AVWVIEW.slices.cor,AVWVIEW.slices.axi] = deal(0);
1097
1098 if isfield(AVWVIEW.handles,'sagittal_slider'),
1099 if ishandle(AVWVIEW.handles.sagittal_slider),
1100 AVWVIEW.slices.sag = round(get(AVWVIEW.handles.sagittal_slider,'Value'));
1101 end
1102 end
1103 if AVWVIEW.slices.sag == 0,
1104 if isfield(AVWVIEW.handles,'sagittal_sliderN'),
1105 if ishandle(AVWVIEW.handles.sagittal_sliderN),
1106 AVWVIEW.slices.sag = round(get(AVWVIEW.handles.sagittal_sliderN,'Value'));
1107 end
1108 end
1109 end
1110
1111 if isfield(AVWVIEW.handles,'coronal_slider'),
1112 if ishandle(AVWVIEW.handles.coronal_slider),
1113 AVWVIEW.slices.cor = round(get(AVWVIEW.handles.coronal_slider,'Value'));
1114 end
1115 end
1116 if AVWVIEW.slices.cor == 0,
1117 if isfield(AVWVIEW.handles,'coronal_sliderN'),
1118 if ishandle(AVWVIEW.handles.coronal_sliderN),
1119 AVWVIEW.slices.cor = round(get(AVWVIEW.handles.coronal_sliderN,'Value'));
1120 end
1121 end
1122 end
1123
1124 if isfield(AVWVIEW.handles,'axial_slider'),
1125 if ishandle(AVWVIEW.handles.axial_slider),
1126 AVWVIEW.slices.axi = round(get(AVWVIEW.handles.axial_slider,'Value'));
1127 end
1128 end
1129 if AVWVIEW.slices.axi == 0,
1130 if isfield(AVWVIEW.handles,'axial_sliderN'),
1131 if ishandle(AVWVIEW.handles.axial_sliderN),
1132 AVWVIEW.slices.axi = round(get(AVWVIEW.handles.axial_sliderN,'Value'));
1133 end
1134 end
1135 end
1136
1137 AVWVIEW = check_slices(AVWVIEW);
1138
1139 return
1140
1141
1142
1143 function AVWVIEW = check_slices(AVWVIEW)
1144
1145 adjust = 0;
1146
1147 [ SagSize, CorSize, AxiSize ] = size(AVWVIEW.avw.img);
1148
1149 if AVWVIEW.slices.sag > SagSize,
1150 AVWVIEW.slices.sag = SagSize;
1151 adjust = 1;
1152 end;
1153 if AVWVIEW.slices.sag < 1,
1154 AVWVIEW.slices.sag = 1;
1155 adjust = 1;
1156 end;
1157 if AVWVIEW.slices.cor > CorSize,
1158 AVWVIEW.slices.cor = CorSize;
1159 adjust = 1;
1160 end;
1161 if AVWVIEW.slices.cor < 1,
1162 AVWVIEW.slices.cor = 1;
1163 adjust = 1;
1164 end;
1165 if AVWVIEW.slices.axi > AxiSize,
1166 AVWVIEW.slices.axi = AxiSize;
1167 adjust = 1;
1168 end;
1169 if AVWVIEW.slices.axi < 1,
1170 AVWVIEW.slices.axi = 1;
1171 adjust = 1;
1172 end;
1173
1174 if adjust,
1175 AVWVIEW = slices2metric(AVWVIEW);
1176 end
1177
1178 return
1179
1180
1181
1182 function set_display_values(AVWVIEW)
1183
1184
1185
1186 sag = AVWVIEW.slices.sag;
1187 cor = AVWVIEW.slices.cor;
1188 axi = AVWVIEW.slices.axi;
1189
1190 imgvalue = AVWVIEW.avw.img(sag,cor,axi);
1191
1192 set(AVWVIEW.handles.imval,'String',sprintf('%7.2f',imgvalue));
1193 set(AVWVIEW.handles.imval,'Value',imgvalue);
1194
1195
1196
1197 [AVWVIEW, metric] = slices2metric(AVWVIEW);
1198 sag = metric.sag;
1199 cor = metric.cor;
1200 axi = metric.axi;
1201
1202 [string] = get_display_unit_string(AVWVIEW, AVWVIEW.imgXYZ);
1203
1204 set(AVWVIEW.handles.impos,'String',string);
1205 set(AVWVIEW.handles.impos,'Value',[sag,cor,axi]);
1206
1207 return
1208
1209
1210
1211 function [AVWVIEW,metric] = slices2metric(AVWVIEW)
1212
1213 AVWVIEW.imgXYZ.voxels = [AVWVIEW.slices.sag,AVWVIEW.slices.cor,AVWVIEW.slices.axi];
1214 AVWVIEW.imgXYZ.meters = AVWVIEW.imgXYZ.voxels .* AVWVIEW.scale2meters;
1215 AVWVIEW.imgXYZ.mm = AVWVIEW.imgXYZ.voxels .* AVWVIEW.scale2mm;
1216
1217 if get_coordinate_space(AVWVIEW) == COORDINATE_MM,
1218
1219 img_mm = AVWVIEW.imgXYZ.voxels .* AVWVIEW.scale2mm;
1220 metric.axi = img_mm(3);
1221 metric.cor = img_mm(2);
1222 metric.sag = img_mm(1);
1223 elseif get_coordinate_space(AVWVIEW) == COORDINATE_M,
1224
1225 img_meters = AVWVIEW.imgXYZ.voxels .* AVWVIEW.scale2meters;
1226 metric.axi = img_meters(3);
1227 metric.cor = img_meters(2);
1228 metric.sag = img_meters(1);
1229 elseif get_coordinate_space(AVWVIEW) == COORDINATE_VOXEL
1230
1231 metric.axi = AVWVIEW.slices.axi;
1232 metric.cor = AVWVIEW.slices.cor;
1233 metric.sag = AVWVIEW.slices.sag;
1234 end;
1235
1236 return
1237
1238
1239
1240 function AVWVIEW = metric2slices(AVWVIEW,metric)
1241
1242 coord_space = get_coordinate_space(AVWVIEW);
1243
1244 switch(coord_space)
1245 case COORDINATE_MM
1246 xpix = double(AVWVIEW.avw.hdr.dime.pixdim(2));
1247 ypix = double(AVWVIEW.avw.hdr.dime.pixdim(3));
1248 zpix = double(AVWVIEW.avw.hdr.dime.pixdim(4));
1249 AVWVIEW.slices.axi = round(metric.axi / zpix);
1250 AVWVIEW.slices.cor = round(metric.cor / ypix);
1251 AVWVIEW.slices.sag = round(metric.sag / xpix);
1252 case COORDINATE_M
1253 xpix = double(AVWVIEW.avw.hdr.dime.pixdim(2)) / 1000;
1254 ypix = double(AVWVIEW.avw.hdr.dime.pixdim(3)) / 1000;
1255 zpix = double(AVWVIEW.avw.hdr.dime.pixdim(4)) / 1000;
1256 AVWVIEW.slices.axi = round(metric.axi / zpix);
1257 AVWVIEW.slices.cor = round(metric.cor / ypix);
1258 AVWVIEW.slices.sag = round(metric.sag / xpix);
1259 case COORDINATE_VOXEL
1260 AVWVIEW.slices.axi = round(metric.axi);
1261 AVWVIEW.slices.cor = round(metric.cor);
1262 AVWVIEW.slices.sag = round(metric.sag);
1263 end
1264
1265 return
1266
1267
1268
1269
1270
1271
1272 function AVWVIEW = init(avw,invarname)
1273
1274
1275 if exist('invarname','var'),
1276 if ~isempty(invarname),
1277 AVWVIEW.invarname = invarname;
1278 else
1279 AVWVIEW.invarname = '';
1280 end
1281 else
1282 AVWVIEW.invarname = '';
1283 end
1284
1285
1286 GUIwidth = 1;
1287 GUIheight = 1/3;
1288
1289 version = '[$Revision: 1202 $]';
1290 name = sprintf('vb_mri_point_select [v%s]',version(12:16));
1291
1292 if isfield(avw,'fileprefix'),
1293 if ~isempty(avw.fileprefix),
1294 format = strcat('%+',sprintf('%d',length(avw.fileprefix)+1),'s');
1295 name = strcat(name,' - ',sprintf(format,avw.fileprefix));
1296 end
1297 end
1298
1299
1300 GUI = figure('Name',name,'Tag','AVWVIEW','units','Normalized',...
1301 'BackingStore','off',...
1302 'NumberTitle','off','color',[0 0 0],...
1303 'MenuBar','figure','Position',[0 0.1 1.0 0.8],...
1304 'Renderer','zbuffer','Interruptible', 'off', 'BusyAction', 'queue');
1305
1306 movegui(GUI,'center');
1307
1308 set(GUI,'KeyPressFcn','vb_mri_point_select([],[],''keypress'');');
1309
1310 AVWVIEW.gui = GUI;
1311 Font.FontName = 'Helvetica';
1312 Font.FontUnits = 'Pixels';
1313 Font.FontSize = 15;
1314 Font.FontWeight = 'normal';
1315 Font.FontAngle = 'normal';
1316
1317
1318 AVWVIEW.shading = 'flat';
1319 shading(AVWVIEW.shading)
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341 intensityMean = mean(mean(mean(avw.img)));
1342 intensityMeanRobust = mean(mean(mean(avw.img(find(avw.img)))));
1343 intensityStdev = std(std(std(avw.img)));
1344
1345 intensityMax = max(max(max(avw.img)));
1346
1347
1348 if intensityMax > 255,
1349
1350 adjust = 0.5;
1351 else
1352 adjust = 0.9;
1353 end
1354
1355 AVWVIEW.clim = [0 (intensityMax * adjust)];
1356
1357
1358
1359 AVWVIEW.xdim = size(avw.img,1);
1360 AVWVIEW.ydim = size(avw.img,2);
1361 AVWVIEW.zdim = size(avw.img,3);
1362
1363 AVWVIEW.slices.sag = 1;
1364 AVWVIEW.slices.cor = 1;
1365 AVWVIEW.slices.axi = 1;
1366 if AVWVIEW.xdim > 1, AVWVIEW.slices.sag = floor(AVWVIEW.xdim/2); end
1367 if AVWVIEW.ydim > 1, AVWVIEW.slices.cor = floor(AVWVIEW.ydim/2); end
1368 if AVWVIEW.zdim > 1, AVWVIEW.slices.axi = floor(AVWVIEW.zdim/2); end
1369
1370
1371
1372 center = avw_center(avw);
1373 AVWVIEW.center = center.abs.voxels;
1374
1375
1376 AVWVIEW.origin = AVWVIEW.center;
1377
1378 AVWVIEW.pixdim = double(avw.hdr.dime.pixdim(2:4));
1379
1380 AVWVIEW.scale2mm = AVWVIEW.pixdim;
1381 AVWVIEW.scale2meters = AVWVIEW.pixdim ./ 1000;
1382 AVWVIEW.daspect = AVWVIEW.pixdim ./ min(AVWVIEW.pixdim);
1383
1384 xPlotSize = 0.38;
1385 yPlotSize = 0.38;
1386
1387 AVWVIEW.cmapString = 'gray';
1388
1389 AVWVIEW.cmap = colormap(AVWVIEW.cmapString);
1390
1391
1392
1393
1394
1395 AVWVIEW.mps_fileio = vb_mps_fileio_new([avw.fileprefix, '.hdr']);
1396 AVWVIEW.point_list = vb_mps_pointlist_new;
1397
1398
1399 if isfield(avw, 'point_spm_right_m')
1400 Vdim = [AVWVIEW.xdim, AVWVIEW.ydim, AVWVIEW.zdim];
1401 Vsize = AVWVIEW.pixdim;
1402
1403 for k=1:length(avw.point_spm_right_m.name)
1404 name = avw.point_spm_right_m.name{k};
1405 point.voxels = ...
1406 vb_spm_right_to_analyze_right(avw.point_spm_right_m.pos(k, :),...
1407 Vdim, Vsize);
1408 point.mm = ...
1409 vb_spm_right_to_analyze_right_mm(avw.point_spm_right_m.pos(k, :),...
1410 Vdim, Vsize);
1411 point.meters = point.mm .* 0.001;
1412
1413 [AVWVIEW.point_list, result] =...
1414 vb_mps_pointlist_add_point(AVWVIEW.point_list, ...
1415 name, ...
1416 point);
1417 end
1418 end
1419
1420
1421
1422
1423 if isfield(avw, 'display_factor')
1424 AVWVIEW.display_factor = avw.display_factor;
1425 end
1426
1427
1428
1429 if AVWVIEW.xdim > 1 & AVWVIEW.ydim > 1,
1430
1431 handles.axial_subplot = subplot('position',[0.075 0.075 xPlotSize yPlotSize]);
1432
1433
1434
1435
1436 Saxial = squeeze(avw.img(:,:,AVWVIEW.slices.axi));
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449 handles.axial_image = imagesc([0,AVWVIEW.xdim],[0,AVWVIEW.ydim],Saxial',AVWVIEW.clim);
1450
1451 handles.axial_axes = gca;
1452 set(gca,'YDir','normal','XLimMode','manual','YLimMode','manual',...
1453 'ClimMode','manual','YColor',[1 1 1],'XColor',[1 1 1])
1454
1455 title('Axial','Color',[1 1 1])
1456 ylabel('Y')
1457 xlabel('Left ----- X ----- Right')
1458
1459
1460
1461
1462 set(handles.axial_image,'ButtonDownFcn','vb_mri_point_select([],[],''axial_image'');');
1463
1464 GUIheight = 0.48;
1465
1466 if AVWVIEW.zdim > 1,
1467 slider_step(1) = 1/(AVWVIEW.zdim);
1468 slider_step(2) = 1/(AVWVIEW.zdim);
1469 handles.axial_slider = uicontrol('Parent',GUI,'Style','slider',...
1470 'Units','Normalized', Font, ...
1471 'Position',[.55 GUIheight .10 .03], 'HorizontalAlignment', 'center',...
1472 'BusyAction','cancel',...
1473 'Interruptible', 'off', ...
1474 'TooltipString','Axial slice navigation',...
1475 'Min',1,'Max',AVWVIEW.zdim,'SliderStep',slider_step,'Value',AVWVIEW.slices.axi,...
1476 'Callback','vb_mri_point_select([],[],''axial_slider'');');
1477 end
1478 handles.axial_sliderN = uicontrol('Parent',GUI,'Style','text',...
1479 'Units','Normalized', Font, ...
1480 'Position',[.65 GUIheight .03 .03], 'HorizontalAlignment', 'center',...
1481 'BackgroundColor',[0 0 0],'ForegroundColor',[1 1 1],...
1482 'BusyAction','queue',...
1483 'TooltipString','Axial slice number',...
1484 'String',num2str(AVWVIEW.slices.axi),'Value',AVWVIEW.slices.axi);
1485 handles.axial_sliderT = uicontrol('Parent',GUI,'Style','text',...
1486 'Units','Normalized', Font, ...
1487 'Position',[.70 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1488 'BackgroundColor',[0 0 0],'ForegroundColor',[1 1 1],...
1489 'BusyAction','queue',...
1490 'TooltipString','Axial slice navigation',...
1491 'String','Axial');
1492
1493 handles.axial_xlim = get(handles.axial_axes,'Xlim');
1494 handles.axial_ylim = get(handles.axial_axes,'Ylim');
1495 handles.axial_xline = line('Xdata',[AVWVIEW.slices.sag AVWVIEW.slices.sag], ...
1496 'Ydata',handles.axial_ylim, ...
1497 'ButtonDownFcn', 'vb_mri_point_select([],[],''axial_image'');');
1498 handles.axial_yline = line('Ydata',[AVWVIEW.slices.cor AVWVIEW.slices.cor],...
1499 'Xdata',handles.axial_xlim, ...
1500 'ButtonDownFcn', 'vb_mri_point_select([],[],''axial_image'');');
1501 set(handles.axial_xline,'Color','b','EraseMode','xor','Tag','XLINE', 'Visible', 'off');
1502 set(handles.axial_yline,'Color','b','EraseMode','xor','Tag','YLINE', 'Visible', 'off');
1503
1504 end
1505
1506
1507
1508
1509 if AVWVIEW.xdim > 1 & AVWVIEW.zdim > 1,
1510
1511 handles.coronal_subplot = subplot('position',[0.075 0.575 xPlotSize yPlotSize]);
1512
1513 Scor = squeeze(avw.img(:,AVWVIEW.slices.cor,:));
1514 handles.coronal_image = imagesc([0,AVWVIEW.xdim],[0,AVWVIEW.zdim],Scor',AVWVIEW.clim);
1515 handles.coronal_axes = gca;
1516 set(gca,'YDir','normal','XLimMode','manual','YLimMode','manual',...
1517 'ClimMode','manual','YColor',[1 1 1],'XColor',[1 1 1])
1518
1519
1520
1521 xlabel('Left ----- X ----- Right')
1522 ylabel('Z')
1523 title('Coronal','Color',[1 1 1])
1524
1525
1526 set(handles.coronal_image,'ButtonDownFcn','vb_mri_point_select([],[],''coronal_image'');');
1527
1528 GUIheight = GUIheight - 0.04;
1529
1530 if AVWVIEW.ydim > 1,
1531 slider_step(1) = 1/(AVWVIEW.ydim);
1532 slider_step(2) = 1/(AVWVIEW.ydim);
1533 handles.coronal_slider = uicontrol('Parent',GUI,'Style','slider',...
1534 'Units','Normalized', Font, ...
1535 'Position',[.55 GUIheight .10 .03], 'HorizontalAlignment', 'center',...
1536 'BusyAction','cancel',...
1537 'Interruptible', 'off', ...
1538 'TooltipString','Coronal slice navigation',...
1539 'Min',1,'Max',AVWVIEW.ydim,'SliderStep',slider_step,'Value',AVWVIEW.slices.cor,...
1540 'Callback','vb_mri_point_select([],[],''coronal_slider'');');
1541 end
1542 handles.coronal_sliderN = uicontrol('Parent',GUI,'Style','text',...
1543 'Units','Normalized', Font, ...
1544 'Position',[.65 GUIheight .03 .03], 'HorizontalAlignment', 'center',...
1545 'BackgroundColor',[0 0 0],'ForegroundColor',[1 1 1],...
1546 'BusyAction','queue',...
1547 'TooltipString','Coronal slice number',...
1548 'String',num2str(AVWVIEW.slices.cor),'Value',AVWVIEW.slices.cor);
1549 handles.coronal_sliderT = uicontrol('Parent',GUI,'Style','text',...
1550 'Units','Normalized', Font, ...
1551 'Position',[.70 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1552 'BackgroundColor',[0 0 0],'ForegroundColor',[1 1 1],...
1553 'BusyAction','queue',...
1554 'TooltipString','Coronal slice navigation',...
1555 'String','Coronal');
1556
1557 handles.coronal_xlim = get(handles.coronal_axes,'Xlim');
1558 handles.coronal_ylim = get(handles.coronal_axes,'Ylim');
1559 handles.coronal_xline = line('Xdata',[AVWVIEW.slices.sag AVWVIEW.slices.sag], ...
1560 'Ydata',handles.coronal_ylim, ...
1561 'ButtonDownFcn', 'vb_mri_point_select([],[],''coronal_image'');');
1562 handles.coronal_yline = line('Ydata',[AVWVIEW.slices.axi AVWVIEW.slices.axi], ...
1563 'Xdata',handles.coronal_xlim, ...
1564 'ButtonDownFcn', 'vb_mri_point_select([],[],''coronal_image'');');
1565 set(handles.coronal_xline,'Color','b','EraseMode','xor','Tag','XLINE', 'Visible', 'off');
1566 set(handles.coronal_yline,'Color','b','EraseMode','xor','Tag','YLINE', 'Visible', 'off');
1567
1568 end
1569
1570
1571
1572
1573 if AVWVIEW.ydim > 1 & AVWVIEW.zdim > 1,
1574
1575 handles.sagittal_subplot = subplot('position',[0.575 0.575 xPlotSize yPlotSize]);
1576
1577 Ssag = squeeze(avw.img(AVWVIEW.slices.sag,:,:));
1578 handles.sagittal_image = imagesc([0,AVWVIEW.ydim],[0,AVWVIEW.zdim],Ssag',AVWVIEW.clim);
1579
1580 handles.sagittal_axes = gca;
1581 set(gca,'YDir','normal','XLimMode','manual','YLimMode','manual',...
1582 'ClimMode','manual','YColor',[1 1 1],'XColor',[1 1 1])
1583
1584 xlabel('Y')
1585 ylabel('Z')
1586 title('Sagittal','Color',[1 1 1])
1587
1588
1589 set(handles.sagittal_image,'ButtonDownFcn','vb_mri_point_select([],[],''sagittal_image'');');
1590
1591 GUIheight = GUIheight - 0.04;
1592
1593 if AVWVIEW.xdim > 1,
1594 slider_step(1) = 1/(AVWVIEW.xdim);
1595 slider_step(2) = 1/(AVWVIEW.xdim);
1596 handles.sagittal_slider = uicontrol('Parent',GUI,'Style','slider',...
1597 'Units','Normalized', Font, ...
1598 'Position',[.55 GUIheight .10 .03], 'HorizontalAlignment', 'center',...
1599 'BusyAction','cancel',...
1600 'Interruptible', 'off', ...
1601 'TooltipString','Sagittal slice navigation',...
1602 'Min',1,'Max',AVWVIEW.xdim,'SliderStep',slider_step,'Value',AVWVIEW.slices.sag,...
1603 'Callback','vb_mri_point_select([],[],''sagittal_slider'');');
1604 end
1605 handles.sagittal_sliderN = uicontrol('Parent',GUI,'Style','text',...
1606 'Units','Normalized', Font, ...
1607 'Position',[.65 GUIheight .03 .03], 'HorizontalAlignment', 'center',...
1608 'BackgroundColor',[0 0 0],'ForegroundColor',[1 1 1],...
1609 'BusyAction','queue',...
1610 'TooltipString','Sagittal slice number',...
1611 'String',num2str(AVWVIEW.slices.sag),'Value',AVWVIEW.slices.sag);
1612 handles.sagittal_sliderT = uicontrol('Parent',GUI,'Style','text',...
1613 'Units','Normalized', Font, ...
1614 'Position',[.70 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1615 'BackgroundColor',[0 0 0],'ForegroundColor',[1 1 1],...
1616 'BusyAction','queue',...
1617 'TooltipString','Sagittal slice navigation',...
1618 'String','Sagittal');
1619
1620 handles.sagittal_xlim = get(handles.sagittal_axes,'Xlim');
1621 handles.sagittal_ylim = get(handles.sagittal_axes,'Ylim');
1622 handles.sagittal_xline = line('Xdata',[AVWVIEW.slices.cor AVWVIEW.slices.cor],...
1623 'Ydata',handles.sagittal_ylim, ...
1624 'ButtonDownFcn', 'vb_mri_point_select([],[],''sagittal_image'');');
1625 handles.sagittal_yline = line('Ydata',[AVWVIEW.slices.axi AVWVIEW.slices.axi], ...
1626 'Xdata',handles.sagittal_xlim, ...
1627 'ButtonDownFcn', 'vb_mri_point_select([],[],''sagittal_image'');');
1628 set(handles.sagittal_xline,'Color','b','EraseMode','xor','Tag','XLINE', 'Visible', 'off');
1629 set(handles.sagittal_yline,'Color','b','EraseMode','xor','Tag','YLINE', 'Visible', 'off');
1630
1631 end
1632
1633
1634
1635
1636
1637
1638
1639 menu=uicontextmenu;
1640
1641
1642 roi = uimenu(menu,'Label','ROI');
1643 uimenu(roi,'Label','ROI (9x9x9 block)','Callback','vb_mri_point_select([],[],''roi_9'');');
1644 uimenu(roi,'Label','ROI (7x7x7 block)','Callback','vb_mri_point_select([],[],''roi_7'');');
1645 uimenu(roi,'Label','ROI (5x5x5 block)','Callback','vb_mri_point_select([],[],''roi_5'');');
1646 uimenu(roi,'Label','ROI (3x3x3 block)','Callback','vb_mri_point_select([],[],''roi_3'');');
1647
1648
1649 uimenu(menu,'Label','Save Image','Callback','vb_mri_point_select([],[],''save_image'');');
1650
1651
1652 uimenu(menu,'Label','Zoom Image','Callback','vb_mri_point_select([],[],''zoom'');');
1653
1654 if isfield(handles,'axial_image'),
1655 if isempty(get(handles.axial_image,'uicontextmenu')),
1656 set(handles.axial_image,'uicontextmenu',menu);
1657 end
1658 end
1659 if isfield(handles,'coronal_image'),
1660 if isempty(get(handles.coronal_image,'uicontextmenu')),
1661 set(handles.coronal_image,'uicontextmenu',menu);
1662 end
1663 end
1664 if isfield(handles,'sagittal_image'),
1665 if isempty(get(handles.sagittal_image,'uicontextmenu')),
1666 set(handles.sagittal_image,'uicontextmenu',menu);
1667 end
1668 end
1669
1670
1671
1672
1673
1674
1675 GUIheight = GUIheight - 0.04;
1676
1677 handles.flip = uicontrol('Parent',GUI,'Style','text','Units','Normalized', Font, ...
1678 'Position',[.55 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1679 'BackgroundColor', [0 0 0],...
1680 'ForegroundColor', [1 1 1],...
1681 'BusyAction','queue',...
1682 'TooltipString','Flip Left and Right (viewer only, see also avw_flip).',...
1683 'String','Flip Status');
1684
1685 handles.flipStatus = uicontrol('Parent',GUI,'Style','text','Units','Normalized', Font, ...
1686 'Position',[.65 GUIheight .15 .03], 'HorizontalAlignment', 'right',...
1687 'BackgroundColor', [0 0 0],...
1688 'ForegroundColor', [1 1 1],...
1689 'BusyAction','queue',...
1690 'TooltipString','Flipped Status',...
1691 'String','L>>R (neurological)');
1692
1693
1694
1695
1696
1697
1698
1699 GUIheight = GUIheight - 0.04;
1700
1701 handles.Timval = uicontrol('Parent',GUI,'Style','text','Units','Normalized', Font, ...
1702 'Position',[.55 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1703 'BackgroundColor', [0 0 0],...
1704 'ForegroundColor', [1 1 1],...
1705 'BusyAction','queue',...
1706 'String','Image Intensity');
1707 handles.imval = uicontrol('Parent',GUI,'Style','text','Units','Normalized', Font, ...
1708 'Position',[.65 GUIheight .15 .03], 'HorizontalAlignment', 'right',...
1709 'BackgroundColor', [0 0 0],...
1710 'ForegroundColor', [1 1 1],...
1711 'BusyAction','queue',...
1712 'String','x','Value',0);
1713
1714
1715
1716 GUIheight = GUIheight - 0.04;
1717
1718 LABEL_WIDTH = 0.1;
1719 LABEL_HEIGHT = 0.03;
1720 LABEL_LEFT = 0.55;
1721 handles.Timpos = uicontrol('Parent',GUI,'Style','text','Units','Normalized', Font, ...
1722 'Position',[LABEL_LEFT, GUIheight, LABEL_WIDTH, LABEL_HEIGHT], 'HorizontalAlignment', 'left',...
1723 'BackgroundColor', [0 0 0],...
1724 'ForegroundColor', [1 1 1],...
1725 'BusyAction','queue',...
1726 'String','Image Position');
1727
1728 POS_WIDTH = 0.15;
1729 POS_HEIGHT = 0.03;
1730 POS_LEFT = LABEL_LEFT + LABEL_WIDTH;
1731 handles.impos = uicontrol('Parent',GUI,'Style','text','Units','Normalized', Font, ...
1732 'Position',[POS_LEFT, GUIheight, POS_WIDTH, POS_HEIGHT],...
1733 'HorizontalAlignment', 'right',...
1734 'BackgroundColor', [0 0 0],...
1735 'ForegroundColor', [1 1 1],...
1736 'BusyAction','queue',...
1737 'String','xyz','Value',[0 0 0]);
1738
1739
1740
1741
1742
1743
1744 GUIheight = GUIheight - 0.04;
1745 LABEL_WIDTH = 0.1;
1746 LABEL_HEIGHT = 0.03;
1747 handles.Tpoint = uicontrol('Parent',GUI,'Style','text','Units','Normalized', Font, ...
1748 'Position',[.55 GUIheight LABEL_WIDTH LABEL_HEIGHT], 'HorizontalAlignment', 'left',...
1749 'BackgroundColor', [0 0 0],...
1750 'ForegroundColor', [1 1 1],...
1751 'BusyAction','queue',...
1752 'String','Save Points');
1753
1754 LISTBOX_WIDTH = 0.22;
1755 LISTBOX_HEIGHT = 0.15;
1756 LISTBOX_LEFT = 0.55 + LABEL_WIDTH;
1757
1758 Font2 = Font;
1759 Font2.FontName = 'FixedWidth';
1760 handles.save_point_listbox = uicontrol('Parent',GUI,'Style','listbox','Units','Normalized', Font2, ...
1761 'Position',[LISTBOX_LEFT, GUIheight-LISTBOX_HEIGHT+LABEL_HEIGHT, LISTBOX_WIDTH, LISTBOX_HEIGHT],...
1762 'HorizontalAlignment', 'right',...
1763 'BackgroundColor', [0 0 0],...
1764 'ForegroundColor', [1 1 1],...
1765 'BusyAction','queue',...
1766 'String','', ...
1767 'Callback','');
1768
1769 POS_ADD_WIDTH = 0.08;
1770 POS_ADD_HEIGHT = 0.03;
1771 POS_ADD_LEFT = POS_LEFT + POS_WIDTH + 0.08;
1772 handles.impos_add = uicontrol('Parent',GUI,'Style','push','Units','Normalized', Font, ...
1773 'Position',[POS_ADD_LEFT, GUIheight, POS_ADD_WIDTH, POS_ADD_HEIGHT],...
1774 'HorizontalAlignment', 'center',...
1775 'BackgroundColor', [.3 .3 .3],...
1776 'ForegroundColor', [0 0 0],...
1777 'BusyAction','queue',...
1778 'String','get point',...
1779 'Callback','vb_mri_point_select([],[],''add_point'');');
1780
1781 REMOVE_PUSH_WIDTH = 0.08;
1782 REMOVE_PUSH_HEIGHT = 0.03;
1783 REMOVE_PUSH_LEFT = LISTBOX_LEFT + LISTBOX_WIDTH + 0.01;
1784 handles.Tpoint_remove = uicontrol('Parent',GUI,'Style','push','Units','Normalized', Font, ...
1785 'Position',[REMOVE_PUSH_LEFT, GUIheight - (REMOVE_PUSH_HEIGHT + 0.01), ...
1786 REMOVE_PUSH_WIDTH, REMOVE_PUSH_HEIGHT],...
1787 'HorizontalAlignment', 'center',...
1788 'BackgroundColor', [.3 .3 .3],...
1789 'ForegroundColor', [0 0 0],...
1790 'BusyAction','queue',...
1791 'String','remove point',...
1792 'Callback','vb_mri_point_select([],[],''remove_point'');');
1793
1794 POINT_SHOW_PUSH_WIDTH = 0.08;
1795 POINT_SHOW_PUSH_HEIGHT = 0.03;
1796 POINT_SHOW_PUSH_LEFT = LISTBOX_LEFT + LISTBOX_WIDTH + 0.01;
1797 handles.Tpoint_remove = uicontrol('Parent',GUI,'Style','push','Units','Normalized', Font, ...
1798 'Position',[POINT_SHOW_PUSH_LEFT, ...
1799 GUIheight - (REMOVE_PUSH_HEIGHT + POINT_SHOW_PUSH_HEIGHT + 0.02), ...
1800 POINT_SHOW_PUSH_WIDTH, POINT_SHOW_PUSH_HEIGHT],...
1801 'HorizontalAlignment', 'center',...
1802 'BackgroundColor', [.3 .3 .3],...
1803 'ForegroundColor', [0 0 0],...
1804 'BusyAction','queue',...
1805 'String','check point',...
1806 'Callback','vb_mri_point_select([],[],''listbox_clicked'');');
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823 GUIheight = GUIheight - LISTBOX_HEIGHT - 0.01;
1824
1825 handles.dimmer = uicontrol('Parent',GUI,'Style','pushbutton','Units','Normalized', Font, ...
1826 'Position',[.55 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1827 'BackgroundColor', [.3 .3 .3],'ForegroundColor', [0 0 0],...
1828 'BusyAction','queue',...
1829 'TooltipString','Dim by 1%',...
1830 'String','Dimmer',...
1831 'Callback','vb_mri_point_select([],[],''dimmer'');');
1832
1833 handles.brighter = uicontrol('Parent',GUI,'Style','pushbutton','Units','Normalized', Font, ...
1834 'Position',[.65 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1835 'BackgroundColor', [.3 .3 .3],'ForegroundColor', [0 0 0],...
1836 'BusyAction','queue',...
1837 'TooltipString','Brighten by 1%',...
1838 'String','Brighter',...
1839 'Callback','vb_mri_point_select([],[],''brighter'');');
1840
1841 handles.clim = uicontrol('Parent',GUI,'Style','edit','Units','Normalized', Font, ...
1842 'Position',[.75 GUIheight .06 .03], 'HorizontalAlignment', 'right',...
1843 'BackgroundColor', [0 0 0],...
1844 'ForegroundColor', [1 1 1],...
1845 'BusyAction','queue',...
1846 'TooltipString','Image intensity Climit (inverse brightness)',...
1847 'String',num2str(AVWVIEW.clim(2)),...
1848 'Callback','vb_mri_point_select([],[],''setClimit'');');
1849
1850 handles.cmap = uicontrol('Parent',GUI,'Style','popup','Units','Normalized', Font, ...
1851 'Position',[.82 GUIheight .06 .03], 'HorizontalAlignment', 'left',...
1852 'BackgroundColor', [0 0 0],...
1853 'ForegroundColor', [1 1 1],...
1854 'BusyAction','queue',...
1855 'TooltipString','Color Map',...
1856 'String',{'gray','bone','copper','hot','cool','spring','summer','autumn','winter','hsv','jet'},...
1857 'Callback','vb_mri_point_select([],[],''setCmap'');');
1858
1859
1860
1861
1862 GUIheight = 0.46;
1863
1864 handles.crosshairs = uicontrol('Parent',GUI,'Style','checkbox','Units','Normalized', Font, ...
1865 'Position',[.85 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1866 'BackgroundColor', [.3 .3 .3],'ForegroundColor', [0 0 0],...
1867 'BusyAction','queue',...
1868 'TooltipString','Toggle Crosshairs on/off',...
1869 'String','Crosshairs','Value',1,...
1870 'Callback','vb_mri_point_select([],[],''crosshairs'');');
1871
1872
1873
1874
1875 GUIheight = GUIheight - 0.04;
1876
1877 handles.histogram = uicontrol('Parent',GUI,'Style','pushbutton','Units','Normalized', Font, ...
1878 'Position',[.85 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1879 'BackgroundColor', [.3 .3 .3],'ForegroundColor', [0 0 0],...
1880 'BusyAction','queue',...
1881 'TooltipString','Histogram of Volume Intensity',...
1882 'String','Histogram',...
1883 'Callback','vb_mri_point_select([],[],''histogram'');');
1884
1885
1886
1887
1888
1889 GUIheight = GUIheight - 0.04;
1890
1891 handles.coord = uicontrol('Parent',GUI,'Style','popupmenu','Units','Normalized', Font, ...
1892 'Position',[.85 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1893 'BackgroundColor', [.3 .3 .3],'ForegroundColor', [0 0 0],...
1894 'BusyAction','queue',...
1895 'TooltipString','Voxel or Mensurated Axis Coordinates',...
1896 'String',{'Voxels','mm','meters'},...
1897 'Callback','vb_mri_point_select([],[],''coordinates'');');
1898
1899
1900
1901
1902 Font.FontWeight = 'bold';
1903
1904
1905 handles.Bquit = uicontrol('Parent',GUI,'Style','pushbutton','Units','Normalized', Font, ...
1906 'Position',[.65 .01 .10 .05],...
1907 'String','Load ',...
1908 'BusyAction','queue',...
1909 'BackgroundColor',[0.0 0.5 0.0],...
1910 'ForegroundColor', [0 0 0], 'HorizontalAlignment', 'center',...
1911 'Callback','vb_mri_point_select([],[],''load'');');
1912
1913
1914 handles.Bquit = uicontrol('Parent',GUI,'Style','pushbutton','Units','Normalized', Font, ...
1915 'Position',[.76 .01 .10 .05],...
1916 'String','Save ',...
1917 'BusyAction','queue',...
1918 'BackgroundColor',[0.0 0.5 0.0],...
1919 'ForegroundColor', [0 0 0], 'HorizontalAlignment', 'center',...
1920 'Callback','vb_mri_point_select([],[],''save'');');
1921
1922
1923 handles.Bclose = uicontrol('Parent',GUI,'Style','pushbutton','Units','Normalized', Font, ...
1924 'Position',[.87 .01 .10 .05],...
1925 'String','OK','BusyAction','queue',...
1926 'BackgroundColor',[0.0 0.5 0.0],...
1927 'ForegroundColor', [0 0 0], 'HorizontalAlignment', 'center',...
1928 'Callback','vb_mri_point_select([],[],''close'');');
1929
1930
1931
1932 if exist('parent','var'), AVWVIEW.parent.gui = parent; end
1933 AVWVIEW.avw = avw;
1934 AVWVIEW.handles = handles;
1935 set(AVWVIEW.gui,'Userdata',AVWVIEW);
1936 set(AVWVIEW.gui,'HandleVisibility','on');
1937
1938
1939 AVWVIEW = axial_update(AVWVIEW);
1940 AVWVIEW = coronal_update(AVWVIEW);
1941 AVWVIEW = sagittal_update(AVWVIEW);
1942
1943
1944 update_point_list(AVWVIEW);
1945
1946 return
1947
1948
1949
1950 function slice_img(avw)
1951
1952 figure
1953 xslice = 128;
1954 slice = squeeze( avw.img(xslice,:,:) );
1955 imagesc(slice); axis image; colormap('gray')
1956 figure
1957 yslice = 128;
1958 slice = squeeze( avw.img(:,yslice,:) );
1959 imagesc(slice); axis image; colormap('gray')
1960 figure
1961 zslice = 128;
1962 slice = squeeze( avw.img(:,:,zslice) );
1963 imagesc(slice); axis image; colormap('gray')
1964
1965 return
1966
1967
1968
1969 function update_point_list(AVWVIEW)
1970
1971
1972 NPoints = vb_mps_pointlist_get_pointnum(AVWVIEW.point_list);
1973
1974 ListBoxStr = cell(NPoints);
1975 point_str = cell(NPoints);
1976 name_list = cell(NPoints);
1977 Nlen_max = 0;
1978
1979 for k=1:NPoints
1980 [name, point] = vb_mps_pointlist_get_point(AVWVIEW.point_list, k);
1981 [string] = get_display_unit_string(AVWVIEW, point);
1982 name_list{k} = name;
1983 point_str{k} = string;
1984 name_len = length(name);
1985
1986 if name_len > Nlen_max
1987 Nlen_max = name_len;
1988 end
1989 end
1990 Nlen_max_str = num2str(Nlen_max);
1991 for k=1:NPoints
1992 ListBoxStr{k} = sprintf(['%-' Nlen_max_str 's : %s'], name_list{k}, point_str{k});
1993 end
1994
1995 set(AVWVIEW.handles.save_point_listbox, 'String', ListBoxStr);
1996 cur_focus = get(AVWVIEW.handles.save_point_listbox, 'Value');
1997 focus = NPoints;
1998
1999 if NPoints == 0
2000 focus = 1;
2001 set(AVWVIEW.handles.save_point_listbox, 'Value', focus);
2002 elseif cur_focus > NPoints
2003 focus = NPoints;
2004 set(AVWVIEW.handles.save_point_listbox, 'Value', focus);
2005 end
2006
2007
2008
2009 function [string] = get_display_unit_string(AVWVIEW, imgXYZ)
2010
2011
2012
2013 switch(get_coordinate_space(AVWVIEW))
2014 case COORDINATE_MM
2015 format = '%7.3f %7.3f %7.3f';
2016 coord = imgXYZ.mm;
2017 string = sprintf('%7.3f %7.3f %7.3f', coord);
2018 case COORDINATE_M
2019 format = '%7.3f %7.3f %7.3f';
2020 coord = imgXYZ.meters;
2021 string = sprintf('%7.3f %7.3f %7.3f', coord);
2022 case COORDINATE_VOXEL
2023 coord = imgXYZ.voxels;
2024 string = sprintf('%7.0f %7.0f %7.0f', coord);
2025 end
2026
2027
2028 function [metric] = get_metric(AVWVIEW, imgXYZ)
2029 switch(get_coordinate_space(AVWVIEW))
2030 case COORDINATE_MM
2031 coord = imgXYZ.mm;
2032 case COORDINATE_M
2033 coord = imgXYZ.meters;
2034 case COORDINATE_VOXEL
2035 coord = imgXYZ.voxels;
2036 end
2037
2038 metric.sag = coord(1);
2039 metric.cor = coord(2);
2040 metric.axi = coord(3);
2041
2042
2043 function [AVWVIEW] = change_listbox_line(AVWVIEW, lineNo)
2044
2045
2046 [name, point] = vb_mps_pointlist_get_point(AVWVIEW.point_list, lineNo);
2047 [metric] = get_metric(AVWVIEW, point);
2048 AVWVIEW = metric2slices(AVWVIEW, metric);
2049 AVWVIEW = axial_update(AVWVIEW);
2050 AVWVIEW = coronal_update(AVWVIEW);
2051 AVWVIEW = sagittal_update(AVWVIEW);
2052 set_display_values(AVWVIEW);
2053 AVWVIEW = set_crosshairs(AVWVIEW);
2054
2055
2056 function [space, string] = get_coordinate_space(AVWVIEW)
2057 coordinate_space_setting = get(AVWVIEW.handles.coord,'value');
2058
2059 switch(coordinate_space_setting)
2060 case 1
2061 space = COORDINATE_VOXEL;
2062 string = 'VOXEL';
2063 case 2
2064 space = COORDINATE_MM;
2065 string = 'MM';
2066 case 3
2067 space = COORDINATE_M;
2068 string = 'M';
2069 end
2070
2071
2072
2073
2074
2075 function [value] = COORDINATE_VOXEL
2076 value = 1;
2077 function [value] = COORDINATE_MM
2078 value = 2;
2079 function [value] = COORDINATE_M
2080 value = 3;
2081