123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480 |
- % Imbed Zoom, Interp, and Info menu to view_nii window.
- %
- % Usage: view_nii_menu(fig);
- %
- % - Jimmy Shen (jimmy@rotman-baycrest.on.ca)
- %
- %--------------------------------------------------------------------
- function menu_hdl = view_nii_menu(fig, varargin)
- if isnumeric(fig)
- menu_hdl = init(fig);
- return;
- end
- menu_hdl = [];
- switch fig
- case 'interp'
- if nargin > 1
- fig = varargin{1};
- else
- fig = gcbf;
- end
- nii_menu = getappdata(fig, 'nii_menu');
- interp_on_state = get(nii_menu.Minterp,'Userdata');
- if (interp_on_state == 1)
- opt.useinterp = 1;
- view_nii(fig,opt);
- set(nii_menu.Minterp,'Userdata',0,'Label','Interp off');
- reset_zoom(fig);
- else
- opt.useinterp = 0;
- view_nii(fig,opt);
- set(nii_menu.Minterp,'Userdata',1,'Label','Interp on');
- reset_zoom(fig);
- end
- case 'reset_zoom'
- if nargin > 1
- fig = varargin{1};
- else
- fig = gcbf;
- end
- reset_zoom(fig);
- case 'orient'
- orient;
- case 'editvox'
- editvox;
- case 'img_info'
- img_info;
- case 'img_hist'
- img_hist;
- case 'save_disp'
- save_disp;
- end
- return % view_nii_menu
- %--------------------------------------------------------------------
- function menu_hdl = init(fig)
- % search for edit, view menu
- %
- nii_menu.Mfile = [];
- nii_menu.Medit = [];
- nii_menu.Mview = [];
- menuitems = findobj(fig, 'type', 'uimenu');
- for i=1:length(menuitems)
- filelabel = get(menuitems(i),'label');
- if strcmpi(strrep(filelabel, '&', ''), 'file')
- nii_menu.Mfile = menuitems(i);
- end
- editlabel = get(menuitems(i),'label');
- if strcmpi(strrep(editlabel, '&', ''), 'edit')
- nii_menu.Medit = menuitems(i);
- end
- viewlabel = get(menuitems(i),'label');
- if strcmpi(strrep(viewlabel, '&', ''), 'view')
- nii_menu.Mview = menuitems(i);
- end
- end
- set(fig, 'menubar', 'none');
- if isempty(nii_menu.Mfile)
- nii_menu.Mfile = uimenu('Parent',fig, ...
- 'Label','File');
- nii_menu.Mfile_save = uimenu('Parent',nii_menu.Mfile, ...
- 'Label','Save displayed image as ...', ...
- 'Callback','view_nii_menu(''save_disp'');');
- else
- nii_menu.Mfile_save = uimenu('Parent',nii_menu.Mfile, ...
- 'Label','Save displayed image as ...', ...
- 'separator','on', ...
- 'Callback','view_nii_menu(''save_disp'');');
- end
- if isempty(nii_menu.Medit)
- nii_menu.Medit = uimenu('Parent',fig, ...
- 'Label','Edit');
- nii_menu.Medit_orient = uimenu('Parent',nii_menu.Medit, ...
- 'Label','Convert to RAS orientation', ...
- 'Callback','view_nii_menu(''orient'');');
- nii_menu.Medit_editvox = uimenu('Parent',nii_menu.Medit, ...
- 'Label','Edit voxel value at crosshair', ...
- 'Callback','view_nii_menu(''editvox'');');
- else
- nii_menu.Medit_orient = uimenu('Parent',nii_menu.Medit, ...
- 'Label','Convert to RAS orientation', ...
- 'separator','on', ...
- 'Callback','view_nii_menu(''orient'');');
- nii_menu.Medit_editvox = uimenu('Parent',nii_menu.Medit, ...
- 'Label','Edit voxel value at crosshair', ...
- 'Callback','view_nii_menu(''editvox'');');
- end
- if isempty(nii_menu.Mview)
- nii_menu.Mview = uimenu('Parent',fig, ...
- 'Label','View');
- nii_menu.Mview_info = uimenu('Parent',nii_menu.Mview, ...
- 'Label','Image Information', ...
- 'Callback','view_nii_menu(''img_info'');');
- nii_menu.Mview_info = uimenu('Parent',nii_menu.Mview, ...
- 'Label','Volume Histogram', ...
- 'Callback','view_nii_menu(''img_hist'');');
- else
- nii_menu.Mview_info = uimenu('Parent',nii_menu.Mview, ...
- 'Label','Image Information', ...
- 'separator','on', ...
- 'Callback','view_nii_menu(''img_info'');');
- nii_menu.Mview_info = uimenu('Parent',nii_menu.Mview, ...
- 'Label','Volume Histogram', ...
- 'Callback','view_nii_menu(''img_hist'');');
- end
- nii_menu.Mzoom = rri_zoom_menu(fig);
- nii_menu.Minterp = uimenu('Parent',fig, ...
- 'Label','Interp on', ...
- 'Userdata', 1, ...
- 'Callback','view_nii_menu(''interp'');');
- setappdata(fig,'nii_menu',nii_menu);
- menu_hdl = nii_menu.Minterp;
- return % init
- %----------------------------------------------------------------
- function reset_zoom(fig)
- old_handle_vis = get(fig, 'HandleVisibility');
- set(fig, 'HandleVisibility', 'on');
- nii_view = getappdata(fig, 'nii_view');
- nii_menu = getappdata(fig, 'nii_menu');
- set(nii_menu.Mzoom,'Userdata',1,'Label','Zoom on');
- set(fig,'pointer','arrow');
- zoom off;
- axes(nii_view.handles.axial_axes);
- setappdata(get(gca,'zlabel'), 'ZOOMAxesData', ...
- [get(gca, 'xlim') get(gca, 'ylim')])
- % zoom reset;
- % zoom getlimits;
- zoom out;
- axes(nii_view.handles.coronal_axes);
- setappdata(get(gca,'zlabel'), 'ZOOMAxesData', ...
- [get(gca, 'xlim') get(gca, 'ylim')])
- % zoom reset;
- % zoom getlimits;
- zoom out;
- axes(nii_view.handles.sagittal_axes);
- setappdata(get(gca,'zlabel'), 'ZOOMAxesData', ...
- [get(gca, 'xlim') get(gca, 'ylim')])
- % zoom reset;
- % zoom getlimits;
- zoom out;
- set(fig, 'HandleVisibility', old_handle_vis);
- return; % reset_zoom
- %----------------------------------------------------------------
- function img_info
- nii_view = getappdata(gcbf, 'nii_view');
- hdr = nii_view.nii.hdr;
- max_value = num2str(double(max(nii_view.nii.img(:))));
- min_value = num2str(double(min(nii_view.nii.img(:))));
- dim = sprintf('%d %d %d', double(hdr.dime.dim(2:4)));
- vox = sprintf('%.3f %.3f %.3f', double(hdr.dime.pixdim(2:4)));
- if double(hdr.dime.datatype) == 1
- type = '1-bit binary';
- elseif double(hdr.dime.datatype) == 2
- type = '8-bit unsigned integer';
- elseif double(hdr.dime.datatype) == 4
- type = '16-bit signed integer';
- elseif double(hdr.dime.datatype) == 8
- type = '32-bit signed integer';
- elseif double(hdr.dime.datatype) == 16
- type = '32-bit single float';
- elseif double(hdr.dime.datatype) == 64
- type = '64-bit double precision';
- elseif double(hdr.dime.datatype) == 128
- type = '24-bit RGB true color';
- elseif double(hdr.dime.datatype) == 256
- type = '8-bit signed integer';
- elseif double(hdr.dime.datatype) == 511
- type = '96-bit RGB true color';
- elseif double(hdr.dime.datatype) == 512
- type = '16-bit unsigned integer';
- elseif double(hdr.dime.datatype) == 768
- type = '32-bit unsigned integer';
- elseif double(hdr.dime.datatype) == 1024
- type = '64-bit signed integer';
- elseif double(hdr.dime.datatype) == 1280
- type = '64-bit unsigned integer';
- end
- msg = {};
- msg = [msg {''}];
- msg = [msg {['Dimension: [', dim, ']']}];
- msg = [msg {''}];
- msg = [msg {['Voxel Size: [', vox, ']']}];
- msg = [msg {''}];
- msg = [msg {['Data Type: [', type, ']']}];
- msg = [msg {''}];
- msg = [msg {['Max Value: [', max_value, ']']}];
- msg = [msg {''}];
- msg = [msg {['Min Value: [', min_value, ']']}];
- msg = [msg {''}];
- if isfield(nii_view.nii, 'fileprefix')
- if isfield(nii_view.nii, 'filetype') & nii_view.nii.filetype == 2
- msg = [msg {['File Name: [', nii_view.nii.fileprefix, '.nii]']}];
- msg = [msg {''}];
- elseif isfield(nii_view.nii, 'filetype')
- msg = [msg {['File Name: [', nii_view.nii.fileprefix, '.img]']}];
- msg = [msg {''}];
- else
- msg = [msg {['File Prefix: [', nii_view.nii.fileprefix, ']']}];
- msg = [msg {''}];
- end
- end
- h = msgbox(msg, 'Image Information', 'modal');
- set(h,'color',[1 1 1]);
- return; % img_info
- %----------------------------------------------------------------
- function orient
- fig = gcbf;
- nii_view = getappdata(fig, 'nii_view');
- nii = nii_view.nii;
- if ~isempty(nii_view.bgimg)
- msg = 'You can not modify an overlay image';
- h = msgbox(msg, 'Error', 'modal');
- return;
- end
- old_pointer = get(fig,'Pointer');
- set(fig,'Pointer','watch');
- [nii orient] = rri_orient(nii);
- if isequal(orient, [1 2 3]) % do nothing
- set(fig,'Pointer',old_pointer);
- return;
- end
- oldopt = view_nii(fig);
- opt.command = 'updatenii';
- opt.usecolorbar = oldopt.usecolorbar;
- opt.usepanel = oldopt.usepanel;
- opt.usecrosshair = oldopt.usecrosshair;
- opt.usestretch = oldopt.usestretch;
- opt.useimagesc = oldopt.useimagesc;
- opt.useinterp = oldopt.useinterp;
- opt.setarea = oldopt.area;
- opt.setunit = oldopt.unit;
- opt.setviewpoint = oldopt.viewpoint;
- opt.setscanid = oldopt.scanid;
- opt.setcbarminmax = oldopt.cbarminmax;
- opt.setcolorindex = oldopt.colorindex;
- opt.setcolormap = oldopt.colormap;
- opt.setcolorlevel = oldopt.colorlevel;
- if isfield(oldopt,'highcolor')
- opt.sethighcolor = oldopt.highcolor;
- end
- view_nii(fig, nii, opt);
- set(fig,'Pointer',old_pointer);
- reset_zoom(fig);
- return; % orient
- %----------------------------------------------------------------
- function editvox
- fig = gcbf;
- nii_view = getappdata(fig, 'nii_view');
- if ~isempty(nii_view.bgimg)
- msg = 'You can not modify an overlay image';
- h = msgbox(msg, 'Error', 'modal');
- return;
- end
- nii = nii_view.nii;
- oldopt = view_nii(fig);
- sag = nii_view.imgXYZ.vox(1);
- cor = nii_view.imgXYZ.vox(2);
- axi = nii_view.imgXYZ.vox(3);
- if nii_view.nii.hdr.dime.datatype == 128
- imgvalue = [double(nii.img(sag,cor,axi,1,nii_view.scanid)) double(nii.img(sag,cor,axi,2,nii_view.scanid)) double(nii.img(sag,cor,axi,3,nii_view.scanid))];
- init_val = sprintf('%7.4g %7.4g %7.4g',imgvalue);
- elseif nii_view.nii.hdr.dime.datatype == 511
- R = double(nii.img(sag,cor,axi,1,nii_view.scanid)) * (nii_view.nii.hdr.dime.glmax - ...
- nii_view.nii.hdr.dime.glmin) + nii_view.nii.hdr.dime.glmin;
- G = double(nii.img(sag,cor,axi,2,nii_view.scanid)) * (nii_view.nii.hdr.dime.glmax - ...
- nii_view.nii.hdr.dime.glmin) + nii_view.nii.hdr.dime.glmin;
- B = double(nii.img(sag,cor,axi,3,nii_view.scanid)) * (nii_view.nii.hdr.dime.glmax - ...
- nii_view.nii.hdr.dime.glmin) + nii_view.nii.hdr.dime.glmin;
- imgvalue = [R G B];
- init_val = sprintf('%7.4g %7.4g %7.4g',imgvalue);
- else
- imgvalue = double(nii.img(sag,cor,axi,nii_view.scanid));
- init_val = sprintf('%.6g',imgvalue);
- end
- old_pointer = get(fig,'Pointer');
- set(fig,'Pointer','watch');
- repeat = 1;
- while repeat
- if nii_view.nii.hdr.dime.datatype == 128 | nii_view.nii.hdr.dime.datatype == 511
- init_val = inputdlg({'Replace the current voxel values with 3 new numbers:'}, ...
- 'Edit voxel value at crosshair', 1, {num2str(init_val)});
- else
- init_val = inputdlg({'Replace the current voxel value with 1 new number:'}, ...
- 'Edit voxel value at crosshair', 1, {num2str(init_val)});
- end
- if isempty(init_val)
- set(fig,'Pointer',old_pointer);
- return
- end
- imgvalue = str2num(init_val{1});
- if ( (nii_view.nii.hdr.dime.datatype == 128 | nii_view.nii.hdr.dime.datatype == 511) ...
- & length(imgvalue) ~= 3 ) | ...
- ( (nii_view.nii.hdr.dime.datatype ~= 128 & nii_view.nii.hdr.dime.datatype ~= 511) ...
- & length(imgvalue) ~= 1 )
- % do nothing
- else
- repeat = 0;
- end
- end
- if nii_view.nii.hdr.dime.datatype == 128
- nii.img(sag,cor,axi,1,nii_view.scanid) = imgvalue(1);
- nii.img(sag,cor,axi,2,nii_view.scanid) = imgvalue(2);
- nii.img(sag,cor,axi,3,nii_view.scanid) = imgvalue(3);
- elseif nii_view.nii.hdr.dime.datatype == 511
- nii.img(sag,cor,axi,1,nii_view.scanid) = (imgvalue(1) - nii_view.nii.hdr.dime.glmin) ...
- / (nii_view.nii.hdr.dime.glmax - nii_view.nii.hdr.dime.glmin);
- nii.img(sag,cor,axi,2,nii_view.scanid) = (imgvalue(2) - nii_view.nii.hdr.dime.glmin) ...
- / (nii_view.nii.hdr.dime.glmax - nii_view.nii.hdr.dime.glmin);
- nii.img(sag,cor,axi,3,nii_view.scanid) = (imgvalue(3) - nii_view.nii.hdr.dime.glmin) ...
- / (nii_view.nii.hdr.dime.glmax - nii_view.nii.hdr.dime.glmin);
- else
- nii.img(sag,cor,axi,nii_view.scanid) = imgvalue;
- end
- opt.command = 'updatenii';
- opt.usecolorbar = oldopt.usecolorbar;
- opt.usepanel = oldopt.usepanel;
- opt.usecrosshair = oldopt.usecrosshair;
- opt.usestretch = oldopt.usestretch;
- opt.useimagesc = oldopt.useimagesc;
- opt.useinterp = oldopt.useinterp;
- opt.setarea = oldopt.area;
- opt.setunit = oldopt.unit;
- opt.setviewpoint = oldopt.viewpoint;
- opt.setscanid = oldopt.scanid;
- opt.setcbarminmax = oldopt.cbarminmax;
- opt.setcolorindex = oldopt.colorindex;
- opt.setcolormap = oldopt.colormap;
- opt.setcolorlevel = oldopt.colorlevel;
- if isfield(oldopt,'highcolor')
- opt.sethighcolor = oldopt.highcolor;
- end
- view_nii(fig, nii, opt);
- set(fig,'Pointer',old_pointer);
- reset_zoom(fig);
- return; % editvox
- %----------------------------------------------------------------
- function save_disp
- [filename pathname] = uiputfile('*.*', 'Save displayed image as (*.nii or *.img)');
- if isequal(filename,0) | isequal(pathname,0)
- return;
- else
- out_imgfile = fullfile(pathname, filename); % original image file
- end
- old_pointer = get(gcbf,'Pointer');
- set(gcbf,'Pointer','watch');
- nii_view = getappdata(gcbf, 'nii_view');
- nii = nii_view.nii;
- try
- save_nii(nii, out_imgfile);
- catch
- msg = 'File can not be saved.';
- msgbox(msg, 'File write error', 'modal');
- end
- set(gcbf,'Pointer',old_pointer);
- return; % save_disp
- %----------------------------------------------------------------
- function img_hist
- nii_view = getappdata(gcbf, 'nii_view');
- N = hist(double(nii_view.nii.img(:)),256);
- x = linspace(double(min(nii_view.nii.img(:))), double(max(nii_view.nii.img(:))), 256);
- figure;bar(x,N);
- set(gcf, 'number', 'off', 'name', 'Volume Histogram');
- set(gcf, 'windowstyle', 'modal'); % no zoom ...
- xspan = max(x) - min(x) + 1;
- yspan = max(N) + 1;
- set(gca, 'xlim', [min(x)-xspan/20, max(x)+xspan/20]);
- set(gca, 'ylim', [-yspan/20, max(N)+yspan/20]);
- return; % img_hist
|