Problème de segmentation d'images de différents matériaux

15

Salut la communauté CV / Pattern Recognition,

J'ai un sérieux problème concernant la segmentation d'une image. Le scénario est une atmosphère dans un four qui me rend la tête folle. Et je dois détecter les contours d'objets de différents matériaux (verre, céramique, Al, Ir, ..) en peu de temps (<10 secondes) et pas seulement pour un cas particulier. J'ai également besoin du contour dans une rangée séquentielle de pixels pour le code. Par conséquent, un code de chaîne ou ce que l'on appelle le suivi des frontières / contours est également nécessaire, donc les trous ouverts ne sont pas bons. À l'arrière-plan, des bruits non linéaires, approximativement de poussière, de particules ou quelque chose d'autre, qui apparaissent de temps en temps.

Les suggestions Matlab ou OpenCV sont les bienvenues.

Pour le rendre plus clair, j'ai posté une autre image de mon objectif et un objet semi-transparent, qui doit également être détecté. Aussi d'autres exemples qui doivent être pris en compte. Exemple 1 exemple2 exemple3 exemple4

Comme vous pouvez le voir sur l'image n ° 1, il y a des particules dans la partie droite de l'image et à proximité du contour extérieur de l'étoile, qui est l'objet. De plus, le contraste global n'est pas très bon. L'objet lui-même se trouve sur un sous-sol, ce qui n'est pas pertinent pour la détection de contour. L'image n ° 2 montre un objet semi-transparent, ce qui est également possible.

Je veux trouver le contour / périmètre de cet objet, comme sur l'écran suivant (ligne rouge). Les deux rectangles (jaunes) marquent le point de départ (à gauche) et le point d'arrivée (à droite). La ligne bleue est ignorable. exemple2

Au début, je pensais que je pouvais résoudre le problème de cette atmosphère sale avec juste des filtres. Mais après une somme honorable d'investissement en temps, je viens de réaliser que je dois éliminer ou réduire les bruits de manière significative afin d'augmenter le contraste du premier plan et de l'arrière-plan. J'avais essayé beaucoup de méthodes, comme l'égalisation d'histogramme, l'égalisation adaptative Otsu, les filtres linéaires (par exemple gauss), les filtres non linéaires (médiane, diffusion), les contours actifs, les k-Means, les Fuzzy-c-means et aussi Canny pour pure Détection des contours en combinaison avec des opérateurs morphologiques.

  • Canny: Les particules et l'atmosphère provoquent des trous, mais j'ai besoin d'un contour complet de l'objet. Toujours avec la fermeture, la dilatation des opérateurs morphologiques ce n'est pas assez bien. Canny a toujours les meilleurs résultats de toutes les méthodes que j'ai étudiées à cause de l'hystérésis.
  • Contours actifs: Ils fonctionnent également sur les bords / dégradés, ils agissent complètement fous après l'initialisation à l'intérieur de l'objet, ce qui peut être dû à la carte des bords résultant de l'objet `` ouvert ''. Autant que je sache, le contour doit être fermé. Je l'ai essayé avec différents dérivés (GVF / VFC / Classic Snake).
  • k-Means: Les résultats incluent l'atmosphère du four, à cause du fond brumeux. Idem pour les flous-c-moyens. J'ai choisi deux clusters, en raison de la séparation de l'objet de l'arrière-plan. Plus de grappes conduisent à des résultats plus faibles.
  • Histogramme / Otsu: En raison des intensités de gris très proches (à mon humble avis!), Il fusionne l'objet avec l'arrière-plan. Je l'ai essayé avec des méthodes locales et mondiales.
  • Filtres: en particulier le GLPF ou un autre LPF tache les bords, ce qui n'est pas si bon et ne réduit même pas l'atmosphère brumeuse.
  • Les filtres non linéaires préservent les bords. La plupart d'entre eux prennent trop de temps pour calculer les grandes images. A pris un filtre bilatéral rapide pour l'instant. Résultats voir ci-dessous.

Par conséquent, aucune méthode n'est suffisante pour les étapes de post-traitement, car les résultats obtenus du segment d'objet sont médiocres par rapport à un algorithme existant. Cet algorithme existant est très local et fonctionne donc pour ce scénario très spécial.

Je vous demande donc, si j'ai complètement raté quelque chose ... Je ne sais plus comment traiter et comment obtenir de bons résultats de contour, sans lacunes ni trous .. Est-ce possible sans faire beaucoup de changements sur le CCD et l'environnement physique? Merci d'avance!

