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

时间:2009-03-25 14:36:13

标签: matlab image-processing function

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

1 个答案:

答案 0 :(得分: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部分here)。所以最后两行可以改为:

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