2010-05-30 39 views
1

je suis nouveau sur ce site et voici ma première requête ... i simple besoin coulissant implémentation de l'algorithme de fenêtre en C++ ou Matlab s'il vous plaît aidez-moi à cet égard grâcecomment implémenter algorithme simple fenêtre coulissante dans Matlab ou C++

+2

Pouvez-vous donner un exemple de ce que vous essayez de faire? – tzaman

+1

Une fenêtre glissante est juste une technique générale avec de nombreuses applications différentes - ce n'est pas un algorithme spécifique en tant que tel. Vous aurez besoin d'être plus détaillé sur vos besoins si vous voulez de l'aide avec cela. –

+0

Cher Paul R, vous avez raison je n'ai pas mentionné clairement dans quel but je veux ce code en fait je veux du code pour la fenêtre coulissante pour l'extraction de flux de données. i vous pouvez me aider à cet égard son aide très complet Jonas grâce pour vous aussi comme je l'ai mentionné ici que je dois soumettre mon projet pour « l'extraction de flux de données à base de fenêtre coulissante » intitulée – Zia

Répondre

8

en supposant que vous avez besoin d'une fenêtre coulissante générique pour le traitement d'image, dans Matlab vous pourriez faire:

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

Notez simplement que les boucles dans Matlab sont lentes. Vous feriez mieux d'utiliser certaines des opérations "batch" comme dans la réponse de Jonas. – Amnon

4

Si la fonction est une simple combinaison linéaire de valeurs de pixels dans le quartier, comme une moyenne, vous peut utiliser CONV2 pour faire la convolution. Il existe également des fonctions spécialisées, telles que MEDFILT2 si vous souhaitez prendre la médiane de chaque fenêtre glissante.

Si la fonction que vous souhaitez appliquer à chaque quartier est plus complexe, vous avez deux options:

  1. Si vous avez assez de mémoire, vous pouvez transformer votre image en un large éventail de telle sorte que tous les correspond à la colonne à une fenêtre coulissante en utilisant IM2COL. Ensuite, vous appliquez votre fonction à chaque colonne et remodelez.

  2. Si vous n'avez pas beaucoup de mémoire, utilisez NLFILTER pour appliquer la fonction à chaque fenêtre coulissante.

Dans tous les cas, vous voudrez peut-être jeter un oeil à PADARRAY votre image à pad avant d'exécuter la convolution pour éviter le rétrécissement de votre image tout en réduisant les effets frontières.

+0

Bonne observation concernant les effets de bordure. – jasonmp85

+0

merci mais mon application concerne l'exploitation de flux de données – Zia

2

Que diriez-vous quelque chose comme ça pour C++, le code ci-dessous BTW a été écrit pour 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; 
}