如何在Matlab或C ++中实现简单的滑动窗口算法

时间:2010-05-30 09:01:46

标签: c++ matlab visual-c++ window sliding

我是这个网站的新人,这是我的第一个查询...... 我需要在c ++或matlab中实现简单的滑动窗口算法 请在这方面帮助我  感谢

3 个答案:

答案 0 :(得分:8)

假设你需要一个通用的滑动窗口进行图像处理,你可以在Matlab中做到:

image = imread('image.png');
imageWidth = size(image, 2);
imageHeight = size(image, 1);

windowWidth = 32;
windowHeight = 32;

for j = 1:imageHeight - windowHeight + 1
    for i = 1:imageWidth - windowWidth + 1
        window = image(j:j + windowHeight - 1, i:i + windowWidth - 1, :);
        % do stuff with subimage
    end
end

答案 1 :(得分:4)

如果函数是邻域中像素值的简单线性组合,例如平均值,则可以使用CONV2进行卷积。如果你想获取每个滑动窗口的中位数,还有一些专门的函数,例如MEDFILT2

如果要应用于每个社区的功能更复杂,您有两种选择:

  1. 如果你有足够的内存,你可以将图像转换为一个大的数组,这样每个列对应一个使用IM2COL的滑动窗口。然后将函数应用于每一列并重新整形。

  2. 如果您没有那么多内存,请使用NLFILTER将该功能应用于每个滑动窗口。

  3. 在任何情况下,您可能需要先查看PADARRAY以在运行卷积之前填充图像,以避免缩小图像,同时减少边框效果。

答案 2 :(得分:2)

对于C ++来说,这样的事情怎么样,顺便说一句下面的代码是为OpenCV编写的

vector<Rect> get_sliding_windows(Mat& image,int winWidth,int winHeight)
{
  vector<Rect> rects;
  int step = 16;
  for(int i=0;i<image.rows;i+=step)
  {
      if((i+winHeight)>image.rows){break;}
      for(int j=0;j< image.cols;j+=step)    
      {
          if((j+winWidth)>image.cols){break;}
          Rect rect(j,i,winWidth,winHeight);
          rects.push_back(rect);
      }
  } 
  return rects;
}