2010-06-09 12 views
6

Je cherche à faire une soustraction d'arrière-plan sur une image. Je suis nouveau à MATLAB et nouveau pour le traitement/analyse d'image, donc désolé si tout cela semble stupide. 1) Autre que imsubtract() y a-t-il d'autres façons de faire de la soustraction en arrière-plan (en plus de comparer une image à une autre)? 2) Dans les travaux mathématiques explanation pour imsubtract(), pourquoi font-ils de leur élément structurant un disque? Cela semble assez difficile à ce jour parce que chaque fois que j'essaie quelque chose, je finis non seulement de retrancher le fond bruyant mais aussi de perdre les parties de l'image que je veux regarder!Soustraction d'arrière-plan dans MATLAB

Répondre

5

Avec quel type d'image travaillez-vous?

Fond La soustraction est facile. Si vous voulez soustraire une valeur constante, ou un fond avec la même taille que votre image, vous écrivez simplement img = img - background. imsubtract vérifie simplement que la sortie est zéro partout où l'arrière-plan est plus grand que l'image.

Contexte estimation est difficile. Là, vous devez savoir quel type d'image vous regardez, sinon, l'estimation de fond échouera. Si vous avez, par exemple, des fonctions ponctuelles ou linéaires sombres ou claires sur fond sombre, vous pouvez utiliser un filtre maximum local (imdilate) ou un filtre local minimum (imerode), respectivement , c'est plus grand que vos caractéristiques, de sorte que partout où vous placez le masque de filtre, il y a quelques pixels qui couvrent l'arrière-plan. En outre, vous souhaitez que le filtre ait une forme similaire aux fonctionnalités. Dans votre cas, si vous perdez une partie de votre image, vous pouvez essayer de rendre le filtre plus grand (mais pas trop grand). Au lieu de soustraire le maximum ou le minimum, soustraire la médiane peut bien fonctionner, mais vous devez choisir la taille du filtre de façon à ce qu'il y ait généralement une majorité de pixels de fond dans le masque de filtre. Malheureusement, le filtrage médian est plutôt lent.

+0

+1 L'estimation de l'arrière-plan est difficile! – Geoff

+0

La soustraction d'arrière-plan est un peu différente de ce que vous avez suggéré. L'imsubstract n'est pas une soustraction de fond, ni ce que vous avez suggéré. La soustraction d'arrière-plan ne doit affecter que les pixels de l'arrière-plan et non l'image entière. Considérez un fond blanc. Maintenant, une boule noire se déplace à travers l'image. La soustraction d'image occlut toujours l'objet ou déforme la couleur (en fonction de l'implémentation), alors que la soustraction d'arrière-plan ne doit pas affecter les pixels suffisamment différents du modèle d'arrière-plan (premier plan). – Anthony

+0

@Anthony: Cela dépend beaucoup du type d'image avec lequel vous travaillez. Si les intensités de premier plan et d'arrière-plan sont additives (ce que je travaille habituellement), alors le fond est soustrait de l'image entière. Dans votre cas, la soustraction de fond ne devrait affecter que les pixels non-signal. – Jonas

2

Pour soustraire l'image d'arrière-plan, vous avez besoin d'un modèle de l'arrière-plan. Le modèle le plus simple est une image capturée en arrière-plan avec un écart admissible (+/- 0-255). Ensuite, la soustraction d'arrière-plan dans MATLAB est assez simple:

image (trouver (abs (image-arrière-plan) = seuil)) = 0;

Cela devient plus difficile lorsque vous utilisez un modèle statistique, mais essentiellement soustraire l'arrière-plan est assez facile. imsubtract n'est PAS une soustraction d'arrière-plan; c'est un filtre de soustraction comme vous le trouverez dans photoshop. Il ne se soucie pas de l'arrière-plan par rapport à l'avant-plan, qui défait alors le point.

Puisque la soustraction d'arrière-plan elle-même est assez facile, la question devient plus sur l'estimation de fond. Ceci est un peu plus compliqué, et nécessite généralement plus de cadres et de formation pour construire des modèles statistiques de l'arrière-plan (par exemple, regarder les pixels comme des distributions gaussiennes ou des mélanges de gaussiennes, ou regarder plutôt le flux optique pour déterminer ce qui ne bouge pas). Si vous avez accès à des articles techniques (via le travail ou l'école), "Pfinder: le suivi en temps réel du corps humain" par Wren et d'autres donne une approche assez simple. Ou vous pouvez simplement rechercher google pour la soustraction de fond gaussien unique. Il y a un certain nombre de méthodes implémentées avec OpenCV ici ->http://dparks.wikidot.com/source-code < - que vous pourriez trouver utile.

2

Le Computer Vision System Toolbox a l'objet vision.ForegroundDetector, qui implémente une variante de la soustraction de fond GMM de Stauffer et Grimson. La mise en œuvre est très rapide, tirant parti de plusieurs cœurs. Découvrez ce example sur la façon d'utiliser la soustraction de fond en tant que bloc de construction d'un système de suivi de plusieurs objets.