【问题标题】:How to apply moving windows to a 2D matrix in MATLAB?如何在 MATLAB 中将移动窗口应用于二维矩阵?
【发布时间】:2010-10-15 11:25:14
【问题描述】:

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

【问题讨论】:

  • 如果您可以更新问题并列出您想要应用于窗口元素的特定操作,这可能会有所帮助。可能有办法将它们全部变成面罩/过滤器元素,用于 FILTER2(或可能是 CONV2)。
  • 你有图片处理工具箱吗?

标签: matlab image-processing function


【解决方案1】:

如果您有图像处理工具箱,那么您可以使用 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);

【讨论】:

  • 谢谢,我确实有图像处理工具箱,这正是我所需要的。
  • 此功能的帮助将我指向“colfilt”。事实证明,带有“滑动”窗口的 colfilt 让我的工作更加轻松。感谢您向我开放这个新的函数数组。
  • 不错的收获,阿齐姆。我完全忘记了 BLKPROC。
  • blkproc 已被 blockproc 取代。您能否更新您的答案以使用 blockproc?
  • @Evan 我没有意识到 blkproc 在 2009b 中被贬低了。感谢您的提醒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 2013-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多