From 9c66a0dd86a87e36d8a2190dbd6dfc49e4193ff9 Mon Sep 17 00:00:00 2001 From: Nicola Vigano <nicola.vigano@esrf.fr> Date: Fri, 30 Jan 2015 20:18:01 +0100 Subject: [PATCH] Assembling: Fixed R-vector assembling Signed-off-by: Nicola Vigano <nicola.vigano@esrf.fr> --- 5_reconstruction/GtAssembleVol3D.m | 4 +- zUtil_Imaging/gtPlaceSubVolume.m | 63 ++++++++++++++++++------------ 2 files changed, 40 insertions(+), 27 deletions(-) diff --git a/5_reconstruction/GtAssembleVol3D.m b/5_reconstruction/GtAssembleVol3D.m index d0517d52..5ae04370 100644 --- a/5_reconstruction/GtAssembleVol3D.m +++ b/5_reconstruction/GtAssembleVol3D.m @@ -547,10 +547,8 @@ classdef GtAssembleVol3D < handle single_dim_dmvol = gtCrop(single_dim_dmvol, segbb); single_dim_dmvol(~seg_vol) = 0; - % Turning the C functions off is way slower, but - % for some reason they don't work in this case dmvol = gtPlaceSubVolume( dmvol, single_dim_dmvol, ... - [volBBox(1:3), ii_dim-1], [], obj.localPar.overlaps, false); + [volBBox(1:3), ii_dim-1], [], 'assign'); end catch mexc gtPrintException(mexc, sprintf('\nGrain %d failed!!\n', ii)); diff --git a/zUtil_Imaging/gtPlaceSubVolume.m b/zUtil_Imaging/gtPlaceSubVolume.m index 5438c750..da61035c 100644 --- a/zUtil_Imaging/gtPlaceSubVolume.m +++ b/zUtil_Imaging/gtPlaceSubVolume.m @@ -14,6 +14,11 @@ function output = gtPlaceSubVolume(output, input, shift, index, assign_op, use_c % shift=[2 -2 0] means that voxel (a, b, c) will be at (a+2, b-2, c) in % output. % +% if the output volume has more than 3 dimensions, the shifts have to +% be extended in order to select the position in the next dimensions. +% Otherwhise ones will be placed +% However, the placing will still happen in the first 3 dimensions +% % Note - this is used to add on volume to another one, rather than % placing one image in the other. % I have modified so it no longer adds it. I hope this doesn't break @@ -32,6 +37,10 @@ function output = gtPlaceSubVolume(output, input, shift, index, assign_op, use_c assign_op = 'assign'; end + if (index ~= 0) + input = index .* input; + end + inputSize = size(input); outputSize = size(output); num_input_dims = numel(inputSize); @@ -49,28 +58,17 @@ function output = gtPlaceSubVolume(output, input, shift, index, assign_op, use_c inputSize((num_input_dims+1):3) = 1; outputSize((num_output_dims+1):3) = 1; - shift((numel(shift)+1):max(num_output_dims, 3)) = 0; - - % We add one because the shifting is done in matlab code! - extra_dims_shift = arrayfun(@(x){x+1}, shift(4:num_output_dims)); - - full_output = output; - if (~isempty(extra_dims_shift)) - output = full_output(:, :, :, extra_dims_shift{:}); - end + shift((numel(shift)+1):num_output_dims) = 0; % output and input volume limits [outLims, inLims] = gtGetVolsIntersectLimits(outputSize(1:3), inputSize, shift(1:3)); - input = input( inLims(1, 1):inLims(2, 1), ... - inLims(1, 2):inLims(2, 2), ... - inLims(1, 3):inLims(2, 3) ); - lims = [ outLims(1, 1) outLims(2, 1) ... - outLims(1, 2) outLims(2, 2) ... - outLims(1, 3) outLims(2, 3) ]; - if (use_c_functions) - % Logicals are not handled in he C++ classes + shifts_op = [outLims(1, :) - 1, shift(4:end)]; + shifts_ip = inLims(1, :) - 1; + dims = outLims(2, :) - outLims(1, :) + 1; + + % Logicals are not handled in the C++ function is_out_logical = islogical(output); if (is_out_logical) output = uint8(output); @@ -90,11 +88,11 @@ function output = gtPlaceSubVolume(output, input, shift, index, assign_op, use_c switch (assign_op) case {'zero', 'conflict', 'adaptive'} % Mark overlapping... - output = internal_gtAssignGrainToVol_interf( output, input, index, lims ); + gtCxxPlaceSubVolumeInterf(output, input, shifts_op, shifts_ip, dims); case 'summed' - output = internal_gtAssignGrainToVol_sum( output, input, index, lims ); + gtCxxPlaceSubVolumeSum(output, input, shifts_op, shifts_ip, dims); case {'assign', 'parent'} - output = internal_gtAssignGrainToVol( output, input, index, lims ); + gtCxxPlaceSubVolumeAssign(output, input, shifts_op, shifts_ip, dims); otherwise error('PLACE:wrong_argument', 'No option for "%s"', assign_op); end @@ -103,6 +101,23 @@ function output = gtPlaceSubVolume(output, input, shift, index, assign_op, use_c output = logical(output); end else + input = input( ... + inLims(1, 1):inLims(2, 1), ... + inLims(1, 2):inLims(2, 2), ... + inLims(1, 3):inLims(2, 3) ); + lims = [ ... + outLims(1, 1), outLims(2, 1), ... + outLims(1, 2), outLims(2, 2), ... + outLims(1, 3), outLims(2, 3) ]; + + % We add one because the shifting is done in matlab code! + extra_dims_shift = arrayfun(@(x){x+1}, shift(4:num_output_dims)); + + full_output = output; + if (~isempty(extra_dims_shift)) + output = full_output(:, :, :, extra_dims_shift{:}); + end + switch (assign_op) case {'zero', 'conflict', 'adaptive'} % Matlab sugars to do the same that 'internal_gtAssignGrainToVol_interf' @@ -128,10 +143,10 @@ function output = gtPlaceSubVolume(output, input, shift, index, assign_op, use_c otherwise error('PLACE:wrong_argument', 'No option for "%s"', assign_op); end - end - if (~isempty(extra_dims_shift)) - full_output(:, :, :, extra_dims_shift{:}) = output; - output = full_output; + if (~isempty(extra_dims_shift)) + full_output(:, :, :, extra_dims_shift{:}) = output; + output = full_output; + end end end -- GitLab