Dernière approche jusqu'à présent (après une longue nuit d'expériences avec les MO):

  • Filtre bilatéral (bord préservant, mais lissant les zones homogènes)
  • Canny (Sigma = 2, seuil = [0,04 0,08])
  • Opérations Morphologique (MO): bwareopen, closing, remove&bridge
  • bwlabelpour sélectionner uniquement le périmètre du contour, ce qui supprime les bruits indésirables. pas encore de captures d'écran mises à jour, mais cela fonctionne pour la star. le verre a un contour intérieur qui est connecté au contour extérieur, qui peut également être vu sur la capture d'écran ci-dessous.

J'ai donc peur d'avoir besoin d'un algorithme spécial pour la traversée du contour extérieur. Ce sera une recherche de voisinage dans le sens horaire / antihoraire. Cette étape dans le sens horaire / antihoraire peut changer, s'il y a un point d'angle. s'il y a un écart, augmentez le rayon et regardez à nouveau. s'il y a deux ou plusieurs points suivants possibles, prenez celui qui a la même direction que le précédent. Pensez-vous que cet algorithme de suivi de contour a du sens?

Bords de verre Étoile

mchlfchr
la source
Avez-vous essayé le seuil adaptatif? Vous ne semblez pas le mentionner. Je pense que OTSU devrait fonctionner d'une manière ou d'une autre après avoir supprimé le bruit, mais peut-être que le seuil adaptatif est meilleur.
Rui Marques
Salut Rui, j'ai essayé le seuillage adaptatif avec cette extension Matlab: seuil adaptatif Voici les résultats pour jouer avec les paramètres de la fenêtre: 1er essai 2e essai 3e essai Comme vous pouvez le voir, avec l'augmentation des paramètres, la partie centrale passe du blanc au noir (ce qui est bon, à mon humble avis) mais le reste de l'arrière-plan devient également noir, ce qui est mauvais.
mchlfchr
3
Avez-vous essayé quelques techniques de réduction d'image de base? Telles que la soustraction d'une correction de champ plat pour se débarrasser de cet assombrissement en haut à droite ( en.wikipedia.org/wiki/Flat-field_correction ). De plus, si les particules sont statiques, elles seraient instantanément éliminées. Ensuite, vous pouvez utiliser n'importe quelle méthode de détection de bord que vous voulez ...
PhilMacKay
Salut Phil, en ce qui me concerne et comme je le sais, il y a une série de photos qui sont prises avant qu'un objet n'entre dans le four. Le type de calibration est donc ici. Je parlerai au physicien responsable du CCD et de l'environnement lundi. Mais merci pour les conseils, je vais essayer!
mchlfchr
La deuxième image que vous avez ajoutée est totalement différente. Pouvez-vous publier toutes les images possibles?
Andrey Rubshtein

Réponses:

2

Vous pouvez essayer ce qui suit:

oli
la source
Salut oli, concernant les méthodes clairsemées: pourriez-vous être plus précis sur les méthodes de ce code que je devrais utiliser? Je ne suis pas très en profondeur dans cette section et je n'ai pas trouvé quelque chose d'utile dans les documents concernant le débruitage ou le flou ... Merci d'avance.
mchlfchr
1
Vous pouvez trouver une version "plus facile à utiliser", là: Lear.inrialpes.fr/people/mairal/denoise_ICCV09.tar.gz
oli
désolé de vous plaindre une autre fois ;-) ... avez-vous aussi des sources win32? Merci encore!
mchlfchr
J'ai peur de ne pas le faire ...
oli
2

Je pense que vous avez abandonné trop tôt les techniques de seuil. Jetez un œil à votre histogramme, il est clairement tri-modal: (j'ai supprimé manuellement les colonnes blanches à droite de votre image, je suppose qu'elles ne font pas partie de l'image - veuillez prendre cette image avant d'exécuter mon code)

entrez la description de l'image ici

Jetez un œil à toutes les valeurs du premier groupe:

entrez la description de l'image ici

Afin de trouver des modes dans l'histogramme tri-modal, il est possible d'utiliser un regroupement de K-means avec une K=3intensité. Le code Matlab suivant trouve th1=67sur votre code. L'idée est de supposer que vous avez les 3 ensembles et de calculer le centroïde pondéré sur chacun d'eux. Ensuite, chaque niveau d'intensité est affecté à son propre cluster. Vous vous arrêtez lorsque les centroïdes pondérés cessent de bouger. Voici le résultat de la recherche de deux seuils sur votre image, indiqués sur l'histogramme.

entrez la description de l'image ici

function [th1,th2]=SegmentHistTo3()
    im = imread('http://i.stack.imgur.com/U2sc5.png');
    h = imhist(im(:,:,1)); %# Calculate histogram

    th1new = round(256/3); %# Initial thresholds
    th2new = round(256*2/3);
    th1 = 0;
    th2 = 0;

    while (th1~=th1new) || (th2~=th2new) %# While the centroids keep on moving
        th1 = th1new;
        th2 = th2new;

        wa1 = WeightedAverage(h,1,th1);  %# Calculate 3 weighted averages
        wa2 = WeightedAverage(h,th1+1,th2);
        wa3 = WeightedAverage(h,th2,numel(h));

        th1new = round( (wa1+wa2)/2 );  %# The thresholds are middle points between the averages
        th2new = round( (wa2+wa3)/2 );
    end

    figure; hist( double( reshape(im(:,:,1),1,[]) ),256);
    hold on;
    plot( [th1 th1],[0 max(h)],'r','LineWidth',2);
    plot( [th2 th2],[0 max(h)],'r','LineWidth',2);

    figure;imshow( im(:,:,1)<th1);
end

function wa = WeightedAverage(region,th1,th2)    
    regionNonEmpty(th1:th2) = region(th1:th2);
    wa = sum( regionNonEmpty .* (1:numel(regionNonEmpty))) / sum(regionNonEmpty);    
end

Résoudre le problème par la suite est un jeu d'enfant, faites simplement quelques opérations morphologiques simples, comme l'ouverture.

Andrey Rubshtein
la source
1
Salut Andrey, mais comment dois-je faire une généralisation de ce seuillage que vous avez mentionné? J'ai eu plusieurs cas, pas seulement celui-là et j'ai encore besoin d'automatisation. Et l'Otsu Thresholding (fonction dans matlab) ne m'a donné aucun bon résultat. Avez-vous d'autres indices? Cordialement
mchlfchr
Salut encore, merci jusqu'à présent, mais le code ne fonctionne pas. Un écran vierge apparaît. Je l'ai essayé avec mes données d'origine (bitmaps) et le PNG que vous avez posté ci-dessus. Je
débogue en
@mchlfchr, avez-vous une boîte à outils de traitement d'image? Si vous ne le faites pas, il est possible de passer imhistàhist
Andrey Rubshtein
@mchlfchr, veuillez consulter la version mise à jour
Andrey Rubshtein
Andrey, si j'insère le fichier bitmap d'origine, les résultats sont comme je l'ai mentionné dans mon message d'origine. Peut-être que cela se produit concernant la résolution? L'image source est de 576 x 768 pixels et en niveaux de gris (256). Voici les résultats, si j'utilise votre fonction avec mon image d'origine: i.imgur.com/UXALJ.png figure d'histogramme de votre fonction: i.imgur.com/7RiPP.png Merci pour votre aide! regards
mchlfchr
1

Comme suggéré ci-dessus, le seuillage peut être très efficace sur cette image, qui est essentiellement binaire, sauf qu'un seuil constant ne suffira pas à cause d'un éclairage inégal. Vous avez besoin d'un seuillage adaptatif.

Mon conseil serait de faire une reconstruction de fond avec un modèle simple (éventuellement planaire [3 DOF] ou quadradique [6 DOF]), en échantillonnant un petit nombre de valeurs dans les régions claires. Le mieux est d'utiliser de petits ROI pour faire la moyenne du bruit. Corrigez ensuite l'ombrage en soustrayant (ou en divisant par) les valeurs d'arrière-plan.

Si l'interaction humaine n'est pas une option, vous pouvez automatiser la recherche de zones d'arrière-plan en commençant par Otsu directement et en considérant des ROI uniformes (faible variance) bien en dessous du seuil. Après une première reconstruction d'arrière-plan, vous pouvez probablement vous améliorer en appliquant ce processus à l'image corrigée à plat.

L'ensemble du processus peut être mis en œuvre pour fonctionner bien en dessous d'une seconde.

Yves Daoust
la source
Bonjour Yves, un traitement automatisé est préférable. L'aspect DOF est intéressant, mais je ne suis pas sûr de la méthode Otsu, car Otsu lui-même ne fonctionne pas bien. Ai-je bien compris que vous vouliez sélectionner des zones aléatoires de l'image et que vous définiriez ensuite un seuil après la valeur moyenne sur toutes les zones sélectionnées? Cordialement
mchlfchr
1

