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 ~isempty(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','y','Tag','XLINE');
0920 set(AVWVIEW.handles.axial_yline,'Color','y','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','y','Tag','XLINE');
0943 set(AVWVIEW.handles.coronal_yline,'Color','y','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','y','Tag','XLINE');
0967 set(AVWVIEW.handles.sagittal_yline,'Color','y','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: 2024 $]';
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 ext = '.hdr';
1396 if avw.filetype == 2
1397 ext = '.nii';
1398 end
1399 AVWVIEW.mps_fileio = vb_mps_fileio_new([avw.fileprefix, ext]);
1400 AVWVIEW.point_list = vb_mps_pointlist_new;
1401
1402
1403 if isfield(avw, 'point_spm_right_m') && ~isempty(avw.point_spm_right_m)
1404 Vdim = [AVWVIEW.xdim, AVWVIEW.ydim, AVWVIEW.zdim];
1405 Vsize = AVWVIEW.pixdim;
1406
1407 for k=1:length(avw.point_spm_right_m.name)
1408 name = avw.point_spm_right_m.name{k};
1409 point.voxels = ...
1410 vb_spm_right_to_analyze_right(avw.point_spm_right_m.pos(k, :),...
1411 Vdim, Vsize);
1412 point.mm = ...
1413 vb_spm_right_to_analyze_right_mm(avw.point_spm_right_m.pos(k, :),...
1414 Vdim, Vsize);
1415 point.meters = point.mm .* 0.001;
1416
1417 [AVWVIEW.point_list, result] =...
1418 vb_mps_pointlist_add_point(AVWVIEW.point_list, ...
1419 name, ...
1420 point);
1421 end
1422 end
1423
1424
1425
1426
1427 if isfield(avw, 'display_factor')
1428 AVWVIEW.display_factor = avw.display_factor;
1429 end
1430
1431
1432
1433 if AVWVIEW.xdim > 1 & AVWVIEW.ydim > 1,
1434
1435 handles.axial_subplot = subplot('position',[0.075 0.075 xPlotSize yPlotSize]);
1436
1437
1438
1439
1440 Saxial = squeeze(avw.img(:,:,AVWVIEW.slices.axi));
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453 handles.axial_image = imagesc([0,AVWVIEW.xdim],[0,AVWVIEW.ydim],Saxial',AVWVIEW.clim);
1454
1455 handles.axial_axes = gca;
1456 set(gca,'YDir','normal','XLimMode','manual','YLimMode','manual',...
1457 'ClimMode','manual','YColor',[1 1 1],'XColor',[1 1 1])
1458
1459 title('Axial','Color',[1 1 1])
1460 ylabel('Y')
1461 xlabel('Left ----- X ----- Right')
1462
1463
1464
1465
1466 set(handles.axial_image,'ButtonDownFcn','vb_mri_point_select([],[],''axial_image'');');
1467
1468 GUIheight = 0.48;
1469
1470 if AVWVIEW.zdim > 1,
1471 slider_step(1) = 1/(AVWVIEW.zdim);
1472 slider_step(2) = 1/(AVWVIEW.zdim);
1473 handles.axial_slider = uicontrol('Parent',GUI,'Style','slider',...
1474 'Units','Normalized', Font, ...
1475 'Position',[.55 GUIheight .10 .03], 'HorizontalAlignment', 'center',...
1476 'BusyAction','cancel',...
1477 'Interruptible', 'off', ...
1478 'TooltipString','Axial slice navigation',...
1479 'Min',1,'Max',AVWVIEW.zdim,'SliderStep',slider_step,'Value',AVWVIEW.slices.axi,...
1480 'Callback','vb_mri_point_select([],[],''axial_slider'');');
1481 end
1482 handles.axial_sliderN = uicontrol('Parent',GUI,'Style','text',...
1483 'Units','Normalized', Font, ...
1484 'Position',[.65 GUIheight .03 .03], 'HorizontalAlignment', 'center',...
1485 'BackgroundColor',[0 0 0],'ForegroundColor',[1 1 1],...
1486 'BusyAction','queue',...
1487 'TooltipString','Axial slice number',...
1488 'String',num2str(AVWVIEW.slices.axi),'Value',AVWVIEW.slices.axi);
1489 handles.axial_sliderT = uicontrol('Parent',GUI,'Style','text',...
1490 'Units','Normalized', Font, ...
1491 'Position',[.70 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1492 'BackgroundColor',[0 0 0],'ForegroundColor',[1 1 1],...
1493 'BusyAction','queue',...
1494 'TooltipString','Axial slice navigation',...
1495 'String','Axial');
1496
1497 handles.axial_xlim = get(handles.axial_axes,'Xlim');
1498 handles.axial_ylim = get(handles.axial_axes,'Ylim');
1499 handles.axial_xline = line('Xdata',[AVWVIEW.slices.sag AVWVIEW.slices.sag], ...
1500 'Ydata',handles.axial_ylim, ...
1501 'ButtonDownFcn', 'vb_mri_point_select([],[],''axial_image'');');
1502 handles.axial_yline = line('Ydata',[AVWVIEW.slices.cor AVWVIEW.slices.cor],...
1503 'Xdata',handles.axial_xlim, ...
1504 'ButtonDownFcn', 'vb_mri_point_select([],[],''axial_image'');');
1505 set(handles.axial_xline,'Color','y','Tag','XLINE', 'Visible', 'off');
1506 set(handles.axial_yline,'Color','y','Tag','YLINE', 'Visible', 'off');
1507
1508 end
1509
1510
1511
1512
1513 if AVWVIEW.xdim > 1 & AVWVIEW.zdim > 1,
1514
1515 handles.coronal_subplot = subplot('position',[0.075 0.575 xPlotSize yPlotSize]);
1516
1517 Scor = squeeze(avw.img(:,AVWVIEW.slices.cor,:));
1518 handles.coronal_image = imagesc([0,AVWVIEW.xdim],[0,AVWVIEW.zdim],Scor',AVWVIEW.clim);
1519 handles.coronal_axes = gca;
1520 set(gca,'YDir','normal','XLimMode','manual','YLimMode','manual',...
1521 'ClimMode','manual','YColor',[1 1 1],'XColor',[1 1 1])
1522
1523
1524
1525 xlabel('Left ----- X ----- Right')
1526 ylabel('Z')
1527 title('Coronal','Color',[1 1 1])
1528
1529
1530 set(handles.coronal_image,'ButtonDownFcn','vb_mri_point_select([],[],''coronal_image'');');
1531
1532 GUIheight = GUIheight - 0.04;
1533
1534 if AVWVIEW.ydim > 1,
1535 slider_step(1) = 1/(AVWVIEW.ydim);
1536 slider_step(2) = 1/(AVWVIEW.ydim);
1537 handles.coronal_slider = uicontrol('Parent',GUI,'Style','slider',...
1538 'Units','Normalized', Font, ...
1539 'Position',[.55 GUIheight .10 .03], 'HorizontalAlignment', 'center',...
1540 'BusyAction','cancel',...
1541 'Interruptible', 'off', ...
1542 'TooltipString','Coronal slice navigation',...
1543 'Min',1,'Max',AVWVIEW.ydim,'SliderStep',slider_step,'Value',AVWVIEW.slices.cor,...
1544 'Callback','vb_mri_point_select([],[],''coronal_slider'');');
1545 end
1546 handles.coronal_sliderN = uicontrol('Parent',GUI,'Style','text',...
1547 'Units','Normalized', Font, ...
1548 'Position',[.65 GUIheight .03 .03], 'HorizontalAlignment', 'center',...
1549 'BackgroundColor',[0 0 0],'ForegroundColor',[1 1 1],...
1550 'BusyAction','queue',...
1551 'TooltipString','Coronal slice number',...
1552 'String',num2str(AVWVIEW.slices.cor),'Value',AVWVIEW.slices.cor);
1553 handles.coronal_sliderT = uicontrol('Parent',GUI,'Style','text',...
1554 'Units','Normalized', Font, ...
1555 'Position',[.70 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1556 'BackgroundColor',[0 0 0],'ForegroundColor',[1 1 1],...
1557 'BusyAction','queue',...
1558 'TooltipString','Coronal slice navigation',...
1559 'String','Coronal');
1560
1561 handles.coronal_xlim = get(handles.coronal_axes,'Xlim');
1562 handles.coronal_ylim = get(handles.coronal_axes,'Ylim');
1563 handles.coronal_xline = line('Xdata',[AVWVIEW.slices.sag AVWVIEW.slices.sag], ...
1564 'Ydata',handles.coronal_ylim, ...
1565 'ButtonDownFcn', 'vb_mri_point_select([],[],''coronal_image'');');
1566 handles.coronal_yline = line('Ydata',[AVWVIEW.slices.axi AVWVIEW.slices.axi], ...
1567 'Xdata',handles.coronal_xlim, ...
1568 'ButtonDownFcn', 'vb_mri_point_select([],[],''coronal_image'');');
1569 set(handles.coronal_xline,'Color','y','Tag','XLINE', 'Visible', 'off');
1570 set(handles.coronal_yline,'Color','y','Tag','YLINE', 'Visible', 'off');
1571
1572 end
1573
1574
1575
1576
1577 if AVWVIEW.ydim > 1 & AVWVIEW.zdim > 1,
1578
1579 handles.sagittal_subplot = subplot('position',[0.575 0.575 xPlotSize yPlotSize]);
1580
1581 Ssag = squeeze(avw.img(AVWVIEW.slices.sag,:,:));
1582 handles.sagittal_image = imagesc([0,AVWVIEW.ydim],[0,AVWVIEW.zdim],Ssag',AVWVIEW.clim);
1583
1584 handles.sagittal_axes = gca;
1585 set(gca,'YDir','normal','XLimMode','manual','YLimMode','manual',...
1586 'ClimMode','manual','YColor',[1 1 1],'XColor',[1 1 1])
1587
1588 xlabel('Y')
1589 ylabel('Z')
1590 title('Sagittal','Color',[1 1 1])
1591
1592
1593 set(handles.sagittal_image,'ButtonDownFcn','vb_mri_point_select([],[],''sagittal_image'');');
1594
1595 GUIheight = GUIheight - 0.04;
1596
1597 if AVWVIEW.xdim > 1,
1598 slider_step(1) = 1/(AVWVIEW.xdim);
1599 slider_step(2) = 1/(AVWVIEW.xdim);
1600 handles.sagittal_slider = uicontrol('Parent',GUI,'Style','slider',...
1601 'Units','Normalized', Font, ...
1602 'Position',[.55 GUIheight .10 .03], 'HorizontalAlignment', 'center',...
1603 'BusyAction','cancel',...
1604 'Interruptible', 'off', ...
1605 'TooltipString','Sagittal slice navigation',...
1606 'Min',1,'Max',AVWVIEW.xdim,'SliderStep',slider_step,'Value',AVWVIEW.slices.sag,...
1607 'Callback','vb_mri_point_select([],[],''sagittal_slider'');');
1608 end
1609 handles.sagittal_sliderN = uicontrol('Parent',GUI,'Style','text',...
1610 'Units','Normalized', Font, ...
1611 'Position',[.65 GUIheight .03 .03], 'HorizontalAlignment', 'center',...
1612 'BackgroundColor',[0 0 0],'ForegroundColor',[1 1 1],...
1613 'BusyAction','queue',...
1614 'TooltipString','Sagittal slice number',...
1615 'String',num2str(AVWVIEW.slices.sag),'Value',AVWVIEW.slices.sag);
1616 handles.sagittal_sliderT = uicontrol('Parent',GUI,'Style','text',...
1617 'Units','Normalized', Font, ...
1618 'Position',[.70 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1619 'BackgroundColor',[0 0 0],'ForegroundColor',[1 1 1],...
1620 'BusyAction','queue',...
1621 'TooltipString','Sagittal slice navigation',...
1622 'String','Sagittal');
1623
1624 handles.sagittal_xlim = get(handles.sagittal_axes,'Xlim');
1625 handles.sagittal_ylim = get(handles.sagittal_axes,'Ylim');
1626 handles.sagittal_xline = line('Xdata',[AVWVIEW.slices.cor AVWVIEW.slices.cor],...
1627 'Ydata',handles.sagittal_ylim, ...
1628 'ButtonDownFcn', 'vb_mri_point_select([],[],''sagittal_image'');');
1629 handles.sagittal_yline = line('Ydata',[AVWVIEW.slices.axi AVWVIEW.slices.axi], ...
1630 'Xdata',handles.sagittal_xlim, ...
1631 'ButtonDownFcn', 'vb_mri_point_select([],[],''sagittal_image'');');
1632 set(handles.sagittal_xline,'Color','y','Tag','XLINE', 'Visible', 'off');
1633 set(handles.sagittal_yline,'Color','y','Tag','YLINE', 'Visible', 'off');
1634
1635 end
1636
1637
1638
1639
1640
1641
1642
1643 menu=uicontextmenu;
1644
1645
1646 roi = uimenu(menu,'Label','ROI');
1647 uimenu(roi,'Label','ROI (9x9x9 block)','Callback','vb_mri_point_select([],[],''roi_9'');');
1648 uimenu(roi,'Label','ROI (7x7x7 block)','Callback','vb_mri_point_select([],[],''roi_7'');');
1649 uimenu(roi,'Label','ROI (5x5x5 block)','Callback','vb_mri_point_select([],[],''roi_5'');');
1650 uimenu(roi,'Label','ROI (3x3x3 block)','Callback','vb_mri_point_select([],[],''roi_3'');');
1651
1652
1653 uimenu(menu,'Label','Save Image','Callback','vb_mri_point_select([],[],''save_image'');');
1654
1655
1656 uimenu(menu,'Label','Zoom Image','Callback','vb_mri_point_select([],[],''zoom'');');
1657
1658 if isfield(handles,'axial_image'),
1659 if isempty(get(handles.axial_image,'uicontextmenu')),
1660 set(handles.axial_image,'uicontextmenu',menu);
1661 end
1662 end
1663 if isfield(handles,'coronal_image'),
1664 if isempty(get(handles.coronal_image,'uicontextmenu')),
1665 set(handles.coronal_image,'uicontextmenu',menu);
1666 end
1667 end
1668 if isfield(handles,'sagittal_image'),
1669 if isempty(get(handles.sagittal_image,'uicontextmenu')),
1670 set(handles.sagittal_image,'uicontextmenu',menu);
1671 end
1672 end
1673
1674
1675
1676
1677
1678
1679 GUIheight = GUIheight - 0.04;
1680
1681 handles.flip = uicontrol('Parent',GUI,'Style','text','Units','Normalized', Font, ...
1682 'Position',[.55 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1683 'BackgroundColor', [0 0 0],...
1684 'ForegroundColor', [1 1 1],...
1685 'BusyAction','queue',...
1686 'TooltipString','Flip Left and Right (viewer only, see also avw_flip).',...
1687 'String','Flip Status');
1688
1689 handles.flipStatus = uicontrol('Parent',GUI,'Style','text','Units','Normalized', Font, ...
1690 'Position',[.65 GUIheight .15 .03], 'HorizontalAlignment', 'right',...
1691 'BackgroundColor', [0 0 0],...
1692 'ForegroundColor', [1 1 1],...
1693 'BusyAction','queue',...
1694 'TooltipString','Flipped Status',...
1695 'String','L>>R (neurological)');
1696
1697
1698
1699
1700
1701
1702
1703 GUIheight = GUIheight - 0.04;
1704
1705 handles.Timval = uicontrol('Parent',GUI,'Style','text','Units','Normalized', Font, ...
1706 'Position',[.55 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1707 'BackgroundColor', [0 0 0],...
1708 'ForegroundColor', [1 1 1],...
1709 'BusyAction','queue',...
1710 'String','Image Intensity');
1711 handles.imval = uicontrol('Parent',GUI,'Style','text','Units','Normalized', Font, ...
1712 'Position',[.65 GUIheight .15 .03], 'HorizontalAlignment', 'right',...
1713 'BackgroundColor', [0 0 0],...
1714 'ForegroundColor', [1 1 1],...
1715 'BusyAction','queue',...
1716 'String','x','Value',0);
1717
1718
1719
1720 GUIheight = GUIheight - 0.04;
1721
1722 LABEL_WIDTH = 0.1;
1723 LABEL_HEIGHT = 0.03;
1724 LABEL_LEFT = 0.55;
1725 handles.Timpos = uicontrol('Parent',GUI,'Style','text','Units','Normalized', Font, ...
1726 'Position',[LABEL_LEFT, GUIheight, LABEL_WIDTH, LABEL_HEIGHT], 'HorizontalAlignment', 'left',...
1727 'BackgroundColor', [0 0 0],...
1728 'ForegroundColor', [1 1 1],...
1729 'BusyAction','queue',...
1730 'String','Image Position');
1731
1732 POS_WIDTH = 0.15;
1733 POS_HEIGHT = 0.03;
1734 POS_LEFT = LABEL_LEFT + LABEL_WIDTH;
1735 handles.impos = uicontrol('Parent',GUI,'Style','text','Units','Normalized', Font, ...
1736 'Position',[POS_LEFT, GUIheight, POS_WIDTH, POS_HEIGHT],...
1737 'HorizontalAlignment', 'right',...
1738 'BackgroundColor', [0 0 0],...
1739 'ForegroundColor', [1 1 1],...
1740 'BusyAction','queue',...
1741 'String','xyz','Value',[0 0 0]);
1742
1743
1744
1745
1746
1747
1748 GUIheight = GUIheight - 0.04;
1749 LABEL_WIDTH = 0.1;
1750 LABEL_HEIGHT = 0.03;
1751 handles.Tpoint = uicontrol('Parent',GUI,'Style','text','Units','Normalized', Font, ...
1752 'Position',[.55 GUIheight LABEL_WIDTH LABEL_HEIGHT], 'HorizontalAlignment', 'left',...
1753 'BackgroundColor', [0 0 0],...
1754 'ForegroundColor', [1 1 1],...
1755 'BusyAction','queue',...
1756 'String','Save Points');
1757
1758 LISTBOX_WIDTH = 0.22;
1759 LISTBOX_HEIGHT = 0.15;
1760 LISTBOX_LEFT = 0.55 + LABEL_WIDTH;
1761
1762 Font2 = Font;
1763 Font2.FontName = 'FixedWidth';
1764 handles.save_point_listbox = uicontrol('Parent',GUI,'Style','listbox','Units','Normalized', Font2, ...
1765 'Position',[LISTBOX_LEFT, GUIheight-LISTBOX_HEIGHT+LABEL_HEIGHT, LISTBOX_WIDTH, LISTBOX_HEIGHT],...
1766 'HorizontalAlignment', 'right',...
1767 'BackgroundColor', [0 0 0],...
1768 'ForegroundColor', [1 1 1],...
1769 'BusyAction','queue',...
1770 'String','', ...
1771 'Callback','');
1772
1773 POS_ADD_WIDTH = 0.08;
1774 POS_ADD_HEIGHT = 0.03;
1775 POS_ADD_LEFT = POS_LEFT + POS_WIDTH + 0.08;
1776 handles.impos_add = uicontrol('Parent',GUI,'Style','push','Units','Normalized', Font, ...
1777 'Position',[POS_ADD_LEFT, GUIheight, POS_ADD_WIDTH, POS_ADD_HEIGHT],...
1778 'HorizontalAlignment', 'center',...
1779 'BackgroundColor', [.3 .3 .3],...
1780 'ForegroundColor', [0 0 0],...
1781 'BusyAction','queue',...
1782 'String','get point',...
1783 'Callback','vb_mri_point_select([],[],''add_point'');');
1784
1785 REMOVE_PUSH_WIDTH = 0.08;
1786 REMOVE_PUSH_HEIGHT = 0.03;
1787 REMOVE_PUSH_LEFT = LISTBOX_LEFT + LISTBOX_WIDTH + 0.01;
1788 handles.Tpoint_remove = uicontrol('Parent',GUI,'Style','push','Units','Normalized', Font, ...
1789 'Position',[REMOVE_PUSH_LEFT, GUIheight - (REMOVE_PUSH_HEIGHT + 0.01), ...
1790 REMOVE_PUSH_WIDTH, REMOVE_PUSH_HEIGHT],...
1791 'HorizontalAlignment', 'center',...
1792 'BackgroundColor', [.3 .3 .3],...
1793 'ForegroundColor', [0 0 0],...
1794 'BusyAction','queue',...
1795 'String','remove point',...
1796 'Callback','vb_mri_point_select([],[],''remove_point'');');
1797
1798 POINT_SHOW_PUSH_WIDTH = 0.08;
1799 POINT_SHOW_PUSH_HEIGHT = 0.03;
1800 POINT_SHOW_PUSH_LEFT = LISTBOX_LEFT + LISTBOX_WIDTH + 0.01;
1801 handles.Tpoint_remove = uicontrol('Parent',GUI,'Style','push','Units','Normalized', Font, ...
1802 'Position',[POINT_SHOW_PUSH_LEFT, ...
1803 GUIheight - (REMOVE_PUSH_HEIGHT + POINT_SHOW_PUSH_HEIGHT + 0.02), ...
1804 POINT_SHOW_PUSH_WIDTH, POINT_SHOW_PUSH_HEIGHT],...
1805 'HorizontalAlignment', 'center',...
1806 'BackgroundColor', [.3 .3 .3],...
1807 'ForegroundColor', [0 0 0],...
1808 'BusyAction','queue',...
1809 'String','check point',...
1810 'Callback','vb_mri_point_select([],[],''listbox_clicked'');');
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827 GUIheight = GUIheight - LISTBOX_HEIGHT - 0.01;
1828
1829 handles.dimmer = uicontrol('Parent',GUI,'Style','pushbutton','Units','Normalized', Font, ...
1830 'Position',[.55 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1831 'BackgroundColor', [.3 .3 .3],'ForegroundColor', [0 0 0],...
1832 'BusyAction','queue',...
1833 'TooltipString','Dim by 1%',...
1834 'String','Dimmer',...
1835 'Callback','vb_mri_point_select([],[],''dimmer'');');
1836
1837 handles.brighter = uicontrol('Parent',GUI,'Style','pushbutton','Units','Normalized', Font, ...
1838 'Position',[.65 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1839 'BackgroundColor', [.3 .3 .3],'ForegroundColor', [0 0 0],...
1840 'BusyAction','queue',...
1841 'TooltipString','Brighten by 1%',...
1842 'String','Brighter',...
1843 'Callback','vb_mri_point_select([],[],''brighter'');');
1844
1845 handles.clim = uicontrol('Parent',GUI,'Style','edit','Units','Normalized', Font, ...
1846 'Position',[.75 GUIheight .06 .03], 'HorizontalAlignment', 'right',...
1847 'BackgroundColor', [0 0 0],...
1848 'ForegroundColor', [1 1 1],...
1849 'BusyAction','queue',...
1850 'TooltipString','Image intensity Climit (inverse brightness)',...
1851 'String',num2str(AVWVIEW.clim(2)),...
1852 'Callback','vb_mri_point_select([],[],''setClimit'');');
1853
1854 handles.cmap = uicontrol('Parent',GUI,'Style','popup','Units','Normalized', Font, ...
1855 'Position',[.82 GUIheight .06 .03], 'HorizontalAlignment', 'left',...
1856 'BackgroundColor', [0 0 0],...
1857 'ForegroundColor', [1 1 1],...
1858 'BusyAction','queue',...
1859 'TooltipString','Color Map',...
1860 'String',{'gray','bone','copper','hot','cool','spring','summer','autumn','winter','hsv','jet'},...
1861 'Callback','vb_mri_point_select([],[],''setCmap'');');
1862
1863
1864
1865
1866 GUIheight = 0.46;
1867
1868 handles.crosshairs = uicontrol('Parent',GUI,'Style','checkbox','Units','Normalized', Font, ...
1869 'Position',[.85 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1870 'BackgroundColor', [.3 .3 .3],'ForegroundColor', [0 0 0],...
1871 'BusyAction','queue',...
1872 'TooltipString','Toggle Crosshairs on/off',...
1873 'String','Crosshairs','Value',1,...
1874 'Callback','vb_mri_point_select([],[],''crosshairs'');');
1875
1876
1877
1878
1879 GUIheight = GUIheight - 0.04;
1880
1881 handles.histogram = uicontrol('Parent',GUI,'Style','pushbutton','Units','Normalized', Font, ...
1882 'Position',[.85 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1883 'BackgroundColor', [.3 .3 .3],'ForegroundColor', [0 0 0],...
1884 'BusyAction','queue',...
1885 'TooltipString','Histogram of Volume Intensity',...
1886 'String','Histogram',...
1887 'Callback','vb_mri_point_select([],[],''histogram'');');
1888
1889
1890
1891
1892
1893 GUIheight = GUIheight - 0.04;
1894
1895 handles.coord = uicontrol('Parent',GUI,'Style','popupmenu','Units','Normalized', Font, ...
1896 'Position',[.85 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
1897 'BackgroundColor', [.3 .3 .3],'ForegroundColor', [0 0 0],...
1898 'BusyAction','queue',...
1899 'TooltipString','Voxel or Mensurated Axis Coordinates',...
1900 'String',{'Voxels','mm','meters'},...
1901 'Callback','vb_mri_point_select([],[],''coordinates'');');
1902
1903
1904
1905
1906 Font.FontWeight = 'bold';
1907
1908
1909 handles.Bquit = uicontrol('Parent',GUI,'Style','pushbutton','Units','Normalized', Font, ...
1910 'Position',[.65 .01 .10 .05],...
1911 'String','Load ',...
1912 'BusyAction','queue',...
1913 'BackgroundColor',[0.0 0.5 0.0],...
1914 'ForegroundColor', [0 0 0], 'HorizontalAlignment', 'center',...
1915 'Callback','vb_mri_point_select([],[],''load'');');
1916
1917
1918 handles.Bquit = uicontrol('Parent',GUI,'Style','pushbutton','Units','Normalized', Font, ...
1919 'Position',[.76 .01 .10 .05],...
1920 'String','Save ',...
1921 'BusyAction','queue',...
1922 'BackgroundColor',[0.0 0.5 0.0],...
1923 'ForegroundColor', [0 0 0], 'HorizontalAlignment', 'center',...
1924 'Callback','vb_mri_point_select([],[],''save'');');
1925
1926
1927 handles.Bclose = uicontrol('Parent',GUI,'Style','pushbutton','Units','Normalized', Font, ...
1928 'Position',[.87 .01 .10 .05],...
1929 'String','OK','BusyAction','queue',...
1930 'BackgroundColor',[0.0 0.5 0.0],...
1931 'ForegroundColor', [0 0 0], 'HorizontalAlignment', 'center',...
1932 'Callback','vb_mri_point_select([],[],''close'');');
1933
1934
1935
1936 if exist('parent','var'), AVWVIEW.parent.gui = parent; end
1937 AVWVIEW.avw = avw;
1938 AVWVIEW.handles = handles;
1939 set(AVWVIEW.gui,'Userdata',AVWVIEW);
1940 set(AVWVIEW.gui,'HandleVisibility','on');
1941
1942
1943 AVWVIEW = axial_update(AVWVIEW);
1944 AVWVIEW = coronal_update(AVWVIEW);
1945 AVWVIEW = sagittal_update(AVWVIEW);
1946
1947
1948 update_point_list(AVWVIEW);
1949
1950 return
1951
1952
1953
1954 function slice_img(avw)
1955
1956 figure
1957 xslice = 128;
1958 slice = squeeze( avw.img(xslice,:,:) );
1959 imagesc(slice); axis image; colormap('gray')
1960 figure
1961 yslice = 128;
1962 slice = squeeze( avw.img(:,yslice,:) );
1963 imagesc(slice); axis image; colormap('gray')
1964 figure
1965 zslice = 128;
1966 slice = squeeze( avw.img(:,:,zslice) );
1967 imagesc(slice); axis image; colormap('gray')
1968
1969 return
1970
1971
1972
1973 function update_point_list(AVWVIEW)
1974
1975
1976 NPoints = vb_mps_pointlist_get_pointnum(AVWVIEW.point_list);
1977
1978 ListBoxStr = cell(NPoints);
1979 point_str = cell(NPoints);
1980 name_list = cell(NPoints);
1981 Nlen_max = 0;
1982
1983 for k=1:NPoints
1984 [name, point] = vb_mps_pointlist_get_point(AVWVIEW.point_list, k);
1985 [string] = get_display_unit_string(AVWVIEW, point);
1986 name_list{k} = name;
1987 point_str{k} = string;
1988 name_len = length(name);
1989
1990 if name_len > Nlen_max
1991 Nlen_max = name_len;
1992 end
1993 end
1994 Nlen_max_str = num2str(Nlen_max);
1995 for k=1:NPoints
1996 ListBoxStr{k} = sprintf(['%-' Nlen_max_str 's : %s'], name_list{k}, point_str{k});
1997 end
1998
1999 set(AVWVIEW.handles.save_point_listbox, 'String', ListBoxStr);
2000 cur_focus = get(AVWVIEW.handles.save_point_listbox, 'Value');
2001 focus = NPoints;
2002
2003 if NPoints == 0
2004 focus = 1;
2005 set(AVWVIEW.handles.save_point_listbox, 'Value', focus);
2006 elseif cur_focus > NPoints
2007 focus = NPoints;
2008 set(AVWVIEW.handles.save_point_listbox, 'Value', focus);
2009 end
2010
2011
2012
2013 function [string] = get_display_unit_string(AVWVIEW, imgXYZ)
2014
2015
2016
2017 switch(get_coordinate_space(AVWVIEW))
2018 case COORDINATE_MM
2019 format = '%7.3f %7.3f %7.3f';
2020 coord = imgXYZ.mm;
2021 string = sprintf('%7.3f %7.3f %7.3f', coord);
2022 case COORDINATE_M
2023 format = '%7.3f %7.3f %7.3f';
2024 coord = imgXYZ.meters;
2025 string = sprintf('%7.3f %7.3f %7.3f', coord);
2026 case COORDINATE_VOXEL
2027 coord = imgXYZ.voxels;
2028 string = sprintf('%7.0f %7.0f %7.0f', coord);
2029 end
2030
2031
2032 function [metric] = get_metric(AVWVIEW, imgXYZ)
2033 switch(get_coordinate_space(AVWVIEW))
2034 case COORDINATE_MM
2035 coord = imgXYZ.mm;
2036 case COORDINATE_M
2037 coord = imgXYZ.meters;
2038 case COORDINATE_VOXEL
2039 coord = imgXYZ.voxels;
2040 end
2041
2042 metric.sag = coord(1);
2043 metric.cor = coord(2);
2044 metric.axi = coord(3);
2045
2046
2047 function [AVWVIEW] = change_listbox_line(AVWVIEW, lineNo)
2048
2049
2050 [name, point] = vb_mps_pointlist_get_point(AVWVIEW.point_list, lineNo);
2051 [metric] = get_metric(AVWVIEW, point);
2052 AVWVIEW = metric2slices(AVWVIEW, metric);
2053 AVWVIEW = axial_update(AVWVIEW);
2054 AVWVIEW = coronal_update(AVWVIEW);
2055 AVWVIEW = sagittal_update(AVWVIEW);
2056 set_display_values(AVWVIEW);
2057 AVWVIEW = set_crosshairs(AVWVIEW);
2058
2059
2060 function [space, string] = get_coordinate_space(AVWVIEW)
2061 coordinate_space_setting = get(AVWVIEW.handles.coord,'value');
2062
2063 switch(coordinate_space_setting)
2064 case 1
2065 space = COORDINATE_VOXEL;
2066 string = 'VOXEL';
2067 case 2
2068 space = COORDINATE_MM;
2069 string = 'MM';
2070 case 3
2071 space = COORDINATE_M;
2072 string = 'M';
2073 end
2074
2075
2076
2077
2078
2079 function [value] = COORDINATE_VOXEL
2080 value = 1;
2081 function [value] = COORDINATE_MM
2082 value = 2;
2083 function [value] = COORDINATE_M
2084 value = 3;
2085