代码之家  ›  专栏  ›  技术社区  ›  Sundar R

如何在Matlab中将移动窗口应用于二维矩阵?

  •  8
  • Sundar R  · 技术社区  · 17 年前

    我正在用matlab从图像中提取特征。 为此,我必须在nxn窗口上应用许多函数(例如查找每个3x3窗口的差异等)。
    在matlab中,除了循环遍历矩阵和每次收集窗口元素之外,是否有一种简单而有效的方法可以做到这一点?
    对于某些功能,我已经能够找到一个等效的遮罩,并使用filter2应用它们,但对于许多其他功能,我似乎没有这样的奢侈(一个很好的例子:3x3窗口的中值)。
    我想要的是什么 喜欢 arrayfun,但它适用于nxn窗口,而不是单个元素。
    谢谢,
    森达尔

    1 回复  |  直到 12 年前
        1
  •  5
  •   Azim J    13 年前

    如果您有图像处理工具箱,则可以使用 布莱克普罗克 加工 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的图像处理工具箱开始, 布莱克普罗克 已被删除并替换为 闭锁过程 (参见R2099B章节 here )所以最后两行可以改为:

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