Je pense que la meilleure façon est d'utiliser les contours actifs. Si vous ne savez pas quels sont les contours actifs, regardez cette vidéo sur youtube http://www.youtube.com/watch?v=ijNe7f3QVdA

Fondamentalement, vous devez donner une segmentation d'initialisation et cela améliorera la forme. Ma suggestion est de l'une des méthodes discutées sur ce poste et d'utiliser les contours actifs comme une 2ème étape, c'est-à-dire. comme une étape d'amélioration.

Voici une implémentation de contours actifs que vous pouvez utiliser http://www.mathworks.com/matlabcentral/fileexchange/19567

mkuse
la source
Bienvenue sur dsp.se :) Merci d'avoir contribué, vous avez fourni une belle réponse. Si vous voulez le rendre encore meilleur, je pense qu'il serait intéressant de répondre à certaines de ces questions: Pourquoi pensez-vous que c'est la meilleure approche (par exemple, avez-vous une expérience personnelle avec la tecnhique)? Selon vous, laquelle des approches déjà suggérées fonctionnerait bien en combinaison avec votre suggestion? Donnez une brève explication de la technique ou, si vous avez le temps, essayez de fournir des résultats expérimentaux en utilisant la technique sur les exemples d'images fournis. Et amusez-vous sur dsp!
penelope
@mkuse, comme vous l'avez peut-être lu, j'ai déjà essayé les contours actifs, combinés à la réduction du bruit et aux cartes de bord. les résultats étaient mauvais et avaient un mauvais temps d'exécution pour les grandes images.
mchlfchr
que diriez-vous de jeter un oeil aux techniques de réduction du bruit Vous pouvez trouver un résumé de ceux-ci ici: lnmiitdip.files.wordpress.com/2011/12/…
mkuse
1
@mkuse, j'ai déjà mentionné les mécaniques que vous avez postées dans votre fichier PPT dans mon post initial. J'ai édité mon post initial, pour clarifier le type de filtres que j'ai utilisé.
mchlfchr
0

Vous savez clairement de quoi vous parlez, mais vous n'avez pas mentionné l'utilisation du seuillage, en particulier avez-vous essayé d'appliquer un seuil global à l'aide d'Otsu pour calculer le bon niveau, puis de trouver les contours et de sélectionner le plus grand?

[Modifier pour clarifier]

Le seuil global ne fonctionnera évidemment pas en raison du graident visible à travers l'image.

J'ai eu un jeu rapide avec cela et je trouve que si vous divisez l'image en 6 morceaux (2 rangées de 3 colonnes de taille égale), puis effectuez un seuillage en utilisant Otsu sur chacun puis réassemblez, cela fait un joli travail de dieu pour nettoyer le image.

Il y a encore quelques artefacts mineurs sur la partie supérieure droite de l'étoile.

Il me semble que puisque l'objet a des limites de ligne droite, vous voudrez peut-être envisager une transformation de Hough pour extraire ces bords, les intersecter pour localiser les sommets et utiliser le résultat comme contour de votre objet.

Communauté
la source
Salut Dave, j'ai essayé Otsu, mais cela apporte l'effet que l'arrière-plan supérieur droit fusionne avec l'objet, ce qui est absolument inacceptable.
mchlfchr
Salut Dave, Hough n'est pas une option, en raison des exigences d'exécution et pour autant que je sache le HT, cela prend beaucoup de temps pour les images de grande taille.
mchlfchr
0

Les contours sont-ils toujours des lignes droites ou des courbes connues?

Si c'est le cas, plutôt que d'essayer de corriger chaque pixel le long du bord, j'utiliserais des transformations de Hough pour obtenir les équations des lignes, puis recréer les contours à partir des lignes et des sections.

Martin Beckett
la source
1
Comme je l'ai déjà mentionné: j'ai besoin d'approches en temps réel à proximité. Et pour autant que je connaisse le HT, cela prend beaucoup de temps. Un autre aspect est que je ne connais pas les courbes et les lignes ne sont pas toujours droites. Le contour dépend du matériau qui se trouve dans le four (pour plus d'informations, voir mon post d'origine).
mchlfchr
Pour les lignes droites, c'est assez rapide, et si vous savez à peu près où se trouvent les lignes (par exemple à partir d'une image précédente), vous ne pouvez rechercher que cet espace paramétrique
Martin Beckett