📄 view_nii.m
字号:
if isfield(nii_view.handles,'sagittal_image'),
if nii_view.nii.hdr.dime.datatype == 128 | nii_view.nii.hdr.dime.datatype == 511
Ssag = squeeze(img(nii_view.slices.sag,:,:,:,nii_view.scanid));
Ssag = permute(Ssag, [2 1 3]);
else
Ssag = squeeze(img(nii_view.slices.sag,:,:,nii_view.scanid));
Ssag = Ssag';
end
set(nii_view.handles.sagittal_image,'CData',Ssag);
end
if isfield(nii_view.handles,'sagittal_slider'),
set(nii_view.handles.sagittal_slider,'Value',nii_view.slices.sag);
end
axes(nii_view.handles.axial_axes);
axes(nii_view.handles.coronal_axes);
axes(nii_view.handles.sagittal_axes);
if ~isempty(nii_view.buttondown)
eval(nii_view.buttondown);
end
case 'coordinates',
nii_view = getappdata(fig,'nii_view');
set_image_value(nii_view);
case 'crosshair',
nii_view = getappdata(fig,'nii_view');
if get(nii_view.handles.xhair,'value') == 2 % off
set(nii_view.axi_xhair.lx,'visible','off');
set(nii_view.axi_xhair.ly,'visible','off');
set(nii_view.cor_xhair.lx,'visible','off');
set(nii_view.cor_xhair.ly,'visible','off');
set(nii_view.sag_xhair.lx,'visible','off');
set(nii_view.sag_xhair.ly,'visible','off');
else
set(nii_view.axi_xhair.lx,'visible','on');
set(nii_view.axi_xhair.ly,'visible','on');
set(nii_view.cor_xhair.lx,'visible','on');
set(nii_view.cor_xhair.ly,'visible','on');
set(nii_view.sag_xhair.lx,'visible','on');
set(nii_view.sag_xhair.ly,'visible','on');
set(nii_view.handles.axial_axes,'selected','on');
set(nii_view.handles.axial_axes,'selected','off');
set(nii_view.handles.coronal_axes,'selected','on');
set(nii_view.handles.coronal_axes,'selected','off');
set(nii_view.handles.sagittal_axes,'selected','on');
set(nii_view.handles.sagittal_axes,'selected','off');
end
case 'xhair_color',
old_color = get(gcbo,'user');
new_color = uisetcolor(old_color);
update_crosshaircolor(fig, new_color);
case {'color','contrast_def'}
nii_view = getappdata(fig,'nii_view');
if nii_view.numscan == 1
if get(nii_view.handles.colorindex,'value') == 2
set(nii_view.handles.contrast,'value',128);
elseif get(nii_view.handles.colorindex,'value') == 3
set(nii_view.handles.contrast,'value',1);
end
end
[custom_color_map, custom_colorindex] = change_colormap(fig);
if strcmpi(command, 'color')
setcolorlevel = nii_view.colorlevel;
if ~isempty(custom_color_map) % isfield(nii_view, 'color_map')
setcolormap = custom_color_map; % nii_view.color_map;
else
setcolormap = [];
end
if isfield(nii_view, 'highcolor')
sethighcolor = nii_view.highcolor;
else
sethighcolor = [];
end
redraw_cbar(fig, setcolorlevel, setcolormap, sethighcolor);
if nii_view.numscan == 1 & ...
(custom_colorindex < 2 | custom_colorindex > 3)
contrastopt.enablecontrast = 0;
else
contrastopt.enablecontrast = 1;
end
update_enable(fig, contrastopt);
end
case {'neg_color','brightness','contrast'}
change_colormap(fig);
case {'brightness_def'}
nii_view = getappdata(fig,'nii_view');
set(nii_view.handles.brightness,'value',0);
change_colormap(fig);
case 'hist_plot'
hist_plot(fig);
case 'hist_eq'
hist_eq(fig);
case 'move_cursor'
move_cursor(fig);
case 'edit_change_scan'
change_scan('edit_change_scan');
case 'slider_change_scan'
change_scan('slider_change_scan');
end
return; % view_nii
%----------------------------------------------------------------
function fig = init(nii, fig, area, setunit, setviewpoint, setscanid, buttondown, ...
colorindex, color_map, colorlevel, highcolor, cbarminmax, ...
usecolorbar, usepanel, usecrosshair, usestretch, useimagesc, ...
useinterp, setvalue, glblocminmax, setcrosshaircolor, ...
setcomplex)
% Support data type COMPLEX64 & COMPLEX128
%
if nii.hdr.dime.datatype == 32 | nii.hdr.dime.datatype == 1792
switch setcomplex,
case 0,
nii.img = real(nii.img);
case 1,
nii.img = imag(nii.img);
case 2,
if isa(nii.img, 'double')
nii.img = abs(double(nii.img));
else
nii.img = single(abs(double(nii.img)));
end
end
end
if isempty(area)
area = [0.05 0.05 0.9 0.9];
end
if isempty(setscanid)
setscanid = 1;
else
setscanid = round(setscanid);
if setscanid < 1
setscanid = 1;
end
if setscanid > nii.hdr.dime.dim(5)
setscanid = nii.hdr.dime.dim(5);
end
end
if nii.hdr.dime.datatype == 128 | nii.hdr.dime.datatype == 511
usecolorbar = 0;
elseif isempty(usecolorbar)
usecolorbar = 1;
end
if isempty(usepanel)
usepanel = 1;
end
if isempty(usestretch)
usestretch = 1;
end
if isempty(useimagesc)
useimagesc = 1;
end
if isempty(useinterp)
useinterp = 0;
end
if isempty(colorindex)
tmp = min(nii.img(:,:,:,setscanid));
if min(tmp(:)) < 0
colorindex = 2;
setcrosshaircolor = [1 1 0];
else
colorindex = 3;
end
end
if isempty(color_map) | ischar(color_map)
color_map = [];
else
colorindex = 1;
end
bgimg = [];
if ~isempty(glblocminmax)
minvalue = glblocminmax(1);
maxvalue = glblocminmax(2);
else
minvalue = double(min(nii.img(:,:,:,setscanid)));
minvalue = min(minvalue(:));
maxvalue = double(max(nii.img(:,:,:,setscanid)));
maxvalue = max(maxvalue(:));
end
if ~isempty(setvalue)
if ~isempty(glblocminmax)
minvalue = glblocminmax(1);
maxvalue = glblocminmax(2);
else
minvalue = double(min(setvalue.val));
maxvalue = double(max(setvalue.val));
end
bgimg = double(nii.img);
minbg = double(min(bgimg(:)));
maxbg = double(max(bgimg(:)));
bgimg = scale_in(bgimg, minbg, maxbg, 54) + 200; % scale to 202~256 (level 201 is used for highcolor part tolerance)
% 55 level for brain structure (paded 0 for highcolor level 1, i.e. normal level 201, to make 56 highcolor)
%
highcolor = [zeros(1,3);gray(55)];
cbarminmax = [minvalue maxvalue];
if useinterp
% scale signal data to 1~200
%
nii.img = repmat(nan, size(nii.img));
nii.img(setvalue.idx) = setvalue.val;
% 199 level for source image (map highest color to 199 instead of 200, give 1 level of tolerance)
%
bgimg = single(scale_out(bgimg, cbarminmax(1), cbarminmax(2), 198));
else
bgimg(setvalue.idx) = 0;
% scale signal data to 1~200
%
nii.img = zeros(size(nii.img));
nii.img(setvalue.idx) = scale_in(setvalue.val, minvalue, maxvalue, 198);
nii.img = nii.img + bgimg;
bgimg = [];
nii.img = scale_out(nii.img, cbarminmax(1), cbarminmax(2), 198);
minvalue = double(min(nii.img(:)));
maxvalue = double(max(nii.img(:)));
if ~isempty(glblocminmax) % maxvalue is gray
minvalue = glblocminmax(1);
end
end
colorindex = 2;
setcrosshaircolor = [1 1 0];
end
if isempty(highcolor) | ischar(highcolor)
highcolor = [];
num_highcolor = 0;
else
num_highcolor = size(highcolor,1);
end
if isempty(colorlevel)
colorlevel = 256 - num_highcolor;
end
if usecolorbar
cbar_area = area;
cbar_area(1) = area(1) + area(3)*0.93;
cbar_area(3) = area(3)*0.04;
area(3) = area(3)*0.9; % 90% used for main axes
else
cbar_area = [];
end
% init color (gray) scaling to make sure the slice clim take the
% global clim [min(nii.img(:)) max(nii.img(:))]
%
if isempty(bgimg)
clim = [minvalue maxvalue];
else
clim = [minvalue double(max(bgimg(:)))];
end
if clim(1) == clim(2)
clim(2) = clim(1) + 0.000001;
end
if isempty(cbarminmax)
cbarminmax = [minvalue maxvalue];
end
xdim = size(nii.img, 1);
ydim = size(nii.img, 2);
zdim = size(nii.img, 3);
dims = [xdim ydim zdim];
voxel_size = abs(nii.hdr.dime.pixdim(2:4)); % vol in mm
if any(voxel_size <= 0)
voxel_size(find(voxel_size <= 0)) = 1;
end
origin = abs(nii.hdr.hist.originator(1:3));
if isempty(origin) | all(origin == 0) % according to SPM
origin = (dims+1)/2;
end;
origin = round(origin);
if any(origin > dims) % simulate fMRI
origin(find(origin > dims)) = dims(find(origin > dims));
end
if any(origin <= 0)
origin(find(origin <= 0)) = 1;
end
nii_view.dims = dims;
nii_view.voxel_size = voxel_size;
nii_view.origin = origin;
nii_view.slices.sag = 1;
nii_view.slices.cor = 1;
nii_view.slices.axi = 1;
if xdim > 1, nii_view.slices.sag = origin(1); end
if ydim > 1, nii_view.slices.cor = origin(2); end
if zdim > 1, nii_view.slices.axi = origin(3); end
nii_view.area = area;
nii_view.fig = fig;
nii_view.nii = nii; % image data
nii_view.bgimg = bgimg; % background
nii_view.setvalue = setvalue;
nii_view.minvalue = minvalue;
nii_view.maxvalue = maxvalue;
nii_view.numscan = nii.hdr.dime.dim(5);
nii_view.scanid = setscanid;
Font.FontUnits = 'point';
Font.FontSize = 12;
% create axes for colorbar
%
[cbar_axes cbarminmax_axes] = create_cbar_axes(fig, cbar_area);
if isempty(cbar_area)
nii_view.cbar_area = [];
else
nii_view.cbar_area = cbar_area;
end
% create axes for top/front/side view
%
vol_size = voxel_size .* dims;
[top_ax, front_ax, side_ax] ...
= create_ax(fig, area, vol_size, usestretch);
top_pos = get(top_ax,'position');
front_pos = get(front_ax,'position');
side_pos = get(side_ax,'position');
% Sagittal Slider
%
x = side_pos(1);
y = top_pos(2) + top_pos(4);
w = side_pos(3);
h = (front_pos(2) - y) / 2;
y = y + h;
pos = [x y w h];
if xdim > 1,
slider_step(1) = 1/(xdim);
slider_step(2) = 1.00001/(xdim);
handles.sagittal_slider = uicontrol('Parent',fig, ...
'Style','slider','Units','Normalized', Font, ...
'Position',pos, 'HorizontalAlignment','center',...
'BackgroundColor',[0.5 0.5 0.5],'ForegroundColor',[0 0 0],...
'BusyAction','queue',...
'TooltipString','Sagittal slice navigation',...
'Min',1,'Max',xdim,'SliderStep',slider_step, ...
'Value',nii_view.slices.sag,...
'Callback','view_nii(''sagittal_slider'');');
set(handles.sagittal_slider,'position',pos); % linux66
end
% Coronal Slider
%
x = top_pos(1);
y = top_pos(2) + top_pos(4);
w = top_pos(3);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -