2011-01-24 1 views
4

J'ai travaillé sur une webapp. Je suis resté coincé ici dans un problème problématique. Je vais essayer d'expliquer ce que j'essaie de faire. ici vous voyez la première grande image qui a des formes vertes dedans. ce que je veux faire est de recadrer ces formes dans différents fichiers png et rendre leur arrière-plan transparent comme les images recadrées d'exemple ci-dessous le grand.comment détecter les blobs et les recadrer dans les fichiers png?

Main image the input

Cropped 1.

Cropped 2.

Cropped 3.

La première image sera téléchargé par l'utilisateur et je veux recadrer en morceaux comme dans l'exemple des images rognée above.it peut être fait avec la bibliothèque GD de php ou par un logiciel côté serveur écrit en python ou C#. mais je ne sais pas ce que cette opération a appelé donc je ne sais pas quoi google pour trouver des informations. c'est quelque chose à voir avec la vision par ordinateur détecter des blobs et les recadrer en morceaux etc. des mots-clés, des liens seraient utiles.

merci pour aide les

+0

Attendez-vous à quelque chose de difficile :) – orlp

+1

c'est bon :) im va étudier dur :) –

Répondre

4

Opencv fournit une fonction nommée cv::findContours pour rechercher les composants connectés dans une image. Si c'est toujours vert vs blanc, vous voulez cv::split l'image dans les canaux, utilisez cv::threshold sur le bleu ou le canal rouge (ceux-ci seront blancs dans les régions blanches et près de noir dans la région verte) avec THRESH_BINARY_INV (parce que vous voulez extraire les régions sombres), puis utilisez cv::findContours pour détecter les blobs. Vous pouvez ensuite calculer le rectangle de délimitation avec cv::boundingRect, créer une nouvelle image de cette taille et utiliser le contour obtenu en tant que masque pour remplir la nouvelle image.

Remarque: Il s'agit de liens vers la documentation C++, mais ces fonctions doivent être exposées dans les wrappers python et C# - voir http://www.emgu.com pour ce dernier.

+0

yep fond sera toujours blanc, mais les formes ne seront pas toujours être unicolore –

+0

C'est bon, alors vous pourriez convertir en niveaux de gris et faire le seuil sur cette image. – etarion

5

Une façon vraiment facile Pour ce faire, il faut utiliser Flood Fill/Connected Component Labeling.Ce serait simplement utiliser un algorithme glouton en regroupant tous les pixels de même couleur ou de couleur similaire

Ce n'est certainement pas le moyen idéal pour détecter les blobs et ne sera efficace que dans des situations limitées. Cependant, il est beaucoup plus facile à comprendre et à coder et pourrait suffire à vos fins.

+0

merci pour l'aide :) je vais commencer à étudier dès que possible sur ces articles :) –

1

Cela dépend vraiment du type d'images que vous allez traiter. Comme Brian l'a mentionné, vous pouvez utiliser l'étiquetage des composants connectés, qui est généralement appliqué aux images binaires, où le premier plan est indiqué par des pixels blancs et l'arrière-plan par des pixels noirs (ou l'inverse). Le problème est alors de savoir comment transformer l'image originale en une image binaire. Si toutes les images ressemblent à l'exemple que vous avez fourni, ceci est simple et peut être accompli avec un seuillage.OpenCV fournit des procédés utiles:

Pour des images plus complexes, toutefois, tous les paris sont éteints

Questions connexes