ordfilt3D.m 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. function [Vr] = ordfilt3D(V0,ord,padoption);
  2. % ordfilt3D: Perform 3-D order-statistic filtering on 26 neighbors
  3. %
  4. % [Vr] = ordfilt3D(V0,ord,padoption)
  5. % use 26 neighbors
  6. % ord = 14 <=> median filtering
  7. % ord = 1 <=> min
  8. % ord = [1 27] <=> [min max]
  9. % padoption: same as in padarray
  10. %
  11. % Olivier Salvado, Case Western Reserve University, 16Aug04
  12. if ~exist('padoption','var')
  13. padoption = 'replicate';
  14. end
  15. %%
  16. % special care for uint8
  17. if isa(V0,'uint8')
  18. V = uint8(padarray(V0,[1 1 1],padoption));
  19. S = size(V);
  20. Vn = uint8(zeros(S(1),S(2),S(3),26)); % all the neighbor
  21. else
  22. V = single(padarray(V0,[1 1 1],padoption));
  23. S = size(V);
  24. Vn = single(zeros(S(1),S(2),S(3),26)); % all the neighbor
  25. end
  26. %%
  27. % build the neighboord
  28. Vn(:,:,:,1) = V;
  29. i = 1:S(1); ip1 = [i(2:end) i(end)]; im1 = [i(1) i(1:end-1)];
  30. j = 1:S(2); jp1 = [j(2:end) j(end)]; jm1 = [j(1) j(1:end-1)];
  31. k = 1:S(3); kp1 = [k(2:end) k(end)]; km1 = [k(1) k(1:end-1)];
  32. %%
  33. % left
  34. Vn(:,:,:,2) = V(im1 ,jm1 ,km1);
  35. Vn(:,:,:,3) = V(im1 ,j ,km1);
  36. Vn(:,:,:,4) = V(im1 ,jp1 ,km1);
  37. Vn(:,:,:,5) = V(im1 ,jm1 ,k);
  38. Vn(:,:,:,6) = V(im1 ,j ,k);
  39. Vn(:,:,:,7) = V(im1 ,jp1 ,k);
  40. Vn(:,:,:,8) = V(im1 ,jm1 ,kp1);
  41. Vn(:,:,:,9) = V(im1 ,j ,kp1);
  42. Vn(:,:,:,10) = V(im1 ,jp1 ,kp1);
  43. %%
  44. % right
  45. Vn(:,:,:,11) = V(ip1 ,jm1 ,km1);
  46. Vn(:,:,:,12) = V(ip1 ,j ,km1);
  47. Vn(:,:,:,13) = V(ip1 ,jp1 ,km1);
  48. Vn(:,:,:,14) = V(ip1 ,jm1 ,k);
  49. Vn(:,:,:,15) = V(ip1 ,j ,k);
  50. Vn(:,:,:,16) = V(ip1 ,jp1 ,k);
  51. Vn(:,:,:,17) = V(ip1 ,jm1 ,kp1);
  52. Vn(:,:,:,18) = V(ip1 ,j ,kp1);
  53. Vn(:,:,:,19) = V(ip1 ,jp1 ,kp1);
  54. %%
  55. % top
  56. Vn(:,:,:,20) = V(i ,jm1 ,kp1);
  57. Vn(:,:,:,21) = V(i ,j ,kp1);
  58. Vn(:,:,:,22) = V(i ,jp1 ,kp1);
  59. %%
  60. % bottom
  61. Vn(:,:,:,23) = V(i ,jm1 ,km1);
  62. Vn(:,:,:,24) = V(i ,j ,km1);
  63. Vn(:,:,:,25) = V(i ,jp1 ,km1);
  64. %%
  65. % front
  66. Vn(:,:,:,26) = V(i ,jp1 ,k);
  67. %%
  68. % back
  69. Vn(:,:,:,27) = V(i ,jm1 ,k);
  70. %%
  71. % perform the processing
  72. Vn = sort(Vn,4);
  73. Vr = Vn(:,:,:,ord);
  74. %%
  75. % remove padding on the 3 first dimensions
  76. Vr = Vr(2:end-1,2:end-1,2:end-1,:);