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

Ermittlung des Phasenübergangs aus Videodatei

 

eibyks
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 08.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.06.2014, 12:14     Titel: Ermittlung des Phasenübergangs aus Videodatei
  Antworten mit Zitat      
Hallo,
ich brauche etwas Hilfe bei der Optimierung meines Programms. Die Idee ist folgende, In einem Kanal befindet sich eine zweiphasige Flüssigkeit (Blau und Weiß) , die Trennlinie befindet sich in der Kanalmitte. Auf die Blaue Seite wird ein Sinusimpuls gegeben der das Fluid auslenkt. Bei kleinen Frequenzen kann man dann im Kanal sehr schön die Ausbreitung des Signals beobachten. Das ganze nehme ich dann als Video auf. Dazu kann ich die Aufnahme direkt auf den relevanten Bereich beschränken und je nach Wunsch mit bis zu 500fps aufnehmen. Als nächste möchte ich anhand des Videos aussagen über das Übertragungsverhalten treffen. Dazu habe ich mir nachfolgendes Programm gebastelt. Dazu ermittle ich für jedes Bild die Phasengrenze. An sich bin ich mit dem Ergebnis ganz zufrieden, jedoch denke ich, dass das ganze noch gewaltiges Optimierungspotential hat. Da dies aber mein erstes richtiges MatLab-Projekt ist würde ich gerne wissen was ich hier und da anders machen sollte.

Ich würde hier jetzt einfach Schritt für Schritt beschreiben was ich mache und das Programm als Datei anhängen.

1. lese ich die Videodatei aus und speichere die für mich relevanten Grauwerte

Code:
mov = VideoReader('test_.avi') %Einlesen der Videodaten (Frames)

