diff options
15 files changed, 181 insertions, 154 deletions
| diff --git a/build/linux/Makefile.in b/build/linux/Makefile.in index 14df491..73d8279 100644 --- a/build/linux/Makefile.in +++ b/build/linux/Makefile.in @@ -529,9 +529,6 @@ install-matlab: $(MATLAB_MEX) install-matlab-so  	$(INSTALL_SH) -m 755 -d $(MATLABBASE)/algorithms/plot_geom/draw  	$(INSTALL_SH) -m 644 $(srcdir)/../../matlab/algorithms/plot_geom/draw/*.m $(MATLABBASE)/algorithms/plot_geom/draw -	$(INSTALL_SH) -m 755 -d $(MATLABBASE)/algorithms/plot_geom/stl -	$(INSTALL_SH) -m 644 $(srcdir)/../../matlab/algorithms/plot_geom/stl/*.stl $(MATLABBASE)/algorithms/plot_geom/stl -  	$(INSTALL_SH) -m 755 -d $(MATLABBASE)/algorithms/plot_geom/util  	$(INSTALL_SH) -m 644 $(srcdir)/../../matlab/algorithms/plot_geom/util/*.m $(MATLABBASE)/algorithms/plot_geom/util diff --git a/matlab/algorithms/plot_geom/__main.m b/matlab/algorithms/plot_geom/__main.m deleted file mode 100644 index 607a242..0000000 --- a/matlab/algorithms/plot_geom/__main.m +++ /dev/null @@ -1,44 +0,0 @@ -%% main.m -% brief             small tool to render astra geometries in matlab -% -% date              20.06.2018 -% author            Tim Elberfeld -%                   imec VisionLab -%                   University of Antwerp -% -% - last update     09.07.2018 -%% -% close all; - -[h_gui, is_running] = create_gui_figure(); - -%proj_geom = create_example_cone('vec'); -%proj_geom = create_example_cone('normal'); -%proj_geom = create_example_cone('helix'); -proj_geom = create_example_parallel3d('vec'); -%proj_geom = create_example_fanflat('vec'); -%proj_geom = create_example_fanflat(); -%proj_geom = create_example_parallel3d(); - -draw_proj_geometry(proj_geom, h_gui); -hold on; - -vol_magn = 10; -phantom_size = 5; -phantom_px = 1500; -vx_size = phantom_size / phantom_px; % voxel size -vol_geom = astra_create_vol_geom(phantom_px, phantom_px, phantom_px); -line_width = 1; % line width for phantom -draw_vol_geom(vol_geom, vx_size, h_gui, 'Magnification', vol_magn,... -    'LineWidth', line_width, 'Color', 'r'); - -% this magnification is empirically chosen to fit the stl file -cad_magn = 350; -draw_cad_phantom('stl/bunny.stl', cad_magn, h_gui); - -proj_geom = create_example_cone('deform_vec'); -draw_proj_geometry(proj_geom, h_gui, 'VectorIdx', 3, 'Color', 'b',... -    'RotationAxis', [0,0,1]); - -hold off; -axis equal; diff --git a/matlab/algorithms/plot_geom/create_example_cone.m b/matlab/algorithms/plot_geom/astra_create_example_cone.m index 598899f..598899f 100644 --- a/matlab/algorithms/plot_geom/create_example_cone.m +++ b/matlab/algorithms/plot_geom/astra_create_example_cone.m diff --git a/matlab/algorithms/plot_geom/create_example_fanflat.m b/matlab/algorithms/plot_geom/astra_create_example_fanflat.m index 703a618..703a618 100644 --- a/matlab/algorithms/plot_geom/create_example_fanflat.m +++ b/matlab/algorithms/plot_geom/astra_create_example_fanflat.m diff --git a/matlab/algorithms/plot_geom/create_example_parallel3d.m b/matlab/algorithms/plot_geom/astra_create_example_parallel3d.m index e6fdf8e..e6fdf8e 100644 --- a/matlab/algorithms/plot_geom/create_example_parallel3d.m +++ b/matlab/algorithms/plot_geom/astra_create_example_parallel3d.m diff --git a/matlab/algorithms/plot_geom/draw/create_gui_figure.m b/matlab/algorithms/plot_geom/draw/create_gui_figure.m deleted file mode 100644 index a9acecf..0000000 --- a/matlab/algorithms/plot_geom/draw/create_gui_figure.m +++ /dev/null @@ -1,58 +0,0 @@ -function [h_ax, running] = create_gui_figure() -%% create_gui_figure.m -% brief     gui for the geometry drawing functions -% return    h_ax        axis to draw into with draw_*() functions -%           running     state of the rotation, needs to be passed so that -%                       the callback will work -% date      20.06.2018 -% author    Tim Elberfeld -%           imec VisionLab -%           University of Antwerp -%% -    h_figure = figure('name', 'geometry render', 'ButtonDownFcn', @toggle_rotation); -    h_ax = axes(h_figure); -     -    set(h_figure,'CloseRequestFcn', @handle_close_fig) - -    xlabel('x axis') -    ylabel('y axis') -    zlabel('z axis') - -    grid on -    box off -    axis vis3d -    axis equal -    view(0,0) - -    running = false; -    do_rotation(); - -    function [] = handle_close_fig(h_figure,~) -        % this is necessary to stop the rotation before closing the figure -        if running -            toggle_rotation() -        end -         -        delete(h_figure); -    end - -    function [] = toggle_rotation(~, ~) -        % toggle rotation state -        running = ~running;          -        if running -            view(0,0) -            do_rotation(); -        else -            view(45,45); -        end -    end - -    function [] = do_rotation() -        % rotate the rendered geometry around the origin -        camtarget([0,0,0]); % make origin the camera target and point around which to rotate -        while running -            camorbit(0.5,0,'camera') -            drawnow  -        end        -    end -end
\ No newline at end of file diff --git a/matlab/algorithms/plot_geom/draw/draw_cad_phantom.m b/matlab/algorithms/plot_geom/draw/draw_cad_phantom.m index 18873a8..92af844 100644 --- a/matlab/algorithms/plot_geom/draw/draw_cad_phantom.m +++ b/matlab/algorithms/plot_geom/draw/draw_cad_phantom.m @@ -1,9 +1,9 @@ -function [] = draw_cad_phantom(filename, magn, h_ax) +function [] = draw_cad_phantom(filename, magn)  %% draw_cad_phantom.m  % brief             render an stl model into a 3d axis object  % param vol_geom    volume geometry describing the phantom -% param magn        magnification multiplier of the phantom. default = 1  % param h_ax        handle to axis to plot into +% param magn        magnification multiplier of the phantom. default = 1  %  % date              02.07.2018  % author            Alice Presenti @@ -11,12 +11,10 @@ function [] = draw_cad_phantom(filename, magn, h_ax)  %                   University of Antwerp  % Modified by Tim Elberfeld  %% +    h_ax = gca;          if nargin == 1          magn = 1;      end -    if nargin == 2 -        h_ax = axes(gcf); -    end          [v,f,~,~] = stlRead(filename);      m = mean(v); % to center the CAD model! diff --git a/matlab/algorithms/plot_geom/draw/draw_cone_vec_geom.m b/matlab/algorithms/plot_geom/draw/draw_cone_vec_geom.m index c1ed5b0..bee83b7 100644 --- a/matlab/algorithms/plot_geom/draw/draw_cone_vec_geom.m +++ b/matlab/algorithms/plot_geom/draw/draw_cone_vec_geom.m @@ -34,17 +34,15 @@ function [] = draw_cone_vec_geom(h_ax, geom, options)      % draw the points and connect with lines      hold on;      num_angles = size(vectors, 1); -    for jj = 1:num_angles -        s_source = scatter3(h_ax, xray_source(jj, 1), xray_source(jj, 2),... -            xray_source(jj, 3)); -        s_source.Marker = options.SourceMarker; -        s_source.MarkerEdgeColor = options.SourceMarkerColor; -         -        s_det = scatter3(h_ax, detector_center(jj, 1),... -            detector_center(jj, 2), detector_center(jj, 3)); -        s_det.MarkerEdgeColor = options.DetectorMarkerColor; -        s_det.Marker = options.DetectorMarker; -    end +    s_source = scatter3(h_ax, xray_source(:, 1), xray_source(:, 2),... +        xray_source(:, 3)); +    s_source.Marker = options.SourceMarker; +    s_source.MarkerEdgeColor = options.SourceMarkerColor; + +    s_det = scatter3(h_ax, detector_center(:, 1),... +        detector_center(:, 2), detector_center(:, 3)); +    s_det.MarkerEdgeColor = options.DetectorMarkerColor; +    s_det.Marker = options.DetectorMarker;      detector = struct;      detector.u = vectors(options.VectorIdx, 7:9); @@ -56,10 +54,12 @@ function [] = draw_cone_vec_geom(h_ax, geom, options)      vertices = draw_detector_vec(h_ax, detector, options);      connect_source_detector(h_ax, vertices, detector_center, ...          xray_source, options); -    distances = eucl_dist3d(detector_center, xray_source); -    mean_sdd = mean(distances(:)); % mean source detector distance +    % rotation axis will be roughly as long as the source detector distance +    distances = eucl_dist3d(detector_center, xray_source); +    mean_sdd = mean(distances(:)); % mean source detector distance          draw_rotation_axis(h_ax, mean_sdd, options); +          text(h_ax, xray_source(options.VectorIdx, 1),...          xray_source(options.VectorIdx, 2),...          xray_source(options.VectorIdx, 3), 'x-ray source'); diff --git a/matlab/algorithms/plot_geom/draw/draw_fanflat_vec_geom.m b/matlab/algorithms/plot_geom/draw/draw_fanflat_vec_geom.m index 9f5d620..b8261cf 100644 --- a/matlab/algorithms/plot_geom/draw/draw_fanflat_vec_geom.m +++ b/matlab/algorithms/plot_geom/draw/draw_fanflat_vec_geom.m @@ -29,15 +29,13 @@ function [ output_args ] = draw_fanflat_vec_geom( h_ax, geom, options)      % draw the points and connect with lines      hold on; -    for jj = 1:num_angles -        scatter3(h_ax, xray_source(jj, 1), xray_source(jj, 2),... -            xray_source(jj, 3), options.SourceMarker,... -            options.SourceMarkerColor); -        scatter3(h_ax, detector_center(jj, 1),... -            detector_center(jj, 2), detector_center(jj, 3),... -            options.DetectorMarker, options.DetectorMarkerColor); -    end    -    +    scatter3(h_ax, xray_source(:, 1), xray_source(:, 2),... +        xray_source(:, 3), options.SourceMarker,... +        options.SourceMarkerColor); +    scatter3(h_ax, detector_center(:, 1),... +        detector_center(:, 2), detector_center(:, 3),... +        options.DetectorMarker, options.DetectorMarkerColor); +             detector = struct;      detector.u = [vectors(options.VectorIdx, 5:6), 0];      detector.v = fliplr(detector.u); @@ -49,6 +47,7 @@ function [ output_args ] = draw_fanflat_vec_geom( h_ax, geom, options)      connect_source_detector(h_ax, vertices, detector_center,...          xray_source, options);    +    % rotation axis will be roughly as long as the source detector distance      distances = eucl_dist3d(detector_center, xray_source);      mean_sdd = mean(distances(:)); % mean source detector distance      draw_rotation_axis(h_ax, mean_sdd, options); diff --git a/matlab/algorithms/plot_geom/draw/draw_parallel3d_vec_geom.m b/matlab/algorithms/plot_geom/draw/draw_parallel3d_vec_geom.m index 351ec42..ab63e43 100644 --- a/matlab/algorithms/plot_geom/draw/draw_parallel3d_vec_geom.m +++ b/matlab/algorithms/plot_geom/draw/draw_parallel3d_vec_geom.m @@ -23,13 +23,11 @@ function [ ] = draw_parallel3d_vec_geom( h_ax, geom, options)      % draw the points and connect with lines      hold on;      num_angles = size(vectors, 1); -    for jj = 1:num_angles -        scatter3(h_ax, xray_source(jj, 1), xray_source(jj, 2), xray_source(jj, 3),... -            options.SourceMarkerColor,... -            options.SourceMarker); -        scatter3(h_ax, detector_center(jj, 1), detector_center(jj, 2),... -            detector_center(jj, 3), 'k.'); -    end +    scatter3(h_ax, xray_source(:, 1), xray_source(:, 2),... +        xray_source(:, 3), options.SourceMarkerColor,... +        options.SourceMarker); +    scatter3(h_ax, detector_center(:, 1), detector_center(:, 2),... +        detector_center(:, 3), 'k.');      detector = struct;      detector.u = vectors(options.VectorIdx, 7:9); @@ -42,9 +40,11 @@ function [ ] = draw_parallel3d_vec_geom( h_ax, geom, options)      connect_source_detector(h_ax, detector, detector_center, xray_source,...          options); +    % rotation axis will be roughly as long as the source detector distance      distances = eucl_dist3d(detector_center, xray_source);      mean_sdd = mean(distances(:)); % mean source detector distance      draw_rotation_axis(h_ax, mean_sdd, options); +          text(h_ax, xray_source(options.VectorIdx, 1),...          xray_source(options.VectorIdx, 2), ...          xray_source(options.VectorIdx, 3), 'x-ray source'); diff --git a/matlab/algorithms/plot_geom/draw/draw_proj_geometry.m b/matlab/algorithms/plot_geom/draw/draw_proj_geom.m index 0d31fa2..c20ddc8 100644 --- a/matlab/algorithms/plot_geom/draw/draw_proj_geometry.m +++ b/matlab/algorithms/plot_geom/draw/draw_proj_geom.m @@ -1,9 +1,8 @@ -function [] = draw_proj_geometry(geom, h_ax, varargin) -%% draw_proj_geometry.m +function [] = draw_proj_geom(geom, varargin) +%% draw_proj_geom.m  % brief                         rendering function for astra geometries.  % param geom                    the geometry to plot. If geometry type  %                               is not supported, throws error -% param h_ax                    handle to axis to plot into  % ------------------------------  % optional parameters that can be provided as string value pairs:  % @@ -38,10 +37,7 @@ function [] = draw_proj_geometry(geom, h_ax, varargin)  %  % - last update                 07.11.2018  %% -    if nargin == 1 -        h_ax = axes(gcf); -    end - +    h_ax = gca;      options = parseoptions(varargin);      switch geom.type diff --git a/matlab/algorithms/plot_geom/draw/draw_vol_geom.m b/matlab/algorithms/plot_geom/draw/draw_vol_geom.m index e6d550d..0b4fe2f 100644 --- a/matlab/algorithms/plot_geom/draw/draw_vol_geom.m +++ b/matlab/algorithms/plot_geom/draw/draw_vol_geom.m @@ -1,17 +1,17 @@ -function [] = draw_vol_geom( vol_geom, vx_size, h_ax, varargin) +function [] = draw_vol_geom( vol_geom, varargin)  %% draw_vol_geom.m  % brief                 rendering function for astra volume geometries  %                       describing a phantom.  % param vol_geom        volume geometry describing the phantom  % param vx_size         voxel size in unit of preference. must be same unit  %                       that was used to scale the projection geometry -% param h_ax            handle to axis to plot into  % ------------------------------  % optional parameters that can be provided as string value pairs:  %  % param Magnification   magnification factor for the phantom. for small -%                       phantoms it might be necessary to scale the render up -%                       as otherwise it won't show up in the plot. Default = 1 +%                       phantoms it might be necessary to scale the render  +%                       up as otherwise it won't show up in the plot. +%                       Default = 1  % param LineWidth       line width for the box wireframe. Default = 2  % param Color           color of the wireframe. Default = 'r'  % @@ -20,12 +20,18 @@ function [] = draw_vol_geom( vol_geom, vx_size, h_ax, varargin)  %                       imec VisionLab  %                       University of Antwerp  % -% - last update         09.07.2018 +% - last update         16.11.2018  %% -    if nargin < 4 -        h_ax = axes(gcf); -    end +    h_ax = gca; +    if mod(size(varargin), 2) ~= 0 +        vx_size = varargin{1}; +        varargin = varargin(2:end); % consumed vx_size from arg list +    else +        vx_size = 1; +    end +     +          options = struct;      options.Color = 'r';      options.LineWidth = 2; diff --git a/matlab/tools/astra_plot_geom.m b/matlab/tools/astra_plot_geom.m new file mode 100644 index 0000000..3a654fd --- /dev/null +++ b/matlab/tools/astra_plot_geom.m @@ -0,0 +1,91 @@ +function [] = astra_plot_geom(geometry, varargin) +%-------------------------------------------------------------------------- +% [] = astra_plot_geometry(geometry, varargin) +% +% plot an astra geometry +% +% geometry: any astra geometry, either volume geometry, projection +%           geometry or an *.stl file (powered by stlRead). +% varargin: supports a variable number of (ordered and unordered) +%           arguments. +% +%           the remaining arguments depend on the input: +%           if 'geometry' is +%           - a volume geometry +%             vx_size               voxel size in unit of preference. Must +%                                   be same unit that was used to scale the +%                                   projection geometry. +%            and as unorderd string-value-pairs +%             Magnification         magnification factor for the phantom. +%                                   For small phantoms it might be +%                                   necessary to scale the render up as  +%                                   otherwise it won't show up in the plot. +%                                   Default = 1 +%             LineWidth             line width for the box wireframe. +%                                   Default = 2 +%             Color                 color of the wireframe. Default = 'r' +%                   +%           - a projection geometry (as unordered string-value-pairs) +%             RotationAxis          if specified, will change the drawn +%                                   rotation axis to provided axis. +%                                   Must be 3-vector. Default value is +%                                   [NaN, NaN, NaN], (meaning do not draw). +%             RotationAxisOffset    if specified, will translate the drawn  +%                                   rotation axis by the provided vector. +%                                   Default = [0, 0, 0] +%             VectorIdx             index of the vector to visualize if  +%                                   vector geometry type. Default = 1 +%             Color                 Color for all markers and lines if not  +%                                   otherwise specified +%             DetectorMarker        marker for the detector locations. +%                                   Default = '.' +%             DetectorMarkerColor   color specifier for the detector marker. +%                                   Default = 'k' +%             DetectorLineColor     color for the lines drawing the  +%                                   detector outline +%             DetectorLineWidth     line width of detector rectangle +%             SourceMarker          marker for the source locations +%             SourceMarkerColor     color specifier for the source marker +%             SourceDistance        (only for parallel3d and parallel3d_vec) +%                                   distance of source to origin +%             OpticalAxisColor      Color for drawing the optical axis +%                   +%           - a path to an *.stl file +%             magn    -             magnification factor for vertices in +%                                   CAD file. Default value = 1 +% +%-------------------------------------------------------------------------- +%-------------------------------------------------------------------------- +% This file is part of the ASTRA Toolbox +% +% Copyright: 2010-2018, imec Vision Lab, University of Antwerp +%            2014-2018, CWI, Amsterdam +% License: Open Source under GPLv3 +% Contact: astra@astra-toolbox.com +% Website: http://www.astra-toolbox.com/ +%-------------------------------------------------------------------------- +    addpath(genpath('../algorithms/plot_geom')); % add plot_geom tools to matlab path + +    if is_vol_geom(geometry) +        draw_vol_geom(geometry, varargin{:}); +    elseif is_proj_geom(geometry) +        draw_proj_geom(geometry, varargin{:}); +    elseif ischar(geometry) % assume 'geometry' is a path to a CAD file +        draw_cad_phantom(geometry, varargin{:}); +    end + +    % ---- helper functions ---- +    function [ res ] = is_vol_geom(geom) +        res = false; +        if sum(isfield(geom, {'GridRowCount', 'GridColCount'})) == 2 +            res = true; +        end +    end + +    function [ res ] = is_proj_geom(geom) +        res = false; +        if isfield(geom, 'type') +            res = true; +        end +    end +end diff --git a/matlab/algorithms/plot_geom/stl/bunny.stl b/samples/matlab/bunny.stlBinary files differ index 0b7fcaa..0b7fcaa 100644 --- a/matlab/algorithms/plot_geom/stl/bunny.stl +++ b/samples/matlab/bunny.stl diff --git a/samples/matlab/s024_plot_geometry.m b/samples/matlab/s024_plot_geometry.m new file mode 100644 index 0000000..dd57997 --- /dev/null +++ b/samples/matlab/s024_plot_geometry.m @@ -0,0 +1,42 @@ +%% s024_plot_geometry.m +% brief             example of usage for astra_plot_geom command +% - last update     16.11.2018 +% ----------------------------------------------------------------------- +% This file is part of the ASTRA Toolbox +%  +% Copyright: 2010-2018, imec Vision Lab, University of Antwerp +%            2014-2018, CWI, Amsterdam +% License: Open Source under GPLv3 +% Contact: astra@astra-toolbox.com +% Website: http://www.astra-toolbox.com/ +% ----------------------------------------------------------------------- +%% +close all; + +% proj_geom = astra_create_example_cone('vec'); +% proj_geom = astra_create_example_cone('normal'); +proj_geom = astra_create_example_cone('helix'); +% proj_geom = astra_create_example_parallel3d('vec'); +% proj_geom = astra_create_example_fanflat('vec'); +% proj_geom = astra_create_example_fanflat(); +% proj_geom = astra_create_example_parallel3d(); +% proj_geom = create_example_cone('deform_vec'); + +astra_plot_geom(proj_geom); +hold on; + +vol_magn = 20; +phantom_size = 5; +phantom_px = 1500; +vx_size = phantom_size / phantom_px; % voxel size +vol_geom = astra_create_vol_geom(phantom_px, phantom_px, phantom_px); +line_width = 1; % line width for phantom +astra_plot_geom(vol_geom, vx_size, 'Magnification', vol_magn,... +    'LineWidth', line_width, 'Color', 'r'); + +% this magnification is empirically chosen to fit the stl file +cad_magn = 900; +astra_plot_geom('bunny.stl', cad_magn); + +hold off; +axis equal; | 
