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

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

如果您能更新问题并列出要应用于窗口元素的特定操作,这可能会有所帮助。可能有将它们全部转换为用于FILTER2(或可能是CONV2)的掩码/滤波器元素的方法。 - gnovice
你有图像处理工具箱吗? - Azim J
1个回答

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

注意:

从MATLAB 2009b的图像处理工具箱开始,blkproc被弃用,取而代之的是blockproc(详见R2099b部分这里)。因此,最后两行可以改为:

 myAveFun = @(blkstrct) ones(size(blkstrct.data))*mean(blkstrct.data(:))
 Ip = blockproc(II,blockSize,myAveFun);

谢谢,我已经有图像处理工具箱了,这正是我所需要的。 - Sundar R
这个函数的帮助指向了'colfilt'。结果发现,使用一个'sliding'窗口的colfilt使我的工作更加容易。感谢为我打开了这个新的函数数组。 - Sundar R
不错,Azim。我完全忘记了BLKPROC。 - gnovice
blkproc已被blockproc替换。您能否更新您的答案以使用blockproc? - Evan Kroske
@Evan,我没有意识到blkproc在2009b中已经被弃用了。谢谢你提醒我。 - Azim J

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接