1

Je travaille sur un algorithme qui compte les modèles (barres) dans une image spécifique. Cela m'a semblé très simple au premier coup d'œil, mais j'ai vite compris la complexité. J'ai essayé le seuillage simple, l'appariement de gabarits (petites fenêtres coulissantes), la détection de bords ... Je n'ai que peu d'images comme celle-ci. donc je pense qu'un algorithme d'apprentissage automatique ne peut pas donner de meilleurs résultats! mais j'ai encore besoin de suggestions. enter image description herecompter des modèles dans l'image

+1

Travaillez-vous dans une langue spécifique? Cela pourrait aider les autres à vous donner de meilleures réponses. Je pense que peut-être vous pouvez essayer une sorte d'algorithme de bassin versant, peut-être l'utiliser avec la carte de bord. une autre option pourrait être de convertir l'image en binaire et en utilisant la dilatation et l'érosion pour séparer les barres – andrew

+0

Merci d'avoir répondu. Toute langue est la bienvenue. Je pense que Matlab sera gentil. Pour la production, Opencv sera peut-être le meilleur. Quoi qu'il en soit, ce n'est pas mon affaire maintenant. J'ai essayé différents algorithmes de segmentation (watershed et edge aussi) mais les résultats restent très dépendants des paramètres. Les opérations morphologiques (dilatation et érosion) sont plus dangereuses. certains ROI peuvent disparaître à jamais! Merci encore. –

Répondre

2

Je pense que vous avez assez de données de vos images. Vous devez recadrer à partir de vos images uniquement les barres. Vous obtiendrez plusieurs dizaines de petites images pour chaque image. Après cela, vous pouvez redimensionner toutes les images à une taille prédéfinie (par exemple 24X24 pixels) utiliser un descripteur comme HOG et SVM pour l'apprentissage. Pour le faux, utilisez simplement d'autres zones de vos images.

+0

Merci pour votre réponse Amitay. J'ai eu une idée similaire avec la correspondance de modèles. J'ai essayé de recadrer des modèles (basés sur des centroïdes d'objets détectés après une binarisation aléatoire) et effectué une correspondance de modèle sur les amplitudes de gradient (HOG utilise des directions), et somme des correspondances maximales. les résultats étaient encourageants, mais toujours pas satisfaits. Je vais essayer votre idée avec des directions de gradient HOG, peut-être avec un ensemble d'exemples. Je pense que la taille du template sera un gros problème pour l'automation, mais je vais essayer quand même. Merci encore. –

0

Cela peut ne pas fonctionner dans tous les cas, mais puisqu'il s'agit de barres rondes, vous pouvez également essayer d'utiliser la détection de cercle. Les deux matlab (find circles) et opencv (hough circle transform) prennent en charge cette transformation de cercle creux. Un problème est que vous devez jouer avec les paramètres un peu (matlab est plus simpliste que le cv ouvert) mais cela est vrai de presque n'importe quelle méthode.

Ces méthodes fonctionnent mieux avec des images plus grandes, donc j'ai redimensionné le vôtre. Vous devez également connaître le rayon des cercles à rechercher. Si la position de votre caméra est constante, cela ne devrait pas beaucoup changer. Ce code provient de la page de documentation de matlab que j'ai liée. Il doensn't trouver tous les cercles, mais quelques ajustements peuvent aider

im = imread('http://i.stack.imgur.com/NRwUq.jpg'); 

%find circles doesn't work well on small images, I made the image 
%three times larger, if you have larger images you should use those for 
%better results 
bim = imresize(im, 3*size(im)); 

%find and display circles 
[centers, radii] = imfindcircles(bim,[8 20],'ObjectPolarity','bright',... 
    'Sensitivity',0.9); 
imshow(bim); 
h = viscircles(centers,radii); 

number_of_bars = numel(centers) 

J'ai ajouté des points verts aux cercles du détecteur et de manquer X bleu sur la détection incorrecte. Je les ai fait à la main, mais les cercles rouges ont été localisés par matlab.

enter image description here