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

Maximum aus Gauß Fit anzeigen lassen

 

HansiHans
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.11.2014, 09:37     Titel: Maximum aus Gauß Fit anzeigen lassen
  Antworten mit Zitat      
Hallo Leute!
Habe ein Programm geschrieben, welches mir Bilder einliest und auswertet. Über meinen Plot habe ich dann einen Gauß Fit gelegt.
Kann mir jemand sagen wie ich mir von dem Gauß Fit die Bild Nummer anzeigen lassen kann?
Ich möchte also meinen x Wert beim Maximum meines Gauß Fits anzeigen lassen. (ein Bild vom Plot befindet sich im Anhang)
Um die Daten zu fitten habe ich folgende Funktion verwendet:


Code:
[xData, yData] = prepareCurveData( x, G );

% Set up fittype and options.
ft = fittype( 'gauss1' );
opts = fitoptions( 'Method', 'NonlinearLeastSquares' );
opts.Display = 'Off';
opts.Lower = [-Inf -Inf 0];
opts.StartPoint = [8914098 25 10.2975478327667];

% Fit model to data.
[fitresult, gof] = fit( xData, yData, ft, opts );
%Höchstwert von Gauß=Fitresult ausgeben


% Plot fit with data.
hold on; figure( 'Name', 'untitled fit 1' );
h = plot( fitresult, xData, yData );

legend( h, 'Gaussfit', 'untitled fit 1', 'Location', 'NorthEast' );
% Label axes
xlabel ImageNumber
ylabel a.u
grid on



Ich habe es ganz einfach mit Peak=max(fitresult) probiert. Funktioniert aber leider nicht.

Wäre über Hilfe sehr dankbar.

Beste Grüße
Hans
Private Nachricht senden Benutzer-Profile anzeigen


Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 27.11.2014, 13:41     Titel:
  Antworten mit Zitat      
"fitresult" ist ja ein Objekt vom Typ "cfit" und dürfte wenn ich das recht verstehe aus einem Modell (== Funktionsformel) und Pametern bestehen. Ich kann mir verschiedene Wege vorstellen das Maximum zu Berechnen. Vielleicht am einfachsten im allgemenen Fall ist einen Vektor mit "X Werten" zu erstellen und den dann mit "feval" des cfit Objektes auswerten. Und dann halt davon das Maximum finden lassen

Im Fall einer Normalverteilung wohl noch einfacher, weill man ja den Parameter für die Mitte hat und damit den Ort des Maximums.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
HansiHans
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.12.2014, 09:11     Titel:
  Antworten mit Zitat      
Hi Andreas,

kannst du mir das genauer erläutern? Ich bin ein absoluter Anfänger in Sachen MatLab-Programmierung.

Danke
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 01.12.2014, 09:51     Titel:
  Antworten mit Zitat      
Kann gerne was schreiben, dann aber am besten gleich mit den echten Daten.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
HansiHans
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.12.2014, 14:52     Titel:
  Antworten mit Zitat      
Hi,

das wäre super. Was brauchst du alles von mir?
Mein bisher geschriebenes Programm?

Hans
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 01.12.2014, 16:01     Titel:
  Antworten mit Zitat      
Der Output des FIT Befehles als MAT File.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
HansiHans
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.12.2014, 18:23     Titel:
  Antworten mit Zitat      
Hi, ich leg dir jetzt mal meinen Output rein, sowie die Innere Funktion.

Hoffe du kannst mir weiterhelfen. Beste Grüße

Code:
n=21;
x=0;
    for i=1:n,          %es werden 22 Images durchgezählt
   
    filename = ['Stahl_' num2str(i) '.bmp'];     %Ordner der Bilder auswählen,
                                                  %num2str(i) legt bei den Bildern die _1 _2 usw. an
  x(i)=i;
 
 
    [Bild, colorMap] = imread(filename);          %Ändert Bild um, speichert es ab und liest es wieder ein  
    colormap(colorMap);
    colorbar;
    Raw_Img = ind2rgb(Bild, colorMap);
    imwrite(Raw_Img,'Ppapier.bmp');
    filename = ['Ppapier.bmp'];
    Raw_Img=imread(filename);
   
    G(i)=AUTOKORRELATIONPEAK(Raw_Img);
   
    delete('Ppapier.bmp');
    end



[xData, yData] = prepareCurveData( x, G );

% Set up fittype and options.
ft = fittype( 'gauss1' );
opts = fitoptions( 'Method', 'NonlinearLeastSquares' );
opts.Display = 'Off';
opts.Lower = [-Inf -Inf 0];
opts.StartPoint = [8914098 25 10.2975478327667];

% Fit model to data.
[fitresult, gof] = fit( xData, yData, ft, opts );
%Höchstwert von Gauß=Fitresult ausgeben



