blur.m 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. % RES = blur(IM, LEVELS, FILT)
  2. %
  3. % Blur an image, by filtering and downsampling LEVELS times
  4. % (default=1), followed by upsampling and filtering LEVELS times. The
  5. % blurring is done with filter kernel specified by FILT (default =
  6. % 'binom5'), which can be a string (to be passed to namedFilter), a
  7. % vector (applied separably as a 1D convolution kernel in X and Y), or
  8. % a matrix (applied as a 2D convolution kernel). The downsampling is
  9. % always by 2 in each direction.
  10. % Eero Simoncelli, 3/04.
  11. function res = blur(im, nlevs, filt)
  12. %------------------------------------------------------------
  13. %% OPTIONAL ARGS:
  14. if (exist('nlevs') ~= 1)
  15. nlevs = 1;
  16. end
  17. if (exist('filt') ~= 1)
  18. filt = 'binom5';
  19. end
  20. %------------------------------------------------------------
  21. if isstr(filt)
  22. filt = namedFilter(filt);
  23. end
  24. filt = filt/sum(filt(:));
  25. if nlevs > 0
  26. if (any(size(im)==1))
  27. if (~any(size(filt)==1))
  28. error('Cant apply 2D filter to 1D signal');
  29. end
  30. if (size(im,2)==1)
  31. filt = filt(:);
  32. else
  33. filt = filt(:)';
  34. end
  35. in = corrDn(im,filt,'reflect1',(size(im)~=1)+1);
  36. out = blur(in, nlevs-1, filt);
  37. res = upConv(out, filt, 'reflect1', (size(im)~=1)+1, [1 1], size(im));
  38. elseif (any(size(filt)==1))
  39. filt = filt(:);
  40. in = corrDn(im,filt,'reflect1',[2 1]);
  41. in = corrDn(in,filt','reflect1',[1 2]);
  42. out = blur(in, nlevs-1, filt);
  43. res = upConv(out, filt', 'reflect1', [1 2], [1 1], [size(out,1),size(im,2)]);
  44. res = upConv(res, filt, 'reflect1', [2 1], [1 1], size(im));
  45. else
  46. in = corrDn(im,filt,'reflect1',[2 2]);
  47. out = blur(in, nlevs-1, filt);
  48. res = upConv(out, filt, 'reflect1', [2 2], [1 1], size(im));
  49. end
  50. else
  51. res = im;
  52. end