% 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 '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'');');
else
nii_menu.Mview_info = uimenu('Parent',nii_menu.Mview, ...
'Label','Image Information', ...
'separator','on', ...
'Callback','view_nii_menu(''img_info'');');
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