IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

mesure d'épaisseur par traitement d'image


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 49
    Points : 27
    Points
    27
    Par défaut mesure d'épaisseur par traitement d'image
    Bonjour à tous,
    Voici un challenge, j'aimerais réaliser avec matlab des mesures d'épaisseurs en traitent une image.
    la voici:
    Nom : 20(1)-1.JPG
Affichages : 549
Taille : 28,5 Ko

    Je souhaiterai traiter les niveaux de contraste de gris pour estimer l’épaisseur des couches.
    voici le graphe 3D obtenu avec matlab:
    Nom : test deconvolution2.jpg
Affichages : 569
Taille : 22,0 Ko

    Pour chaque colonne, on a un graph de contraste tel que:
    Nom : test deconvolution.jpg
Affichages : 537
Taille : 28,7 Ko

    Connaîtriez vous une fonction qui permet ce type d'estimation ? sinon comment réussir cette routine ?

    Merci d'avance pour votre aide

    Maxime

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 49
    Points : 27
    Points
    27
    Par défaut
    Aprés un peut de traitement de l'image pour augmenter les contrastes, j'ai tenté de mettre en évidence les différences de hauteurs par soit la dérivé du signal soit par la division par un facteur pondérateur
    résultat:
    Nom : derivé et division.jpg
Affichages : 539
Taille : 18,4 Ko
    La courbe orange présente une forme qui pourrait être intéressant pour estimer l'épaisseur des couches visibles mais comme l'exploiter ???

    Maxime

  3. #3
    Membre confirmé
    Homme Profil pro
    Éternel universitaire
    Inscrit en
    Avril 2012
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Éternel universitaire

    Informations forums :
    Inscription : Avril 2012
    Messages : 421
    Points : 639
    Points
    639
    Par défaut
    Salut,

    Tout d'abord, je tiens à préciser que je n'ai jamais fait de traitement d'image ! C'est certain qu'il existe des solutions qui présenteront de biens meilleurs résultats... C'est juste que je trouvais ton problème amusant.
    Mon idée c'est de lisser le signal et d'étudier ensuite la dérivée seconde.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    myImage=imread('test.JPG');
     
    % Filtre gaussien
    y = myImage(:,100); % Une ligne
    gaussWin = gausswin(60); % Fenêtre de lissage pour le filtre
    gaussWin = gaussWin/sum(gaussWin); % Normalisation
    ySmooth = conv(double(y), double(gaussWin), 'same');
    plot(y,'b'); hold on
    plot(ySmooth,'r');
     
    % Etude de la derivee seconde
    d2=diff(diff(ySmooth));
    idBlack=find(d2>0);
    idWhite=find(d2<0);
     
    plot(idBlack,ySmooth(idBlack),'.k')
    plot(idWhite,ySmooth(idWhite),'.g')
    Nom : largeurBandes.jpg