% Einstellungen für die Anzahl der eingeladenen Bilder und die betrachteten
% Pixel
Anzahl_Bilder=178;
i=1


 for (r = 1:Anzahl_Bilder )
      clearvars -except mov Anzahl_Bilder r Erg i
     Bilddaten=read(mov,r)     % Bilddaten für gewünschtes Bild in "Bilddaten" schreiben
     Bilddaten=Bilddaten(:,4,1)     % Auswahl der Grauwerte (alle R-Werte aus Spalte 4
     
     Bilddaten=double(Bilddaten)     % Datentyp in double umändern
for (o=1:140)              % Eine Zeile hat 140 Pixel
    Bilddaten_2(o)=Bilddaten(o)  % aus nx1, 1xn Matrix machen
end


Die Kurve aus den Bilddaten (siehe Anhang Bilddaten 2) zeigt in der Kurvenmitte den für mich relevanten Bereich. Da die Kurve ziemlich verrauscht ist wende ich zum glätten zunächst einen Gaußfilter und anschließend die polyfit und polyval Funktion an.

Code:
% Filter (gleitender Mittelwert (Gauß) zum Glätten des Signals
windowSize = 7;  
g=filter(ones(1,windowSize)/windowSize,1,Bilddaten_2)  

L2 = length(g);           % Anzahl der Datenpunkte (x-Achse)
x2=1:1:L2;                   % Normierung der x-Achse
n2=3;                        % Ordnung

xx2=1:0.1:L2;                % Normierung der polyval x-Achse

p = polyfit(x2,g,n2) % berechnet die Koeffizienten
pp = polyval(p,xx2) % auswertung des polynoms


Die Ergebnisse sind als g und pp im Anhang zu betrachten.

Da ich nun eine schöne Glatte Kurve habe möchte ich die Daten auf den für mich relevanten Bereich beschränken. Anhand der Kurvenform kann man erkennen, dass dieser Bereich zwischen dem Maxima und dem daurauffolgenden Minima liegt.

Code:
% Suche nach Maximum und Minimum
for (o=2:length(pp)-1)
    if (pp(o)>pp(o-1)& pp(o)>pp(o+1))
        S1=o
         for (j=o:length(pp)-1)
                   if (pp(j)<=pp(j-1) & pp(j)<=pp(j+1))
                     S2=j
                     break,
                  end
          end
    end
end

% Neue Kurve für den relevanten Bereich erzeugen
 for (o=S1:S2)
    Kurve(o-S1+1)=pp(o)
 end


Die Nun erhaltenen Kurve leite ich 2 mal ab und erhalte durch Nullsetzen den Wendepunkt. Die Position des Wendepunktes Speicher ich dann in einem Array und führe das ganze für die restlichen Frames aus.

Code:
%Ableitung der neuen Kurve
ableitung1 = diff (Kurve);          % 1. Ableitung von p (polyfit)
ableitung2 = diff (ableitung1); % 2. Ableitung von p (polyfit)

% Wendepunkt bestimmen
for k=1:length(ableitung2)-1
    if (ableitung2(k)<0 & ableitung2(k+1)>0) | (ableitung2(k)>0 & ableitung2(k+1)<0)
             
                yWert=round(k*0.1)
                Wendepunkt =k*0.1+S1-1 % Position des Wendepunktes auf der x-Achse
               
               
    end
end
i=i+1
double Erg(i);
Erg(i)= Wendepunkt; % Speichern der x-Werte des Wendepunktes in Array

 end


Aus der erhaltenen Kurve (Kurve, siehe Anhang) möchte ich im nächsten Schritt die Frequenz bestimmen.

Dazu glätte ich das ganze wieder mit einem Gaußfilter, bilde die erste Ableitung und bestimme die Extrempunkte:

Code:
windowSize = 7;  
Erg2=filter(ones(1,windowSize)/windowSize,1,Erg);
Erg2=filter(ones(1,windowSize)/windowSize,1,Erg2)


ableitung11 = diff(Erg2);          % 1. Ableitung von p (polyfit)

for k=1:length(ableitung11)-1
    if (ableitung11(k)<0 & ableitung11(k+1)>0) | (ableitung11(k)>0 & ableitung11(k+1)<0)
             
                yWert=round(k*0.01)
                E(k) =k*0.01 % Position des Wendepunktes auf der x-Achse
               
    end

end


Nun hatte ich teilweise das Problem, dass für mehrere nebeneinander liegende Werte die erste Abl. Null wurde. Daher habe ich für diesen Fall die benachbarten Werte Null gesetzt. Dies ist einer der Punkte mit denen ich unzufrieden bin.

Code:

% Für den Fall das es mehrere Werte nacheinander gibt für die die 1.Abl=0
% ist werden die benachbarten auf 0 gesetzt

l1=1
for l=2:length(E)-1
    if (E(l)> E(l+1) &E(l)> E(l-1))
        E(l+1)=0
        E(l-1)=0
       
    end
end


Im nächsten Schritt schmeiße ich die Nullen aus meinem Array raus und bestimme anschließend die Periodenlänge.

Code:
% Alle Extrempunkte in eigenem Array speichern
l1=1
for l=1:length(E)
    if (E(l)>0)
        Z(l1)=l
        l1=l1+1
    end
end

% Periodenlänge bestimmen
l1=1
for f=4:2:length(Z)
    Dauer(l1)=Z(f)-Z(f-2)
    l1=l1+1
end


Abschließend bestimme ich die Frequenz anhand der Periodenlänge und der fps:

Code:
% bestimmung der Frequenz
Dauer1=mean(Dauer) % Mittelwert aus allen Perioden
P = (Dauer1/24.72)
Frequenz= 1/P


als Ergebnis bekomme ich aus einem angelegten 1Hz-Signal eine Frequenz von 0,9631Hz heraus. Nur weiß ich leider nicht was mein Ergebnis wirklich wert ist. Als nächsten Schritt wollte ich noch eine Nullmessung machen (Nur Weiße Phase im Kanal) und diese jeweils am Anfang Abziehen, in der Hoffnung das das Signal dann weniger verrauscht ist.

Falls jemand noch eine Idee hat wie ich das ganze besser oder auch einfach nur elganter lösen kann dann wäre ich ihm sehr Dankbar.

Die Videodatei und das Programm hänge ich im Nächsten Post drann.

Erg.fig
 Beschreibung:

Download
 Dateiname:  Erg.fig
 Dateigröße:  2.36 KB
 Heruntergeladen:  193 mal
Kurve.fig
 Beschreibung:

Download
 Dateiname:  Kurve.fig
 Dateigröße:  6.92 KB
 Heruntergeladen:  209 mal
pp.fig
 Beschreibung:

Download
 Dateiname:  pp.fig
 Dateigröße:  14 KB
 Heruntergeladen:  194 mal
g.fig
 Beschreibung:

Download
 Dateiname:  g.fig
 Dateigröße:  2.18 KB
 Heruntergeladen:  200 mal
Bilddaten_2.fig
 Beschreibung:

Download
 Dateiname:  Bilddaten_2.fig
 Dateigröße:  1.87 KB
 Heruntergeladen:  197 mal


Zuletzt bearbeitet von eibyks am 04.06.2014, 12:21, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen


eibyks
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 08.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.06.2014, 12:17     Titel:
  Antworten mit Zitat      
Hier noch das m.File da ich das Video hier irgendwie nicht anhängen kann nehme ich ein Beipielbild damit ihr eine Vorstellung habt wie das ganze aussieht

test__avi2jpeg-139.jpg
 Beschreibung:

Download
 Dateiname:  test__avi2jpeg-139.jpg
 Dateigröße:  805 Bytes
 Heruntergeladen:  203 mal
Kurvenform.m
 Beschreibung:

Download
 Dateiname:  Kurvenform.m
 Dateigröße:  3.07 KB
 Heruntergeladen:  202 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Andy386
Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 16.06.2014, 13:35     Titel:
  Antworten mit Zitat      
Öh, suchst du eine Geschwindigkeitsoptimierung? Oder direkt was am Algorithmus? Wenn schon ungefähr das rauskommt, was du erwartest, passt es doch...

Um zu schauen, wo die Rechenzeit drauf geht eignet sich
Code:
sehr gut.
_________________

Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
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 - 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.