Matrix Standard Deviation in 3D neighborhood

2 Ansichten (letzte 30 Tage)
Wajahat
Wajahat am 10 Apr. 2012
Hi
I have a 3D matrix (NxNxM) and I want to compute standard deviation in a sliding window of, say, 3x3xM which means a square window going across all the matrices (or slices) but sliding in 2D only? Can anyone help me on this.
stdfilt() does not do what I want. It computes a 3x3x(odd number) window standard deviation which is perhaps sliding in depth or 3rd dimension as well.
Best Regards
Wajahat

Akzeptierte Antwort

Andrei Bobrov
Andrei Bobrov am 10 Apr. 2012
% I - your 3D matrix - array(NxNxM)
k = padarray(I,[1 1],'symmetric');
s = size(I);
out = zeros(s(1),s(2));
for j1 = 1:size(I,1)
for j2 = 1:size(I,2)
out(j1,j2) = std2(k(j1 + (0:2),j2 + (0:2),:));
end
end

Weitere Antworten (1)

Sean de Wolski
Sean de Wolski am 10 Apr. 2012
stdfilt() will ignore the three-dimensional component if you tell it to:
x3 = stdfilt(repmat(magic(10),[1 1 3]),ones(3,3,1)) %three-d array, all slices equal
x1 = stdfilt(magic(10),ones(3,3,1)) %two-d array
all equal?
all(all(all(bsxfun(@eq,x3,x1))))
  1 Kommentar
Wajahat
Wajahat am 12 Apr. 2012
I do not want to ignore the three dimensional component, I want to include it but I want a 2D array at the end.
As I have understood after the two answers, x3=stdfilt(repmat(magic(10),[1 1 3]), ones(3,3,5));
x3=x3(:,:,1);
will also do the same thing as Andrei Bobrov answer above.
With a window of 5 in depth, stdfilt() will center the window on the first slice and will include all the slices of 3-Slice 3D array while having a 3x3 window in 2D. Window size in depth will be limited by the number of available slices.
The documentation for stdfilt() should also explain how the selected neighborhood or window is placed in 3D.

Melden Sie sich an, um zu kommentieren.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by