% Plot fit with data.
figure( 'Name', 'untitled fit 1' );
h = plot( fitresult, xData, yData );

legend( h, 'Gaussfit', 'untitled fit 1', 'Location', 'NorthEast' );
% Label axes
xlabel ImageNumber
ylabel a.u
grid on




Innere Funktion (G(i)=AUTOKORRELATIONPEAK(Raw_Img)Wink
Code:

function [PeakAutocorr]=PeakA(I)

Raw_Img=rgb2gray(I);
G=fspecial('gaussian',[5 5],2);
Raw_Img=imfilter(Raw_Img,G,'same');
B=double(Raw_Img);  %In double umändern
C=xcorr2(B);        %Autokorrelation mit Bild selbst
%figure, imshow(C);

PeakAutocorr=max(C(:));

end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 02.12.2014, 13:50     Titel:
  Antworten mit Zitat      
Ich bräuchte die Daten, nicht den Code.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
HansiHans
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2014, 09:09     Titel:
  Antworten mit Zitat      
du meinst die daten der messpunkte?
Aber die sind bei mir ja immer anders je nachdem welche Bildreihen ich einlese?
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 08.12.2014, 10:06     Titel:
  Antworten mit Zitat      
Ja, aber nur so kann ich es exemplarisch vorführen.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
HansiHans
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2014, 15:16     Titel:
  Antworten mit Zitat      
Also die Werte für G(Y-Achse) sind
3900238 3901932 4057300 4173983 4401737 4519637 4546606 4675312 4688290 4904967 4766142 4800311 4853610 4863976 4911800 4745168 4843313 4764165 4874951 4857886 4816568
und für x dann einfach 1-21

brauchst du noch mehr?
Danke und beste Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 08.12.2014, 16:05     Titel:
  Antworten mit Zitat      
Nun, bitte immer daran denken es denn Helfern einfach zu machen bitte..

Meine Vorgehensweise:

Code:

x=1:21;
y=[3900238 3901932 4057300 4173983 4401737 4519637 4546606 4675312 4688290 4904967 4766142 4800311 4853610 4863976 4911800 4745168 4843313 4764165 4874951 4857886 4816568];
cftool
 


Dann x Data, y Data entsprechend auswählen und Gaussian als Fit-Type. Dann wird soweit alles automatisch berechnet. Im Menü Fit -> Save To Workspace wählen. Ich habe als Namen 'fittedgomatlabgauss' genommen. Dieses cfit Objekt im Workspace ist das was ich gerne gehabt hätte.

Mit dem FEVAL Befehl kann man jetzt z.B. für jeden X Wert den gefitteten Y Wert bekommen, z.B.:

Code:

feval(fittedgomatlabgauss, 5)
ans =
   4.3372e+06
 


Das geht dann natürlich auch für einen Vektor von X Werten. Da wir wissen, das Maximum ist irgenwo zwischen 1 und 21:


Code:

xvec=[1:21]; [a,b]=max(feval(fittedgomatlabgauss, xvec))
a =
   4.9022e+06
b =
    15
 


Also das Maximum ist am 15. Wert und liegt bei 4,9 Millionen. Geht natürlich noch feiner, also z.B.

Code:

xvec=[1:0.1:21]; [a,b]=max(feval(fittedgomatlabgauss, xvec))
a =
   4.9031e+06
b =
   145
 


Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
HansiHans
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2014, 17:16     Titel:
  Antworten mit Zitat      
Hi Andreas,

danke es funktioniert.

Beste Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
HansiHans
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2014, 16:39     Titel:
  Antworten mit Zitat      
Hallo Andreas,

wäre es auch möglich, wenn ich in einem einzelnen Programm für verschiedene Fits die Bildnummern ausgeben lasse das in einer Tabelle darstellen zu lassen?

Ich kriege z.B. für verschiedene Funktionen Verschiedene Bildnummern:
GaußFit = Bildnummer 5
Polynomfit= Bildnummer 7
usw.
kann ich mir diese Ergebnisse dann in einer Tabelle anzeigen lassen?
Oder ist es nur möglich dass es unten im Command Window erscheint?

Gruß
Hans
Private Nachricht senden Benutzer-Profile anzeigen
 
HansiHans
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2014, 17:24     Titel:
  Antworten mit Zitat      
Hätte auch noch ein anderes Anliegen.

Deine Funktion gibt mir jetzt zwar die y-x-Werte aus aber nur für die ganzen Zahlen.
Sprich eine 7 oder 8.
Oder eben das Minimum von 120,5 obwohl das Minimum bei 7,6 liegen würde.
An was könnte das liegen?

Danke und Beste Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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 - 2025 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.