2009-12-21 4 views

Répondre

1

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}).

+0

Je veux faire une correspondance floue ... Je crois que c'est disponible dans le cadre AForge que j'utilise? – Ropstah

+0

Je n'ai vraiment aucune idée de l'endroit où aller d'avoir deux bitmaps sur la logique floue :) – Ropstah

+0

Eh bien, avec la correspondance floue, voulez-vous à l'échelle/rotation/permettre l'inclinaison? – Adisak

0

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").

0

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

1

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:

  1. Codeproject: Edge Detection
  2. Edge Detection in C#

l'essentiel de ce que vous voulez faire est:

Couper l'image "find" à la taille minimale
  1. Inverser la « trouver » image et veiller à ce que les bords sont aussi propres (avoir des gradients élevés) que possible
  2. Numérisez l'image « cible » et de détecter tous les bords
  3. 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
  4. 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.

Questions connexes