WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Bildsegmentierung mithilfe von Histogrammen

 

clustering_n00b
Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 05.09.11
Wohnort: ---
Version: R2011a, R2012b
     Beitrag Verfasst am: 07.12.2012, 17:20     Titel: Bildsegmentierung mithilfe von Histogrammen
  Antworten mit Zitat      
Hallo zusammen! Smile


Kniffle gerade an einem hartnäckigen Problem, und zwar möchte ich mehrere Bilder segmentieren.
Das Problem ist unter diesem Link beschrieben (speziell Slides 25 - 30).

Mein Algorithmus beinhaltet die folgenden Gedankenschritte:

1) Threshold für jeden Farbenkanal bestimmen
Ich kann mit imhist() ein Histogram erstellen, aber wie finde ich nun den optimal Threshold?

2) Anzahl Clusters bestimmen
Für jede Farbe habe ich nun 2 Gruppen (über und unter Threshold). Insgesamt also 6. Aber man sieht doch (z.B. auf Slide 29), dass es mehr oder weniger Gruppen geben kann.

3) Sementierung mithilfe von Clusteringalgorithmen durchführen
k-Means gibt mir an welche Pixel zu welcher Gruppe gehören.
Aber wie bestimme ich denn die eigentliche FARBE des Pixels und zeige die Segmentierung an (Slide 29)?

Ähnliche Implementierung (in C): Link


Vorschläge? Smile
Private Nachricht senden Benutzer-Profile anzeigen


clustering_n00b
Themenstarter

Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 05.09.11
Wohnort: ---
Version: R2011a, R2012b
     Beitrag Verfasst am: 08.12.2012, 10:37     Titel:
  Antworten mit Zitat      
Hallo nochmals!

Jetzt bin ich gerade auf ein sehr interessantes Skript gestossen, das sich mit meinem Problem befasst.

Input:
Code:

sImgPath: Bildpfad
iBinNum: Anzahl Histograms in jeder Dimension
 

Output:
Code:

mSegmentImg: Labels für jeden Bildpixel



Es funktioniert folgendermassen:

1) RGB in Lab Raum umwandeln - siehe Link

2) 3D Histogramm für die 3 Lab Farbenkanäle erstellen
Code:
[LabHist,histCenters] = Build3DColorHistogram(L(:),a(:),b(:),iBinNum);

function [vColorHist, histCenters] = Build3DColorHistogram(vChannel1, vChannel2, vChannel3, iBinNum)
% Generate 3D color histogram from 3 channels

[Chist1,Cbin1] = hist(vChannel1(:),iBinNum);
[Cdist1,Cidx1] = min(abs(repmat(vChannel1(:),[1,iBinNum])-repmat(Cbin1,[length(vChannel1(:)),1])),[],2);
[Chist2,Cbin2] = hist(vChannel2(:),iBinNum);
[Cdist2,Cidx2] = min(abs(repmat(vChannel2(:),[1,iBinNum])-repmat(Cbin2,[length(vChannel2(:)),1])),[],2);
[Chist3,Cbin3] = hist(vChannel3(:),iBinNum);
[Cdist3,Cidx3] = min(abs(repmat(vChannel3(:),[1,iBinNum])-repmat(Cbin3,[length(vChannel3(:)),1])),[],2);

ind = sub2ind([iBinNum,iBinNum,iBinNum],Cidx1,Cidx2,Cidx3);
vColorHist = zeros(iBinNum,iBinNum,iBinNum);
for i = 1:iBinNum^3
    vColorHist(i) = sum(ind==i);
end

histCenters = [repmat(Cbin1(:),[size(vColorHist,2)*size(vColorHist,3),1]),...
               repmat(Cbin2(:),[size(vColorHist,1)*size(vColorHist,3),1]),...
               repmat(Cbin3(:),[size(vColorHist,1)*size(vColorHist,2),1])];

return;
 



3) Histogramm-Peaks suchen --> finde Anzahl Clusters vSeed
Code:

vSeed = SearchLocalMaximum(LabHist);

function vSeed = SearchLocalMaximum(dataHist)
%

iBinNum = 1;
for i = 1:length(size(dataHist))
    iBinNum = iBinNum*size(dataHist,i);
end

vSeed = [];
for i = 1:iBinNum
    vNBins = CalcNeighborBins(size(dataHist),i);
    if (sum((dataHist(i)-dataHist(vNBins))>0)==length(vNBins))
        vSeed = [vSeed;i];
    end
end

return;

function vNBins = CalcNeighborBins(HistSize,iBin)
%

[I1,I2,I3] = ind2sub(HistSize,iBin);

vBin1 = []; vBin2 = []; vBin3 = [];
for k = I3-1:I3+1
    for i = I1-1:I1+1
        for j = I2-1:I2+1
            if ((i~=I1 | j~=I2 | k~=I3) & ...
                ((i>0&i<=HistSize(1)) & (j>0&j<=HistSize(2)) & (k>0&k<=HistSize(3))))
                vBin1 = [vBin1;i];
                vBin2 = [vBin2;j];
                vBin3 = [vBin3;k];
            end
        end % end for j
    end % end for i
end % end for k

vNBins = sub2ind(HistSize,vBin1,vBin2,vBin3);

return;
 



4) k-Means Clustering mit vSeed

Code:
[IDX,C] = kmeans(data,length(vSeed),'start',histCenters(vSeed,:),'emptyaction','drop';
 


5) Segmentierung bestimmen und plotten

Code:
mSegmentImg = reshape(IDX,[size(img,1),size(img,2)]);
imshow(label2rgb(mSegmentImg));
 



Es ist klar, dass die Segmentierung von dem Inputparameter iBinNum abhängt. Diese Abhängigkeit möchte ich reduzieren (oder sogar eliminieren).
Auch wenn iBinNum = 10 oder = 100 ist, die Anzahl Segmentierungen sollem im Bild nicht allzu stark variieren.

Die Frage ist also:
Zitat:
Wie finde ich die optimal Anzahl von Histograms?


Hier habe ich ein interessantes Tutorial gefunden, frage mich aber wie das genau in MATLAB zu implementiere ist?
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.