J'ai deux bitmaps dans le code (.NET). Je voudrais chercher le petit motif (aiguille) dans la grande image (botte de foin). Comment cela peut-il être fait?Correspond à un motif/une aiguille (de préférence un bitmap) dans une bitmap haystack?
Répondre
Cela dépend si vous effectuez une correspondance "exacte" avec des motifs au niveau du bit ou juste une correspondance d'image approximative (floue). Si vous faites une correspondance exacte, traitez simplement les bitmaps comme une recherche de tableau de données 2D générique.
Une implémentation naïve mais très facile pour la correspondance exacte peut être faite en temps N * M où N est le nombre de pixels dans la meule de foin et M est le nombre de pixels dans l'aiguille. Etant donné que la taille de la botte est (S, T) et que la taille de l'aiguille (U, V), vous pouvez parcourir sur Haystack avec X = [0, S-U) & Y = [0, T-V]. Pour chaque emplacement, vous pouvez regarder un sous-tableau 2D de la même taille que l'aiguille [{X, Y}, {X + U, Y + V}) et le comparer à l'aiguille [{0,0}, { U, V}).
Vous pouvez le faire via Image Registration, bien que je ne connaisse pas une (bonne) bibliothèque .NET utilisable directement pour cela.
Si vous êtes prêt à utiliser C++, le Insight Toolkit a de nombreux outils qui vous aideront à le faire, y compris la possibilité que votre "meule de foin" ne corresponde pas exactement à "l'aiguille" (ex: recherche "floue").
Je ne suis en aucun cas un expert en traitement d'image. Juste en jouant avec une idée hors de ma tête ici :)
Dites que vous regardez une ligne de pixels dans votre aiguille. Cette ligne pourrait fournir une base pour calculer une somme de contrôle pour la ligne donnée, alors appelons-le une empreinte digitale. Vous pouvez maintenant rechercher toutes les lignes horizontales dans la chaîne haystack pour des sous-ensembles de même longueur avec la même somme de contrôle. Une fois que vous avez trouvé vos candidats horizontaux, vous pouvez vérifier chacun pour une correspondance verticale.
Problème avec cet algorithme est clairement la vitesse de celui-ci. C'est O (Effrayant) dans les cas où vous aurez beaucoup de correspondances sur votre empreinte horizontale (par exemple, si vous choisissez la ligne du haut, ce sera tous les noirs - Un motif qui est montré dans la botte de foin), donc en quelque sorte vous devez choisir une empreinte avec un comportement agréable et distinct.
Je suis sûr qu'il ya beaucoup de meilleures façons de le faire, mais je pensais que je partagerais mes pensées :)
Bonne chance
Vous voudrez peut-être regarder « edge detection » générique terme pour ce que vous essayez de faire.
Ces deux liens semblent utiles, mais portent davantage sur l'enregistrement des couleurs que le traitement de l'image:
l'essentiel de ce que vous voulez faire est:
Couper l'image "find" à la taille minimale- Inverser la « trouver » image et veiller à ce que les bords sont aussi propres (avoir des gradients élevés) que possible
- Numérisez l'image « cible » et de détecter tous les bords
- Subdivisez l'image « cible » dans les sections de " trouver "taille (plus une erreur) et seulement prendre les régions où il y a un grand nombre de bords
- Foreach section dans la" cible "XOR l'image" trouver "sur la section (en incrémentant au besoin) et voir si le résultat seuil est inférieur à votre seuil détecté
Ainsi, les bases sont vous clip votre "trouver" l'image, en vert it (pour le XOR plus tard), trouvez tous les bords dans votre image cible puis appliquez la carte XOR à ces régions et trouvez le pourcentage de correspondance le plus élevé.Alternativement, si les images sont assez petites, vous pouvez "glisser" appliquer la même technique, inverser l'image de recherche, et faites-le glisser sur l'image "cible" à la recherche de la correspondance. Le principal problème avec ces techniques est ce qui constitue un "match", il ne sera généralement pas une correspondance de 100% et vous devez avoir du code à traiter lorsque cela se produit.
Si vous avez besoin de faire cela, je recommande de trouver une bibliothèque qui fait déjà cela, comme ce que Reed a suggéré. Si vous voulez rouler le vôtre, passez du temps sur Wikipedia et Codeproject en regardant les bibliothèques de manipulation d'images.
- 1. Dessiner dans un contexte bitmap
- 2. "Coloriser" un bitmap dans .NET
- 3. Copie bitmap dans d'autres bitmap avec WPF
- 4. Lecture de couleurs bitmap bitmap monochrome
- 5. Comment copier une ellipse ou un polygone d'un bitmap vers un autre bitmap
- 6. erreur C2248: « Gdiplus :: Bitmap :: Bitmap »: ne peut pas accéder à un membre privé déclaré dans la classe « Gdiplus :: Bitmap »
- 7. Comment flouter un bitmap (Android)?
- 8. Comment fonctionne un index bitmap?
- 9. actionscript3: comment lisser un bitmap?
- 10. Ouvrir un bitmap avec Inputstream
- 11. La meilleure façon de redimensionner un bitmap dans une vue?
- 12. Charger un bitmap vers un contrôle PictureBox
- 13. Imprimer un bitmap sans imprimer un sprite?
- 14. Comment assigner par programme une image (Bitmap) à un contact?
- 15. Copier un bitmap sur une plus grande Bitmap en utilisant sans utiliser Graphics.DrawImage
- 16. Bitmap transparent
- 17. Bitmap monochrome
- 18. déplacer un chemin avec une image bitmap répétitive dans android
- 19. GDI + exception sauvegarde un bitmap à un MemoryStream
- 20. applications: l'ajout d'une texture bitmap à un élément non rectangulaire
- 21. Texte Rendu sur bitmap
- 22. manipulation de bitmap dans cocos2d?
- 23. Comment copier un plus petit bitmap dans un plus grand?
- 24. Rendu de formulaire à bitmap
- 25. Contrôle de sortie dans Bitmap
- 26. Comment puis-je charger un bitmap généré dans un PictureBox?
- 27. obtenir une petite image bitmap à partir d'un grand bitmap dans android
- 28. Comment dessiner un bitmap avec 50% d'opacité?
- 29. Éditeur de bitmap WPF
- 30. WxWidgets dessiner un bitmap avec l'opacité
Je veux faire une correspondance floue ... Je crois que c'est disponible dans le cadre AForge que j'utilise? – Ropstah
Je n'ai vraiment aucune idée de l'endroit où aller d'avoir deux bitmaps sur la logique floue :) – Ropstah
Eh bien, avec la correspondance floue, voulez-vous à l'échelle/rotation/permettre l'inclinaison? – Adisak