Affichages : 606
Taille : 42,0 Ko

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 49
    Points : 27
    Points
    27
    Par défaut
    Bonjour et merci pour votre tentative. En effet, ce problème est intéressant dans le sens ou beaucoup de plateformes de recherches utilisent des images MEB mais elles effectuent leurs mesure de visu avec imagj et un étalon.
    Je souhaite faire mieux avec matlab ^^ de manière automatisée si possible.

    J'aime beaucoup votre approche grâce au signale lisser vous vous affranchissez des variations rapides qui perturberait la dérivée premier et seconde.
    C'est vraiment le type de résultat que je souhaite avoir.
    Pour un pixel l’étalon est de 3,9370 nm quel épaisseurs de couches obtenez vous avec grâce à la méthode lissage+dérivé seconde ?
    Peut on tenter un lissage avec une fonction porte ?

    Maxime

  5. #5
    Membre confirmé
    Homme Profil pro
    Éternel universitaire
    Inscrit en
    Avril 2012
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Éternel universitaire

    Informations forums :
    Inscription : Avril 2012
    Messages : 421
    Points : 639
    Points
    639
    Par défaut
    Citation Envoyé par maximus35 Voir le message
    Pour un pixel l’étalon est de 3,9370 nm quel épaisseurs de couches obtenez vous avec grâce à la méthode lissage+dérivé seconde ?
    Peut on tenter un lissage avec une fonction porte ?
    Pour voir l’épaisseur d'une couche, il suffit de multiplier le nombre de point consécutifs dont la dérivée seconde est positive (respectivement négative) par 3,970 nm. En d'autre termes, si la dérivées seconde est positive du point 60 au point 90, la couche est approximativement de (90-60)*3.93 nm.
    Lissage avec une fonction porte ? Oui, probablement, ça vaut le coup d'être essayé !

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 49
    Points : 27
    Points
    27
    Par défaut
    Comment identifier les plages et extraire les plages successivement multiplier par 3.93nm ? je dois avouer que pour cette manipulation je ne sais pas comment la réaliser avec matlab

    Pour la fonction porte on peut utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    a=-1;
    b=1;
    x=10;
    rectangularPulse(a,b,x);
     
     ou 
     
    x1=zeros(10);
    x2=ones(40);
    x3=zeros(10);
    porteWin=[ x1 x2 x3]; % fonction porte
    Quand pensez vous ?

    Maxime

  7. #7
    Membre confirmé
    Homme Profil pro
    Éternel universitaire
    Inscrit en
    Avril 2012
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Éternel universitaire

    Informations forums :
    Inscription : Avril 2012
    Messages : 421
    Points : 639
    Points
    639
    Par défaut
    Citation Envoyé par maximus35 Voir le message
    Comment identifier les plages et extraire les plages successivement multiplier par 3.93nm ?
    Une solution que je trouve très élégante que Winjerome avait proposé dans un post.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    % Id des bandes noires
    idxAfter = strfind([d2'<0 true], [false true]);
    idxBefore = strfind([true d2'<0], [true false]);
     
    % Largeur des bandes noires
    widthBlackStripes = (idxAfter- idxBefore)*3.93+3.93;
     
    sprintf('Bande noire %i, largeur de %f nm\n',[1:numel(widthBlackStripes);widthBlackStripes])
    On peut voir clairement qu'avec la méthode que je propose, il y a des pixels résiduels et que le lissage n'est pas parfait !

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 49
    Points : 27
    Points
    27
    Par défaut
    Bonjour,
    Vous avez raison c'est manière de faire est très élégante ^^
    Il faut que je travail que le lissage pour que les différences de marches soient plus prononcées, peut-on amplifié artificiellement le contraste avec un fonction de traitement d'image dans matlab ?
    voici une image moins dure à traiter:
    Nom : 4 couche 1.png
Affichages : 488
Taille : 153,4 Ko

    peut on colorisé en plus claire les couches claires et assombrir les parties sombre avec matlab ?
    On peut effectuer ces manipulations avec ImageJ, matlab doit pouvoir faire ce genre de chose ? ? ?

    Maxime

  9. #9
    Membre confirmé
    Homme Profil pro
    Éternel universitaire
    Inscrit en
    Avril 2012
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Éternel universitaire

    Informations forums :
    Inscription : Avril 2012
    Messages : 421
    Points : 639
    Points
    639
    Par défaut
    Citation Envoyé par maximus35 Voir le message
    peut on colorisé en plus claire les couches claires et assombrir les parties sombre avec matlab ?
    On peut effectuer ces manipulations avec ImageJ, matlab doit pouvoir faire ce genre de chose ?
    Oui on peut très bien le faire mais ça ne fait (à mon sens) que transposer le problème. Si on connaît la transformation a effectuer pour que les blancs deviennent plus blanc et les noirs plus noirs, ça veut dire qu'on est déjà capable de les reconnaître.

    Allez, ceci est ma dernière tentative, après si la solution ne convient pas, je laisse d'autres personnes s'emparer du problème. Ici l'idée c'est de comparer le lissage à une moyenne glissante (ou flottante).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    clear
    clc
    close all
     
    myImage=imread('test.JPG');
     
    % Filtre gaussien
    y = double(myImage(:,100)); % Une ligne
    gaussWin = gausswin(50); % Fenêtre de lissage pour le filtre
    gaussWin = gaussWin/sum(gaussWin); % Normalisation
    ySmooth = conv(y, gaussWin, 'same'); % Smoothing
    mvAvg = conv(y, ones(101,1)/101, 'same'); % moyenne glissante
     
    plot(y,'b'); hold on
    plot(ySmooth,'r')
    plot(mvAvg,'g')
    legend('Signal brut','Signal lissé','Moyenne glissante')
     
    % Différence entre lissage et moyenne glissante
    idBlack=find(ySmooth<mvAvg);
    plot(idBlack,ySmooth(idBlack),'.k')
    isBlack=ySmooth<mvAvg;
     
    % Id des bandes noires
    idxAfter = strfind([isBlack'== 0 true], [false true]);
    idxBefore = strfind([true isBlack'== 0], [true false]);
     
    % Largeur des bandes noires
    widthBlackStripes = (idxAfter- idxBefore)*3.93+3.93;
     
    fprintf('Bande noire %i, largeur de %f nm\n',[1:numel(widthBlackStripes);widthBlackStripes]);
    Nom : largeurBandes2.jpg
Affichages : 561
Taille : 22,3 Ko

    Ça fonctionne plutôt bien ! On s'est débarrassé du bruit de la dérivée seconde. Par contre, il y a toujours un petit problème... On a des effets de bords. On sait donc que les bandes sur le côtés sont sujettes à caution (en haut et en bas de l'image).

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 49
    Points : 27
    Points
    27
    Par défaut
    Bonjour et merci.
    La solution que vous avez proposez est vraiment top. J'ai réalisé quelque échantillonnage et ensuite avec un peu de statistique, j'ai réussi à définir mes épaisseurs avec une erreur relative de 1% soit 4 fois moins qu'une mesure manuelle . J'ai mise en place une méthode au limite pour éviter les effets de bords que vous avez reperé. Je vais maintenant soumettre la solution à l’équipe avec laquelle je travail et faire une campagne de test.

    Merci beaucoup pour votre aide ^^

    Maxime

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Détection de pluie par traitement d'image
    Par Ma29200 dans le forum Traitement d'images
    Réponses: 17
    Dernier message: 20/02/2012, 10h52
  2. Traitement d'image : mesure de niveau (liquide)
    Par zicos dans le forum Traitement d'images
    Réponses: 11
    Dernier message: 18/11/2008, 21h04
  3. [blkproc] Traitement d'image par blocs
    Par StitchP dans le forum Images
    Réponses: 3
    Dernier message: 01/07/2008, 10h12
  4. Traitement d'images et mesure
    Par lilyla dans le forum Images
    Réponses: 2
    Dernier message: 06/02/2007, 19h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo