ordfilt3: Performs 3D order-statistic filtering on 3D volumetric data.
The memory and computational overhead for such an operation can be extremely demanding. Here - memory efficiency has been achieved with a recursive-split algorithm, allowing for far larger volumes and/or window sizes to be processed than if the order statistics were to be attempted directly. The basic operation is fairly simple - the volume is recursively split into 8 even sub-blocks, until sub-blocks are reached that are small enough for the filter to be computed with a single call (i.e. when there is enough free contiguous memory to process the entire sub-block) The intermediate results are propagated back up the call stack which then fill output matrix (V_ord)
[V_ord] = ordfilt3(V0,ord,winSize,pad_opts)
V0: Numeric 3D volume. Supports all numeric classes
ord: Speficies which order statistic to return.
This can be a string, or a number 1<=ord<=winSize^3
ord = 'min' returns the minimum window value (same as ord = 1)
ord = 'max' returns the maximum window value (same as ord = winSize^3)
ord = 'med' returns the median window value
winSize: Size of filter window. Currently, only cubic windows are permitted, whose
Length=Width=Height = winSize. This must be odd.
pad_opts: same as defined in 'padarray' (optional)
V_ord - Order Statistic
By calling [V_ord] = ordfilt3(V0,ord,3,pad_opts), this code computes the 26-neighbourhood order statistic filter, which is the same as outputted by Olivier Salvado's implementation (but which is non-splitting, and uses a fixed 3*3*3 window.)
Great! almost 40% faster than medfilt3. Following Matthias's memory suggestion, an alternative for other platforms is largestmemblock http://www.mathworks.com/matlabcentral/fileexchange/25725-largest-memory-block-available-all-platforms
Note: You do need to modify that function in order to actually return the value.
I suggest a couple of minor changes :
1) Insert the following two lines after line 50 to get reasonable default values :
if (nargin < 3) winSize = 3; end;
if (nargin < 2) ord = 'med'; end;
2) Replace M = feature('memstats'); (which only works on Windows) with
M = feature('memstats');
M = 10^28; % or however many bytes of free space you figure your machine will have
Very useful. I like the display of memory allocation. Is there a 3D median filter where the user can set unequal window sizes along the 3 directions?
Detailed function description uploaded
Header comments updated