Files
fold_slice/tomo/+tomo/show_projections.m
T
2026-08-07 15:56:42 +09:00

174 lines
7.5 KiB
Matlab
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
% SHOW_PROJECTIONS show playable animation of projections
% show_projections(img_stack, theta, par, varargin)
%
% Inputs:
% **img_stack - 3D array of projections
% **theta - angles corresponding to the frames
% **par - parameter structure
% *optional*
% **windowautopos % auomtatic window positioning
% **baraxis % plotted range
% **rectangle_pos % draw rectangle at given coordinates [xmin, xmax, ymin, ymax]
% **title % constant title prefix for all projections
% **title_extra % variable title suffix, one cell containing a string per projections !!!
% **fps % maximal frame rate
% **figure_id % id number of the created figure
% **showsorted % show projection sorted by angle
% **fnct % data processing function
% **init_frame % starting frame number
% **show_grid % plot grid ovelaying the plotted image
% **plot_residua % plot residua in the image
% **plot_only_180_range % plot projection with angle > 180 mirrored and merged with projections from 0-180deg
%*-----------------------------------------------------------------------*
%|                                                                       |
%|  Except where otherwise noted, this work is licensed under a          |
%|  Creative Commons Attribution-NonCommercial-ShareAlike 4.0            |
%|  International (CC BY-NC-SA 4.0) license.                             |
%|                                                                       |
%|  Copyright (c) 2017 by Paul Scherrer Institute (http://www.psi.ch)    |
%|                                                                       |
%|      Author: CXS group, PSI  |
%*-----------------------------------------------------------------------*
% You may use this code with the following provisions:
%
% If the code is fully or partially redistributed, or rewritten in another
% computing language this notice should be included in the redistribution.
%
% If this code, or subfunctions or parts of it, is used for research in a
% publication or if it is fully or partially rewritten for another
% computing language the authors and institution should be acknowledged
% in written form in the publication: “Data processing was carried out
% using the “cSAXS matlab package” developed by the CXS group,
% Paul Scherrer Institut, Switzerland.”
% Variations on the latter text can be incorporated upon discussion with
% the CXS group if needed to more specifically reflect the use of the package
% for the published work.
%
% A publication that focuses on describing features, or parameters, that
% are already existing in the code should be first discussed with the
% authors.
%
% This code and subroutines are part of a continuous development, they
% are provided “as they are” without guarantees or liability on part
% of PSI or the authors. It is the user responsibility to ensure its
% proper use and the correctness of the results.
function show_projections(img_stack, theta, param, varargin)
import math.*
import plotting.*
if nargin < 3
param = struct();
end
parser = inputParser;
parser.addParameter('windowautopos', true , @islogical ) % auomtatic window positioning
parser.addParameter('baraxis', 'auto' ) % plotted range
parser.addParameter('rectangle_pos', [], @isnumeric ) % draw rectangle with at coordinates
parser.addParameter('title', '', @isstr ) % constant title prefix for all projections
parser.addParameter('title_extra', {}, @iscell ) % variable title suffix, one cell containing a string per projections
parser.addParameter('fps', 25, @isnumeric) % maximal frame rate
parser.addParameter('figure_id', 1, @isnumeric) % maximal frame rate
parser.addParameter('showsorted', true, @islogical) % maximal frame rate
parser.addParameter('fnct', @(x)x) % data processing function
parser.addParameter('init_frame', 1, @isnumeric) % starting frame number
parser.addParameter('show_grid', true, @islogical) % starting frame number
parser.addParameter('plot_residua', false, @islogical) % plot residua in the image
parser.addParameter('plot_only_180_range', false, @islogical) % plot residua in the image
parser.parse(varargin{:})
r = parser.Results;
% load all to the param structure
for name = fieldnames(r)'
if ~isfield(param, name) || ~ismember(name, parser.UsingDefaults)
% prefer values in varargin structure
param.(name{1}) = r.(name{1});
end
end
screensize = get( groot, 'Screensize' );
nframes = size(img_stack,3);
frames = 1:nframes;
fig = plotting.smart_figure(param.figure_id);
clf()
if param.windowautopos
win_size = [1060 767];
set(fig,'Outerposition',[150 min(270,screensize(4)-win_size(2)) 1060 767]);
end
if strcmpi(param.baraxis,'auto') && nframes > 1 && isreal(img_stack) && strcmp( func2str( r.fnct ), '(x)x')
% set the same range for all the frames using quantile range
param.baraxis = gather(sp_quantile(img_stack, [1e-3, 1-1e-3], ceil(sqrt(numel(img_stack)))));
end
if r.plot_only_180_range
img_stack = fliplr(img_stack(:,:,theta >= 180 | theta < 0));
theta = mod(theta, 180);
end
if param.showsorted && nframes > 1
[~, ind] = sort(theta);
frames = ind(frames);
end
if isa(img_stack,'uint16') % half precision data
param.fnct = @(x)(param.fnct(fp16.get(x))); % covnvert to singles first
end
for ii = 1:nframes
num=ii; % frames(ii);
try
title_list{ii} = sprintf('%s Scan: %05d Projection: %03d Angle=%5.2f deg Energy=%.3f kev', param.title, param.scanstomo(num), num, theta(num), param.energy(num));
catch
title_list{ii} = sprintf('%s Projection: %03d', param.title, num);
end
if ~isempty(param.title_extra) && length(param.title_extra) == nframes
%title_list{ii} = [title_list{ii}, ' ', param.title_extra{num}];
title_list{ii} = {title_list{ii}; param.title_extra{num}};
end
end
slider_default = [.15 0.01 0.7 0.05];
play_default = [slider_default(1)-0.1 slider_default(2) 0.08 0.05];
edit_default = [slider_default(1)+slider_default(3)+0.01 slider_default(2) 0.08 0.05];
imagesc3D(img_stack, 'title_list', title_list, 'fps', param.fps , 'slider_position',slider_default , ...
'play_position', play_default , 'edit_position', edit_default,'fnct', param.fnct, 'order', frames,...
'init_frame', param.init_frame, 'loop', true, 'plot_residua', param.plot_residua )
colormap bone(256);
axis xy equal tight;
colorbar
if ~isempty(param.rectangle_pos)
hold all
rectangle('Position',[param.rectangle_pos(1), param.rectangle_pos(3), param.rectangle_pos(2)-param.rectangle_pos(1), param.rectangle_pos(4)-param.rectangle_pos(3)],'edgecolor','r')
hold off
end
if ~strcmpi(param.baraxis,'auto')
caxis(param.baraxis)
end
if param.show_grid
grid on
end
drawnow
end