Un problème dont j'avais discuté ici à l'origine a évolué et aurait pu devenir un peu plus simple à mesure que je l'étudiais davantage et obtenais de nouvelles informations.
En bout de ligne, je voudrais pouvoir détecter ce modèle illustré ici, en utilisant des techniques de vision par ordinateur / traitement d'image. Comme vous pouvez le voir, le motif idéal est composé de quatre «pings». La reconnaissance d'objet doit être:
- Invariant de décalage
- Horizontalement, l'image sera cyclique. (c.-à-d. pousser vers la droite, sortir à gauche et vice-versa).
- (Heureusement) Verticalement, ce n'est pas cyclique. (c'est-à-dire, poussez vers le haut ou vers le bas et cela s'arrêtera).
- Échelle invariante (les pings peuvent varier en «épaisseur» comme vous pouvez le voir.)
Je pourrais continuer encore et encore à ce sujet mais j'ai joint des images couvrant ce que je veux dire, veuillez voir ci-dessous:
Bien sûr, ils peuvent également être à une «échelle» différente, comme on peut le voir dans cette famille:
Et enfin, voici quelques scénarios `` réalistes '' de ce que je pourrais réellement recevoir, où il y aurait du bruit, les lignes pourraient `` s'estomper '' lorsque vous vous dirigez vers le bas, et bien sûr, l'image aura beaucoup de lignes parasites, d'artefacts , etc.
Et bien sûr, comme grande finale, il y a la possibilité distincte de ce scénario «extrême»:
Donc, encore une fois, je voudrais demander quelques conseils sur les techniques de vision par ordinateur que je devrais utiliser ici afin de détecter au mieux l'occurrence de mon modèle, où je dois être invariant par décalage et échelle comme vous pouvez le voir, et être également en mesure d'obtenir des résultats décents pour les scénarios réalistes. (La bonne nouvelle est que je n'en ai PAS besoin pour être invariant par rotation). La seule idée que j'ai pu trouver jusqu'à présent est une corrélation 2D.
Je dois ajouter qu'en réalité, je n'ai PAS d'images colorées - je vais juste obtenir un martix de nombres, donc je suppose que nous parlons de «niveaux de gris».
Merci d'avance!
PS Pour ce que ça vaut, je vais probablement utiliser C ouvert V.
EDIT # 1:
Sur la base des commentaires, j'ai ajouté les détails que vous avez demandés ici:
Pour les caractéristiques définissant les données, nous pouvons supposer ce qui suit:
La longueur horizontale de chaque ping peut varier, mais j'en connais les limites supérieures et inférieures. OUI pour tout ce qui se trouve dans cette limite, NON pour tout ce qui se trouve à l'extérieur (Exemple, je sais que la longueur des pings peut être comprise entre 1 et 3 secondes, par exemple).
Tous les pings doivent être «visibles» pour OUI, cependant, la dernière ligne peut être manquante et vous voulez toujours dire «OUI». Sinon NON.
La longueur verticale (l '«épaisseur») de chaque ping peut varier, mais encore une fois, sachez également les limites supérieure et inférieure. (Similaire à ce que vous voyez sur ces images). OUI pour tout ce qui se trouve dans cette limite. NON pour rien à l'extérieur.
La hauteur entre chaque ping doit toujours être la même pour OUI. Si ce n'est pas le cas, alors NON. (Exemple, vous pouvez voir comment tous les pings sont de la même hauteur les uns par rapport aux autres, ~ 110 sur l'axe vertical). Donc, 110 +/- 5 peut être OUI, tout le reste doit être NON.
Je pense que c'est à ce sujet - mais faites-moi savoir quoi d'autre je peux ajouter ... (De plus, tout ce qui est montré ici devrait s'inscrire comme OUI, btw).
detect this pattern shown here
? Êtes-vous simplement intéressé à isoler la ligne rouge / jaune ou voulez-vous réellement une expression qui calcule la relation entre ces lignes. Seules la recherche de lignes ne pouvait nécessiter qu'un certain seuil ou une segmentation. Que voulez-vous vraiment?Réponses:
D'une manière générale, il existe deux approches principales pour résoudre ce problème:
une. correspondance du modèle ou
b. correspondance avec un modèle paramétré.
Personnellement, vu la simplicité du modèle, je préférerais la seconde approche pour ce problème.
Étape 1: identifier les blobs de ping
Dans un premier temps, extrayez les "Boîtes" - essentiellement les carrés jaunes / bleus. Une méthode la plus simple ici pourrait être de simplement seuiller l'image. Il ne semble pas y avoir beaucoup de variations en arrière-plan, sauf que lorsque le bruit augmente, il a tendance à être assez similaire aux pings. Par conséquent, le seuil peut être global à travers l'image - et je pense que vous pourrez obtenir un seuil décent qui fonctionnerait à travers les images. Le seuil, cependant, doit être intelligent afin que vous puissiez utiliser quelque chose comme la méthode d'Otsu. Voir ceci et cela pour plus de référence.
Amélioration des blocs
L'une des bonnes choses que vous pouvez faire pour supprimer les points parasites qui ressemble au ping au premier plan, car certains pixels à l'intérieur des pings sont également bleus. Vous avez besoin ici d'une opération morphologique appelée "Ouverture". Voici l'une des références de HIPR . Ce type d'opérations nécessite une forme intelligente qui permet de conserver des formes similaires et d'en supprimer d'autres. Dans votre cas, vous pouvez choisir des lignes horizontales. À la fin de cela, vous avez des pixels d'arrière-plan et de premier plan séparant proprement les pings sans se toucher.
Étape 2: marquer / enregistrer les blocs
Maintenant que vous avez le plus propre blobs possibles, il est temps de les marquer comme 1,2,3,4 ou A, B, C, D etc. Ceci est généralement accompli par ce qu'on appelle un algorithme simple. Parcourez chaque pixel et s'il touche une région marquée, et est également au premier plan, affectez-le à ce segment, sinon créez-en un nouveau. S'il vous arrive de trouver plus de 4 segments importants, vous devez choisir les plus pertinents. Appliquez ici une heuristique plutôt qu'un algorithme théorique.
Étape 3: Modélisation des paramètres
Maintenant, une fois que nous avons probablement les 4 meilleurs candidats des 4 pings correspondants, vous pouvez identifier les cadres de délimitation - essentiellement les coins supérieur gauche et inférieur droit (ou la plupart des pixels à gauche et à droite, ainsi que les rangées supérieure et inférieure du blob) . Trouvez la boîte englobante, vous pouvez infliger une amende au centre de gravité de chaque boîte de ping.
par conséquent, les distances entre les centroïdes peuvent maintenant être calculées:
Vous avez essentiellement 8 paramètres vecoter:
Étape 4: Classification
Dans la dernière étape, nous devons maintenant avoir une classification, qu'il y ait un ping ou non.
Pour quelque chose comme ça, vous pouvez avoir un joli cadre de classifieur bayésien.
Il y a deux hypothèses que vous avez
D'abord, vous étudiez beaucoup d'images où vous savez qu'elles appartiennent à l'image. Maintenant, vous pouvez tracer divers histogrammes ou appliquer une méthode d'estimation de densité. Lisez la classification des modèles par Duda Hart.
Maintenant, à partir des données de test
Par conséquent, vous pouvez calculer
Vous devez combiner cette expression pour l'expression vectorielle et devez déployer beaucoup d'efforts pour mettre exactement l'estimation des paramètres à faire. Mais je vous laisse ici avec une approche de base.
Veuillez faire vos propres calculs, ce sera long, mais devrait toujours être assez intuitif.
EDITER
Puisque vous définissez déjà les critères spécifiques de 110 +/- 5 pixels, la dernière étape peut être plus simple. Vous n'avez probablement pas tout à fait besoin de calculer toutes ces probabilités si vos critères de classification sont fixes.
la source
Ce problème me semble être le problème de détection + estimation d'intervalle de répétition d'impulsion. Je devrai développer cette réponse au fil du temps, mais le type d'algorithmes qui fonctionnent bien dans ce problème est la probabilité maximale sur un réseau .
la source