0

私はこのサイトの初心者で、これが私の最初のクエリです... C ++またはmatlabでの単純なスライディングウィンドウアルゴリズムの実装が必要ですこの点で私を助けてくださいありがとう

4

3 に答える 3

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
于 2010-05-30T10:58:20.173 に答える
4

関数が平均など、近傍のピクセル値の単純な線形結合である場合は、CONV2を使用して畳み込みを行うことができます。各スライディング ウィンドウの中央値を取得する場合は、 MEDFILT2などの特殊な関数もあります。

各近傍に適用する関数がより複雑な場合は、次の 2 つのオプションがあります。

  1. 十分なメモリがある場合は、IM2COLを使用して、すべての列が 1 つのスライディング ウィンドウに対応するように、イメージを大きな配列に変換できます。次に、関数をすべての列に適用して形状を変更します。

  2. メモリがあまりない場合は、NLFILTERを使用して各スライディング ウィンドウに関数を適用します。

いずれにせよ、境界効果を減らしながら画像の縮小を避けるために、たたみ込みを実行する前に、 PADARRAYを見て画像をパディングすることをお勧めします。

于 2010-05-30T13:18:32.103 に答える
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;
}
于 2012-11-20T03:10:23.373 に答える