Wie wende ich eine Wasserscheide an, um Bilder mit Matlab zu segmentieren?

  • Wie wende ich eine Wasserscheide an, um Bilder mit Matlab zu segmentieren?

    Wie segmentieren Sie dieses Bild mithilfe von "Watershed", um nur die Personen im Bild abzurufen? p>

    Ich habe bisher Folgendes getan:

    1. Berechnet einen Gradienten
    2. ol>

      Wie wende ich eine Wasserscheide an, um Bilder mit Matlab zu segmentieren?

      1. Berechnet die Umkehrungstransformation
      2. < / ol>

        Wie wende ich eine Wasserscheide an, um Bilder mit Matlab zu segmentieren?

        Mein Code:

           clear;
        I=imread('inpaint.jpg');
        I=rgb2gray(I);
        
        hy = fspecial('sobel');
        hx = hy';
        Iy = imfilter(double(I), hy, 'replicate');
        Ix = imfilter(double(I), hx, 'replicate');
        gradmag = sqrt(Ix.^2 + Iy.^2);
        
        
        figure, imshow(gradmag,[]), title('Gradient magnitude (gradmag)')
        L = watershed(gradmag);
        % Lrgb = label2rgb(L);
         figure, imshow(L), title('Watershed transform of gradient magnitude (Lrgb)')
         

        Es ist mir gelungen, die Wasserscheide anzuwenden

        Wie wende ich eine Wasserscheide an, um Bilder mit Matlab zu segmentieren?

        Möchten Sie wissen, ob ich meine Objekte im Originalbild so gliedern kann, dass sie segmentiert erscheinen?

    15 April 2012
    Nicholas
2 answers
  • Erinnern Sie sich daran, dass die Watershed-Transformation ihre Eingabe als topografische Karte behandelt und Flut simuliert diese Topographie mit Wasser. Die "Einzugsgebiete" oder "Watershed-Regionen" sind dann die Teile der Karte, die "Wasser halten", ohne in andere Regionen zu gelangen.

    Die Gradientengröße ist eine schlechte Segmentierungsfunktion -ist; Das Rauschen und die offenen Konturen führen zu einer extremen Übersegmentierung des Bildes. Wir können eine Reihe morphologischer Operationen mit der Absicht ausprobieren, ungefähre Vorder- und Hintergrundmarkierungen zu erstellen, und diese verwenden, um die falschen Teile des Farbverlaufs zu entfernen.

     %# Normalize.
    g = gradmag - min(gradmag(:));
    g = g / max(g(:));
    
    th = graythresh(g); %# Otsu's method.
    a = imhmax(g,th/2); %# Conservatively remove local maxima.
    th = graythresh(a);
    b = a > th/4; %# Conservative global threshold.
    c = imclose(b,ones(6)); %# Try to close contours.
    d = imfill(c,'holes'); %# Not a bad segmentation by itself.
    %# Use the rough segmentation to define markers.
    g2 = imimposemin(g, ~ imdilate( bwperim(a), ones(3) );
    L = watershed(g2);
     

    Das funktioniert OK. Sie erhalten beide Gruppen von Personen und ihre Schatten als Regionen mit ein wenig Lärm.

    Können Sie Ihre Ziele näher erläutern? Werden also viele verschiedene Bilder segmentiert oder nur Bilder, die diesem Beispiel sehr ähnlich sind? Müssen Sie die Schatten ignorieren und die zwei überlappenden Personen trennen?

    Ich werde versuchen, die Antwort zu aktualisieren, wenn Sie auf diese Fragen antworten.

    Segmentierungsüberlagerung

    Sie haben gefragt, wie Sie eine Segmentierung überlagern. Eine Möglichkeit besteht darin, die Wasserscheidenlinien zu verwenden, um Pixel im Original festzulegen und diese auf eine helle Farbe einzustellen.

     boundaries = L == 0;
    I(boundaries) = 255;
     
    18 March 2012
    Chris Carruthers
  • Sie können die Funktion bwperim verwenden. Einige gute Beispiele hier http://blogs.mathworks.com/steve/2006/06/02/cell-segmentation/

    16 April 2012
    MyCarta