如何在MATLAB中将移动窗口应用于2D矩阵?

sun*_*ica 8 matlab function image-processing

我正在使用Matlab中的图像进行特征提取.为此必须在nXn窗口上应用许多函数(例如在每个3X3窗口上找到方差等等.
除了在矩阵上循环并收集窗口之外,在Matlab中有一种简单有效的方法吗?每次元素?
对于某些函数,我已经能够找到一个等效的掩码并使用filter2应用它们,但对于其他许多我似乎没有这么奢侈(一个很好的例子:3X3窗口的中位数).
我想要的是 arrayfun,但适用于nXn窗口,而不是单个元素.
谢谢,
Sundar

Azi*_*zim 5

如果您有图像处理工具箱,则可以使用blkproc使用自定义函数处理图像的nxm块.这是一个例子

function Ip = imageProcessed(II,blockSize)
   % FUNCTION imageProcessed calculates average value of blocks of size nxm
   % blocks 
      if nargin<2,
         % default/example value for block size
         blockSize = [3 4];
      end

      if size(II,3)>1,
          % blkproc requires a grayscale image
          % convert II to gray scale if it is RGB.
          II=rgb2gray(II)
      end


      % Custom average function.
      myAveFun = @(x) ones(size(x))*sum(x(:))/length(x(:));

      % use blkproc to process image
      Ip = blkproc(II,[blockSize(1), blockSize(2)],myAveFun);
end
Run Code Online (Sandbox Code Playgroud)

注意:

从MATLAB 2009b的图像处理工具箱开始,将blkproc分离并替换为 blockproc(参见此处的 R2099b部分).所以最后两行可以改为:

 myAveFun = @(blkstrct) ones(size(blkstrct.data))*mean(blkstrct.data(:))
 Ip = blockproc(II,blockSize,myAveFun);
Run Code Online (Sandbox Code Playgroud)