📄 avw_view.m
字号:
return
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [AVWVIEW,metric] = slices2metric(AVWVIEW),
AVWVIEW.imgXYZ.voxels = [AVWVIEW.slices.sag,AVWVIEW.slices.cor,AVWVIEW.slices.axi];
AVWVIEW.imgXYZ.meters = AVWVIEW.imgXYZ.voxels .* AVWVIEW.scale2meters;
AVWVIEW.imgXYZ.mm = AVWVIEW.imgXYZ.voxels .* AVWVIEW.scale2mm;
coord_value = get(AVWVIEW.handles.coord,'value');
if coord_value == 2,
% using mm
img_mm = AVWVIEW.imgXYZ.voxels .* AVWVIEW.scale2mm;
metric.axi = img_mm(3);
metric.cor = img_mm(2);
metric.sag = img_mm(1);
elseif coord_value == 3,
% using meters
img_meters = AVWVIEW.imgXYZ.voxels .* AVWVIEW.scale2meters;
metric.axi = img_meters(3);
metric.cor = img_meters(2);
metric.sag = img_meters(1);
else
% voxels
metric.axi = AVWVIEW.slices.axi;
metric.cor = AVWVIEW.slices.cor;
metric.sag = AVWVIEW.slices.sag;
end;
return
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function AVWVIEW = metric2slices(AVWVIEW,metric),
coord_value = get(AVWVIEW.handles.coord,'value');
if coord_value == 2,
% using mm
xpix = double(AVWVIEW.avw.hdr.dime.pixdim(2));
ypix = double(AVWVIEW.avw.hdr.dime.pixdim(3));
zpix = double(AVWVIEW.avw.hdr.dime.pixdim(4));
AVWVIEW.slices.axi = round(metric.axi / zpix);
AVWVIEW.slices.cor = round(metric.cor / ypix);
AVWVIEW.slices.sag = round(metric.sag / xpix);
elseif coord_value == 3,
% using meters
xpix = double(AVWVIEW.avw.hdr.dime.pixdim(2)) / 1000;
ypix = double(AVWVIEW.avw.hdr.dime.pixdim(3)) / 1000;
zpix = double(AVWVIEW.avw.hdr.dime.pixdim(4)) / 1000;
AVWVIEW.slices.axi = round(metric.axi / zpix);
AVWVIEW.slices.cor = round(metric.cor / ypix);
AVWVIEW.slices.sag = round(metric.sag / xpix);
else
% voxels
AVWVIEW.slices.axi = round(metric.axi);
AVWVIEW.slices.cor = round(metric.cor);
AVWVIEW.slices.sag = round(metric.sag);
end;
return
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function AVWVIEW = init(avw,invarname),
% try to keep track of the input struct
if exist('invarname','var'),
if ~isempty(invarname),
AVWVIEW.invarname = invarname;
else
AVWVIEW.invarname = '';
end
else
AVWVIEW.invarname = '';
end
% GUI General Parameters
GUIwidth = 150;
GUIheight = 50;
version = '[$Revision: 1.12 $]';
name = sprintf('AVW View [v%s]',version(12:16));
if isfield(avw,'fileprefix'),
if ~isempty(avw.fileprefix),
format = strcat('%+',sprintf('%d',length(avw.fileprefix)+1),'s');
name = strcat(name,' - ',sprintf(format,avw.fileprefix));
end
end
% The Zbuffer provides smooth slice animations (OpenGL is no good)
GUI = figure('Name',name,'Tag','AVWVIEW','units','characters',...
'BackingStore','off',...
'NumberTitle','off','color',[0 0 0],...
'MenuBar','figure','Position',[1 1 GUIwidth GUIheight],...
'Renderer','zbuffer');
movegui(GUI,'center');
set(GUI,'KeyPressFcn','avw_view([],[],''keypress'');');
AVWVIEW.gui = GUI;
Font.FontName = 'Helvetica';
Font.FontUnits = 'Pixels';
Font.FontSize = 9;
Font.FontWeight = 'normal';
Font.FontAngle = 'normal';
AVWVIEW.shading = 'flat';
shading(AVWVIEW.shading)
% % determine the datatype of avw.img
% switch double(avw.hdr.dime.bitpix),
% case 1,
% fprintf('...converting avw.img to uint8 for viewing only.\n\n');
% avw.img = uint8(avw.img);
% case 8,
% fprintf('...converting avw.img to uint8 for viewing only.\n\n');
% avw.img = uint8(avw.img);
% case 16,
% fprintf('...converting avw.img to uint16 for viewing only.\n\n');
% avw.img = uint16(avw.img);
% case {32,64},
% % make sure it is double, not single
% avw.img = double(avw.img);
% otherwise,
% % do nothing, leave it as is
% end
% calculate image stats
intensityMean = mean(mean(mean(avw.img)));
intensityMeanRobust = mean(mean(mean(avw.img(find(avw.img)))));
intensityStdev = std(std(std(avw.img)));
intensityMax = max(max(max(avw.img)));
% try to adjust for large intensity extremes
if intensityMax > 255,
% got 16 bit data, at least
adjust = 0.5;
else
adjust = 0.9;
end
%AVWVIEW.clim = [0 (intensityMeanRobust + (10 * intensityStdev)) ];
AVWVIEW.clim = [0 (intensityMax * adjust)];
AVWVIEW.xdim = size(avw.img,1);
AVWVIEW.ydim = size(avw.img,2);
AVWVIEW.zdim = size(avw.img,3);
AVWVIEW.slices.sag = 1;
AVWVIEW.slices.cor = 1;
AVWVIEW.slices.axi = 1;
if AVWVIEW.xdim > 1, AVWVIEW.slices.sag = floor(AVWVIEW.xdim/2); end
if AVWVIEW.ydim > 1, AVWVIEW.slices.cor = floor(AVWVIEW.ydim/2); end
if AVWVIEW.zdim > 1, AVWVIEW.slices.axi = floor(AVWVIEW.zdim/2); end
% store the volume center for later reference when
% calculating fiducial locations
center = avw_center(avw);
AVWVIEW.center = center.abs.voxels;
% set the default origin at the center
AVWVIEW.origin = AVWVIEW.center;
AVWVIEW.pixdim = double(avw.hdr.dime.pixdim(2:4));
AVWVIEW.scale2mm = AVWVIEW.pixdim; % vol scale in mm
AVWVIEW.scale2meters = AVWVIEW.pixdim ./ 1000; % vol scale in meters
AVWVIEW.daspect = AVWVIEW.pixdim ./ min(AVWVIEW.pixdim);
xPlotSize = 0.38;
yPlotSize = 0.38;
AVWVIEW.cmapString = 'gray';
AVWVIEW.cmap = colormap(AVWVIEW.cmapString);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Axial Slice
if AVWVIEW.xdim > 1 & AVWVIEW.ydim > 1,
handles.axial_subplot = subplot('position',[0.075 0.075 xPlotSize yPlotSize]);
Saxial = squeeze(avw.img(:,:,AVWVIEW.slices.axi));
%handles.axial_image = pcolor(double(Saxial)); colormap(gray); shading interp
%pcolor(Saxial'); colormap(gray); shading flat
%surf(avw.img(:,:,20)','edgecolor','none'); view(2); axis tight; colormap(flipdim(gray,1)); colorbar
%surf(avw.img(:,:,20)','edgecolor','none'); view(2); axis tight; colormap(gray)
%image(avw.img(:,:,20)'); axis image; colormap(gray)
%imagesc(avw.img(:,:,20)'); axis image; colormap(gray)
%handles.axial_image = image('Cdata',Saxial','CDataMapping','scaled',...
% 'XData',[0 xdim],'YData',[0 ydim]);
handles.axial_image = imagesc([0,AVWVIEW.xdim],[0,AVWVIEW.ydim],Saxial',AVWVIEW.clim);
handles.axial_axes = gca;
set(gca,'YDir','normal','XLimMode','manual','YLimMode','manual',...
'ClimMode','manual','YColor',[1 1 1],'XColor',[1 1 1])
title('Axial','Color',[1 1 1])
ylabel('Y')
xlabel('X')
%xlabel('(Right <<) X (>> Left)'); % default radiological orientation for Analyze
%xlabel('(Left <<) X (>> Right)')
% This callback navigates with mouse button click
set(handles.axial_image,'ButtonDownFcn','avw_view([],[],''axial_image'');');
GUIheight = 0.46;
if AVWVIEW.zdim > 1,
slider_step(1) = 1/(AVWVIEW.zdim);
slider_step(2) = 1/(AVWVIEW.zdim);
handles.axial_slider = uicontrol('Parent',GUI,'Style','slider',...
'Units','Normalized', Font, ...
'Position',[.55 GUIheight .10 .03], 'HorizontalAlignment', 'center',...
'BusyAction','queue',...
'TooltipString','Axial slice navigation',...
'Min',1,'Max',AVWVIEW.zdim,'SliderStep',slider_step,'Value',AVWVIEW.slices.axi,...
'Callback','avw_view([],[],''axial_slider'');');
end
handles.axial_sliderN = uicontrol('Parent',GUI,'Style','text',...
'Units','Normalized', Font, ...
'Position',[.65 GUIheight .03 .03], 'HorizontalAlignment', 'center',...
'BackgroundColor',[0 0 0],'ForegroundColor',[1 1 1],...
'BusyAction','queue',...
'TooltipString','Axial slice number',...
'String',num2str(AVWVIEW.slices.axi),'Value',AVWVIEW.slices.axi);
handles.axial_sliderT = uicontrol('Parent',GUI,'Style','text',...
'Units','Normalized', Font, ...
'Position',[.70 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
'BackgroundColor',[0 0 0],'ForegroundColor',[1 1 1],...
'BusyAction','queue',...
'TooltipString','Axial slice navigation',...
'String','Axial');
handles.axial_xlim = get(handles.axial_axes,'Xlim');
handles.axial_ylim = get(handles.axial_axes,'Ylim');
handles.axial_xline = line('Xdata',[AVWVIEW.slices.sag AVWVIEW.slices.sag],'Ydata',handles.axial_ylim);
handles.axial_yline = line('Ydata',[AVWVIEW.slices.cor AVWVIEW.slices.cor],'Xdata',handles.axial_xlim);
set(handles.axial_xline,'Color','b','EraseMode','xor','Tag','XLINE');
set(handles.axial_yline,'Color','b','EraseMode','xor','Tag','YLINE');
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Coronal Slice
if AVWVIEW.xdim > 1 & AVWVIEW.zdim > 1,
handles.coronal_subplot = subplot('position',[0.075 0.575 xPlotSize yPlotSize]);
Scor = squeeze(avw.img(:,AVWVIEW.slices.cor,:));
handles.coronal_image = imagesc([0,AVWVIEW.xdim],[0,AVWVIEW.zdim],Scor',AVWVIEW.clim);
handles.coronal_axes = gca;
set(gca,'YDir','normal','XLimMode','manual','YLimMode','manual',...
'ClimMode','manual','YColor',[1 1 1],'XColor',[1 1 1])
%xlabel('(Left <<) X (>> Right)')
%xlabel('(Right <<) X (>> Left)')
xlabel('X')
ylabel('Z')
title('Coronal','Color',[1 1 1])
% This callback navigates with left click
set(handles.coronal_image,'ButtonDownFcn','avw_view([],[],''coronal_image'');');
GUIheight = GUIheight - 0.04;
if AVWVIEW.ydim > 1,
slider_step(1) = 1/(AVWVIEW.ydim);
slider_step(2) = 1/(AVWVIEW.ydim);
handles.coronal_slider = uicontrol('Parent',GUI,'Style','slider',...
'Units','Normalized', Font, ...
'Position',[.55 GUIheight .10 .03], 'HorizontalAlignment', 'center',...
'BusyAction','queue',...
'TooltipString','Coronal slice navigation',...
'Min',1,'Max',AVWVIEW.ydim,'SliderStep',slider_step,'Value',AVWVIEW.slices.cor,...
'Callback','avw_view([],[],''coronal_slider'');');
end
handles.coronal_sliderN = uicontrol('Parent',GUI,'Style','text',...
'Units','Normalized', Font, ...
'Position',[.65 GUIheight .03 .03], 'HorizontalAlignment', 'center',...
'BackgroundColor',[0 0 0],'ForegroundColor',[1 1 1],...
'BusyAction','queue',...
'TooltipString','Coronal slice number',...
'String',num2str(AVWVIEW.slices.cor),'Value',AVWVIEW.slices.cor);
handles.coronal_sliderT = uicontrol('Parent',GUI,'Style','text',...
'Units','Normalized', Font, ...
'Position',[.70 GUIheight .10 .03], 'HorizontalAlignment', 'left',...
'BackgroundColor',[0 0 0],'ForegroundColor',[1 1 1],...
'BusyAction','queue',...
'TooltipString','Coronal slice navigation',...
'String','Coronal');
handles.coronal_xlim = get(handles.coronal_axes,'Xlim');
handles.coronal_ylim = get(handles.coronal_axes,'Ylim');
handles.coronal_xline = line('Xdata',[AVWVIEW.slices.sag AVWVIEW.slices.sag],'Ydata',handles.coronal_ylim);
handles.coronal_yline = line('Ydata',[AVWVIEW.slices.axi AVWVIEW.slices.axi],'Xdata',handles.coronal_xlim);
set(handles.coronal_xline,'Color','b','EraseMode','xor','Tag','XLINE');
set(handles.coronal_yline,'Color','b','EraseMode','xor','Tag','YLINE');
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Sagittal Slice
if AVWVIEW.ydim > 1 & AVWVIEW.zdim > 1,
handles.sagittal_subplot = subplot('position',[0.575 0.575 xPlotSize yPlotSize]);
Ssag = squeeze(avw.img(AVWVIEW.slices.sag,:,:));
handles.sagittal_image = imagesc([0,AVWVIEW.ydim],[0,AVWVIEW.zdim],Ssag',AVWVIEW.clim);
handles.sagittal_axes = gca;
set(gca,'YDir','normal','XLimMode','manual','YLimMode','manual',...
'ClimMode','manual','YColor',[1 1 1],'XColor',[1 1 1])
xlabel('Y')
ylabel('Z')
title('Sagittal','Color',[1 1 1])
% This callback navigates with mouse click
set(handles.sagittal_image,'ButtonDownFcn','avw_view([],[],''sagittal_image'');');
GUIheight = GUIheight - 0.04;
if AVWVIEW.xdim > 1,
slider_step(1) = 1/(AVWVIEW.xdim);
slider_step(2) = 1/(AVWVIEW.xdim);
handles.sagittal_slider = uicontrol('Parent',GUI,'Style','slider',...
'Units','Normalized', Font, ...
'Position',[.55 GUIheight .10 .03], 'HorizontalAlignment', 'center',...
'BusyAction','queue',...
'TooltipString','Sagittal slice navigation',...
'Min',1,'Max',AVWVIEW.xdim,'SliderStep',slider_step,'Value',AVWVIEW.slices.sag,...
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -