Recherche de carrés dans l'image

34

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:

entrez la description de l'image ici

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:

entrez la description de l'image ici

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

Abid Rahman K
la source
ton fond est-il toujours blanchâtre?
1
Mon idée était de calculer la "saturation" et le seuil de sat img, mais en utilisant votre exemple, cela ne fonctionne pas très bien (saturation maximale (RG, RB, GB). Le fait que certains carrés ressemblent presque à l'arrière-plan Si toutes vos images ont le même motif (longues bandes blanches avec des carrés à côté d’elles), vous devriez envisager de rechercher les éléments les plus faciles (tels que les carrés très colorés ou les bandes blanches) en déduire l’emplacement possible pour d’autres objets. carrés et ... trouver un moyen de vérifier s'ils sont vraiment là ou pas.Tough mais intéressant! Pouvez-vous donner plus d'images?
Eh bien, je pense que cela n'aurait pas dû être déplacé.
Junuxx
1
Pouvez-vous fournir plus d'images? Aussi, quelle est cette chose?
Andrey Rubshtein
2
OP doit répondre à certaines questions. Peut-être qu'un fond blanc n'est pas nécessaire. Et quoi de neuf avec la lumière? Est-ce que ça va être si mauvais? Celles-ci me semblent tout à fait inutiles.
Tae-Sung Shin

Réponses:

9

Une première tentative avec Matlab:

im = imread('squares.jpg');
im2 = rgb2gray(im);

se = strel('disk', 15);

for i = 1:16;
    t = 60+i*5; % try out a range of bw thresholds to see what works best
    labelled = bwlabel(im2>t); % label regions in the BW image
    closed = imclose(labelled, se); % close small regions
    cleared = imclearborder(~closed,4); % clear regions touching the border
    subplot(4,4,i); 
    imshow(cleared); 
    title(['T = ' num2str(t)]);
end

Résultats dans les régions suivantes:

régions étiquetées

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.

Junuxx
la source
8

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):

masque image

É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:

image idéale

É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:

Image de sortie

Étape 4: OU opérer au-dessus de la sortie avec une image de masque de la première étape

sortie finale

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 !!!

Abid Rahman K
la source
5

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:

masque de l'objet

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.

SlimJim
la source
5

É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 entrez la description de l'image ici

entrez la description de l'image ici

rotation_image
la source
1
+1 - Ce serait génial si vous pouviez l'implémenter.
Abid Rahman K
2
@AbidRahmanK Ce n'est pas à cela que sert StackExchange. Question -> Réponse. Sinon, cela deviendrait un travail équitable.
Jan Krüger
2

cet arrangement est fixé

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
J'ai trouvé 3-4 carrés en utilisant la méthode des contours. Puis obtenu la hauteur et la largeur de chaque carré. Puis vérifié l’écart entre les carrés détectés et supposé si l’écart entre eux est assez grand pour contenir un autre carré. C'est la prédiction que j'ai faite.
Abid Rahman K
Certains carrés ont une couleur presque similaire à celle de l'arrière-plan. Donc, j'ai bien peur qu'ils ne soient également considérés comme des zones non carrées selon votre méthode.
Abid Rahman K
Vous pourriez peut-être essayer de travailler sur toutes les colonnes pour tracer une courbe où l'axe des x serait la hauteur (en pixels) de l'image et l'axe des y l'intensité. Ensuite, vous pouvez essayer de trouver des arêtes de coupe avec la forme dérivée.
c'est la détection de bord elle-même, non? J'ai essayé, mais je n'ai pas obtenu de bon résultat.
Abid Rahman K
1
Oui, c'est vrai, mais vous pouvez voir vous-même pourquoi cela échoue et peut-être même isoler certaines régions intéressantes de l'intrigue. À propos, si vous trouvez des conseils utiles pour résoudre votre problème, publiez-les. Bonne chance pour vos recherches
0

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.

Canahari
la source