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

Otsu - Verfahren , bitte um Hilfe

 

DIY
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 21.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.01.2011, 21:08     Titel: Otsu - Verfahren , bitte um Hilfe
  Antworten mit Zitat      
Hallo goMatlab Forum,

ich habe ein Problem bei der Umsetzung des Otsu - Verfahrens.
In meiner Umsetzung versuche ich den maximalen Wert des Verhaeltnisses varZw/varIn durch eine einfache Iteration rauszubekommen.

Problem bei der Sache ist, dass ich bei den Werten aus denen ich das Maximum finden will oft INF vorfinde. Ich nehme an das Ergebnis des Verhaeltnisses wird einfach so groß das matlab es nicht mehr anzeigt?!.
Wenn ich dann also per find() das maximum suche, bekomme ich eine ganze Reihe von Werten t, nämlich die, für die das Verhaeltnis varZw/varIn INF ergibt.

Was stimmt in meiner Berechnung nicht? oder wie kann ich dieses Problem umgehen? Ich bin den Quellcode schon etliche Male durchgegangen, finde aber die Lösung nicht.


Ich hoffe es kann mir hier jemand helfen Smile

Vielen Dank bereits im Vorraus.


Liebe Grüße!

Code:
function A = Otsu(pic)
   
   
   
    [xPic,yPic]=size(pic);
   
    %t0 bestimmen oder manuell angeben
    %wir nehmen in diesem beispiel den mittleren Grauwert des Bildes
    %t0=floor(sum(pic(:))/(xPic*yPic));
    %t0=125;
 
    [counts,x]=imHist(pic);
   
    %Gesamtanzahl der Grauwerte
    gesamtCounts=sum(counts);
    %Auftrittswahrscheinlickeit jedes Grauwertes berechnen
    p=zeros(1,255);
   
    %wsk für jeden grauwert bestimmen
    for i=1:1:size(x)
        p(i)= counts(i)/gesamtCounts;
    end
   
    %array für verhaeltnisse erzeugen um alle zu speichern und dann das maximum zu finden
    verhaeltnis=zeros(1,255);
   
    for t0=1:1:254
        %Seien K0 und K1 zwei Klassen, getrennt durch den Schwellwert t
        K0=(1:t0);
        K1=(t0+1:255);

        %Wahrscheinlichkeit für das Auftreten jedes Grauwertes in der Klasse
        pK0=p(1:t0);
        pK1=p(t0+1:end);


        %mittlerer Grauwert Bild
        gStrich=floor(sum(pic(:))/(xPic*yPic));

        %mittlere Grauwerte beider Klassen
        gStrichK0=sum(K0)/size(K0,2);
        gStrichK1=sum(K1)/size(K1,2);

        %Auftrittswahrscheinlichkeit beider Klassen bestimmen
        pvonK0=sum(pK0);
        pvonK1=1-pvonK0;

        %Varianzen beider Klassen berechnen
        %für K0
        for g=1:1:t0
            varK0=sum((g-gStrichK0)^2*p(g));
        end    

        %für K1
        for g=t0+1:255
            varK1=sum((g-gStrichK1)^2*p(g));
        end

        %wir wollen einen Schwellwert, der die beiden Klassen möglichst gut
        %trennt, dazu maximieren wir die Varianz zwischen beiden Klassen

        varZw=pvonK0*(gStrichK0-gStrich)^2+pvonK1*(gStrichK1-gStrich)^2;

        %und minimieren die Varianz innerhalb der Klassen
        varIn=pvonK0*varK0+pvonK1*varK1;

        %also wählen wir t so, dass varZw/varIn maximal wird

        verhaeltnis(t0)=varZw/varIn;
        %verhaeltnis=varZw/varIn;
    end
    %A=verhaeltnis;
    A=find(verhaeltnis==max(verhaeltnis));
   

end
 
Private Nachricht senden Benutzer-Profile anzeigen


Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 22.01.2011, 00:05     Titel:
  Antworten mit Zitat      
Hallo,

ich habe mir deinen Code nicht angeschaut, aber wenn du nur die Otsu Methode zum Fenstern von Bildern nutzen möchtest, dann verwende doch den in Matlab bereits enthaltenen Befehl:
Code:

Dieser verwendet die Otsu Methode standardmäßig.

Mit
Code:

kanst du dir auch den Code anschauen. So solltest du deinen Fehler wohl auch selber finden.

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
DIY
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 21.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.01.2011, 15:29     Titel:
  Antworten mit Zitat      
Hallo Sco,

ich soll die Funktion für eine Übungsaufgabe in der Uni selbst schreiben.

in die graythresh func von matlab reinzuschaun hat mir bis jetzt auch noch nicht weiter geholfen.
Selbe Problem wie in meinem ersten Post besteht immernoch.

Ich werd es weiter testenund im Notfall versuchen mit dem Isodata-Verfahren einen vernünftigen Schwellwert zu finden.

Wir können uns in der Aufgabenstellung zwischen Otsu, Isodata und Dreiecksverfahren entscheiden.


mfg DIY
Private Nachricht senden Benutzer-Profile anzeigen
 
DIY
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 21.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.01.2011, 18:53     Titel:
  Antworten mit Zitat      
kann geclosed werden...
Waren einfach ne Menge Fehler in der Funktion sowie in der eigentlichen Berechnung.
Falls jemand die Funktion auch braucht. einfach mal per PM melden.
Dann kann ich einen Ansatz geben wir man da rangeht.


schönen Sonntag noch.
Private Nachricht senden Benutzer-Profile anzeigen
 
Björn

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.01.2011, 19:31     Titel:
  Antworten mit Zitat      
Du hast einen Fehler bei:


Du berechnest da nicht die Summe sondern berechnest die Summe aus einer Zahl, die ja trivialerweise die Zahl ist Wink

Richtig aussehen müsste es dann so:


%Varianzen der Klassen berechnen
%für K0
varK0 = 0;
for g=1:t0
varK0= varK0 +((g-gMittelK0)^2*P(g));
end

%für K1
varK1 = 0;
for g=t0+1:255
varK1= varK1 +((g-gMittelK1)^2*P(g));
end

Habs eben ausprobiert, so funktioniert es^^

Hoffe das hilft dir!

MfG Björn
 
Björn

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.01.2011, 19:34     Titel:
  Antworten mit Zitat      
Ups xD Sollte eigtl. so aussehen(blödes Copy&Paste):

Du hast einen Fehler bei:

Code:

        %Varianzen beider Klassen berechnen
        %für K0
        for g=1:1:t0
            varK0=sum((g-gStrichK0)^2*p(g));
        end    

        %für K1
        for g=t0+1:255
            varK1=sum((g-gStrichK1)^2*p(g));
        end
 


Du berechnest da nicht die Summe sondern berechnest die Summe aus einer Zahl, die ja trivialerweise die Zahl ist Wink

Richtig aussehen müsste es dann so:

Code:


    %Varianzen der Klassen berechnen
    %für K0
    varK0 = 0;
    for g=1:t0
            varK0= varK0 +((g-gMittelK0)^2*P(g));
    end
   
    %für K1
    varK1 = 0;
    for g=t0+1:255
            varK1= varK1 +((g-gMittelK1)^2*P(g));
    end

 


Habs eben ausprobiert, so funktioniert es^^

Hoffe das hilft dir!

MfG Björn

[/code]
 
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.