J'ai besoin de trouver les carrés dans une image en utilisant OpenCV (pas de problème dans matlab ou autre, généralement ce que j'attends sont quelques idées).
Considérez l'image de test ci-dessous:
J'ai besoin de trouver ces carrés colorés dans l'image ci-dessus avec précision (pas les longues bandes blanches).
Ce que j'ai fait :
J'ai appliqué la méthode commune (fournie avec les échantillons OpenCV), c'est-à-dire trouver des contours dans tous les plans de couleurs, l'approcher et vérifier le nombre d'éléments = 4. Cela fonctionne dans une certaine mesure, car peu de carrés sont détectés, en particulier les plus sombres.
La prochaine étape que j'ai faite était la prédiction . c'est-à - dire que cet arrangement est fixe . Donc, si certains sont obtenus, je peux prédire ceux qui restent. Cela a également fonctionné dans une plus grande mesure. Mais la précision était très mauvaise.
Mais j'estime que la prédiction n'est pas une bonne méthode ici et qu'elle ne fournit pas toujours des réponses précises, comme indiqué dans la première étape.
Ce dont j'ai besoin :
1) Existe-t-il d'autres méthodes plus efficaces pour détecter ces carrés plus précisément? Ou plusieurs méthodes?
Un point important est que le temps n’est pas un problème ici . L'algorithme peut être lent, peu importe. Mais la précision est le critère principal.
Parfois, les images peuvent être beaucoup plus floues.
Et l'un des principaux problèmes auquel j'ai été confronté est que certaines cases ont une couleur presque similaire à celle de l'arrière-plan (voir colonne 3 des première et deuxième cases).
À la recherche d'idées, merci d'avance
MISE À JOUR :
Ci-dessous le résultat précis maximum que j'ai obtenu:
Bien sûr, l'image résultante est un peu redimensionnée.
MISE À JOUR 2:
J'ai donné une solution bien meilleure dans ma réponse ci-dessous: https://dsp.stackexchange.com/a/7526/818
la source
Réponses:
Une première tentative avec Matlab:
Résultats dans les régions suivantes:
Comme vous pouvez le constater, la sélection du seuil entraînant le plus grand nombre de régions (T = 120) donnerait déjà 7 emplacements corrects, certains emplacements fusionnés, un faux positif et deux faux négatifs.
C'était une tentative assez simple mais je pense que cela montre que l'approche fonctionne. Ajouter des éléments pour séparer des régions allongées ou le faire séparément pour chaque canal de couleur ne sont que quelques-unes des choses que vous pouvez faire pour améliorer ceci.
Il serait également utile de fournir quelques images de test supplémentaires.
la source
J'avais essayé autre chose pour améliorer mon résultat en question. La solution ci-dessous repose sur l'hypothèse que le premier carré (orange) est toujours détecté à l'étape 1. Et c'est pratique en raison de sa couleur contrastée par rapport à l'arrière-plan. Même le résultat que j'ai montré en question l'a bien détecté
Étape 1: Trouver autant de carrés que possible
J'ai divisé l'image en plans R, V, B, H, S, V et seuillé l'image pour différentes valeurs de seuil, telles que des multiples de 25. Pour chaque image, j'ai trouvé des carrés et les ai placées sur une "image de masque" . J'ai aussi trouvé la hauteur et la largeur moyennes du carré.
image du masque (Total 7/12 carrés détectés):
Étape 2: Former une grille de carrés
Ensuite, j'ai trouvé les centroïdes de ces carrés dans l'image du masque. Trié et trouvé le centroïde du premier carré (orange). Une analyse minutieuse montre que l’écart entre deux carrés est un carré horizontal et vertical. Donc, de cette façon, j'ai créé une grille de carrés comme ci-dessous et je l' ai appelé ideal_squares (ce n'est qu'un nom, cela ne signifie pas que c'est le résultat dont j'ai besoin):
ideal_squares:
Étape 3: remappez l'ideal_image
Nous avons maintenant les centroïdes ideal_squares et les centroïdes originaux. J'ai trouvé les correspondances correctes pour chaque centre d'origine original de ideal_centroids (en prenant une distance euclidienne entre eux). Ensuite, j'ai utilisé Scipy interpolate.griddata pour l'interpolation et remappé ideal_image en fonction des valeurs centroïdes (c'est presque pareil que le warping effectué dans ces questions et réponses: comment supprimer les défauts de convexité dans le sudoku et la transformation d'image dans OpenCV ). Voici ci-dessous le résultat obtenu:
Sortie:
Étape 4: OU opérer au-dessus de la sortie avec une image de masque de la première étape
Maintenant, vous pouvez voir que tous les carrés sont détectés, mais avec un problème mentionné ci-dessous:
Problème:
Regardez le résultat de l'étape 3, c.-à-d. L'image remappée de la grille carrée. Sauf deux carrés centraux, tous les autres carrés sont coupés. C'est un problème associé à ce remappage. Je ne sais pas trop où est le problème, avec scipy.interpolate.griddata () ou cv2.remap (). Je pensais que toute l'image serait déformée, mais ce n'est pas le cas. Cela déforme uniquement l'image à l'intérieur des centroïdes que nous avons donnés. Si je peux corriger cela, le résultat sera OK.
Donc, si quelqu'un connaît une bonne idée pour cela, bienvenue !!!
la source
Remarque: cette méthode va être très lente.
Générez un masque qui ressemble aux contours d'un objet idéal. Semblable à ceci:
puis faites glisser (position, échelle, rotation) le masque sur l’image et adaptez-le au contour de l’image réelle (peut-être un peu flou pour obtenir une réponse plus douce) pour calculer leur similarité, la (position, échelle, rotation) avec la réponse de similarité la plus élevée devrait être la (position, échelle, rotation) de l'objet réel.
La méthode ne dérange pas les carrés se fondant dans l’arrière-plan, ni même les occlusions partielles de l’objet, puisqu’elle considère l’objet entier.
J'ai personnellement utilisé cette méthode avec succès pour suivre un museau de souris et des moustaches, mais j'avais certaines présomptions comme si elle était proche de la dernière position connue, etc. Mais je pense que vous pouvez réduire l'espace de recherche en appliquant certaines hypothèses telles que: tailles possibles de l'objet dans la caméra, à quelle distance du centre il peut être ou rotation <10degrés etc.
la source
Étape 1: Quelle que soit l'image binaire finale obtenue en analysant les plans B, G, R, H, S et V, effectuez un algorithme de comptage de tâches en fonction de cette image.
Étape 2: Trouvez le plus gros blob sur la base de la surface ou de la longueur du contour. Puisque vos taches seront principalement de type parallélogramme, donc zone ou contour, n'importe qui le fera.
Etape 3: Avec la plus grosse goutte (la plus grosse étant la meilleure ressemblant à vos carrés du monde réel), essayez de trouver l'orientation de la goutte ... ceci vous permet d'obtenir un rectangle parfaitement ajusté OU vous pouvez obtenir les angles. ... obtenir la pente des lignes qui les rejoignent (à la fois dans l’horizon et dans le sens vertical).
Étape 4: Une fois que vous avez obtenu les deux pentes, tracez deux lignes traversant l’axe de la goutte. pour l'axe, vous pouvez faire la moyenne des points d'angle ou vous pouvez utiliser le centre de gravité (centre de masse) ... Je voudrais utiliser la moyenne des points d'angle ...
Étape 5: Étant donné que dans chaque direction horizontale et verticale, l’espacement est égal (idéalement, les espacements horizontal et vertical le sont également car ils proviennent de votre image carrée idéale, mais nous ne le supposerons pas ..), il vous suffit de localiser les centroïdes possibles de l’autre parallélogrammes
RÉSULTAT INFÉRIEUR: Si un carré est détecté à la perfection, vous pouvez créer l’ensemble de la grille. Il suffit de garder les centres de marquage à un intervalle de 2H (H = largeur horizontale de la plus grande goutte) le long de l'axe horizontal de la plus grande goutte et à un intervalle de 2V (V = hauteur verticale de la plus grande goutte) verticalement le long de l'axe vertical de la goutte.
Quelques photos à soutenir
la source
Je ne sais pas vraiment quel genre de prédiction vous avez fait auparavant, mais avez-vous essayé de vous concentrer sur les longues bandes blanches en tant que racine. Ensuite (si 3 colonnes de carrés sont de taille égale), vous pouvez détecter la hauteur d’un carré (distance entre les deux bandes) et les zones max et min (hauteur et largeur) de l’image.
Ensuite, essayez de détecter la couleur la plus commune à l’intérieur de votre carré et réglez-la sur une zone "non carrée". Le reste est censé être les carrés que vous recherchez.
la source
Je suggérerais d'utiliser la transformée de Hough, qui est un algorithme très robuste pour trouver des formes paramétriques simples, telles que des lignes, des cercles, etc. La détection de lignes serait préférable dans votre cas. Vous pourriez au moins trouver les côtés des longues sripes blanches; ensuite, avec n'importe quel algorithme d'extraction de coin (Harris ou peut-être même SIFT ou SURF), vous pouvez trouver des coins le long de ces lignes, même en utilisant le fait que les carrés sont à peu près équidistants.
la source
J'ai essayé ce problème en utilisant opencv, python. L'approche consiste à masquer une image en fonction des couleurs, puis à rechercher les contours appropriés.
Code: https://github.com/rbhambriiit/computer_vision/blob/master/find_color_box
[Oublié 1 case mais cela devrait venir en réglant la fonction de masquage]
la source