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

Infrarot-Bilder automatisiert auswerten

 

Radi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.02.2013, 16:33     Titel: Infrarot-Bilder automatisiert auswerten
  Antworten mit Zitat      
Hallo Leute!

Ich bin derzeit an meiner Dipl.-Arbeit und führe eine Energiebilanzierung an einem Dieselmotor durch. Um die Strahlung und Konvektion zu berechnen, verwenden wir eine Infrarotkamera, um die Oberflächentemperatur aufzunehmen.

D.h. die Kamera ist statisch und ich erstelle für bestimmte Betriebszustände ein Bild. Einige Teile des Motors werden durch einfach geometrische Körper aproximiert und diesen Körpern weise ich durch die Aufnahmen danach die Temperatur zu.

Da die Punkte immer an der selben Stelle im Bild liegen, quasi immer die gleichen Pixel, möchte ich das gerne automatisieren.

Eigentlich ist das sehr simpel:
- Bilder einlesen
- RGB Werte von definierten Pixeln in einem (Excel)Tabelle schreiben-> (pro Bild eine Zeile, pro Punkt 3 spalten (RGB) nebeneinander)
- Mit einer vorher angegebenen Temperatur/Farb-Beziehung vergleichen
- Temperatur der Punkte in eine Tabelle schreiben (pro bild 1 Zeile, pro Pixel eine Spalte)

Leider muss ich zu meiner Schande gestehen dass ich absolut keine Ahnung von Matlab-Programmierung habe Sad Ich weiß dass ich bilder einlesen kann mit "imread" und mir Pixelwerte mit "pixel1" ausgeben lassen kann. Allerdings hab ich keine Ahnung wie ich das programmiertechnisch umsetzen muss und erst recht nicht, wie ich das als Schleife etc. automatisiere ;(

Habt ihr Tipps? Wäre soooo gut denn ich werde ca. 480 Bilder haben und pro Bild 10 - 20 Pixel. Das per Hand zu machen wird OVerkill Sad

Liebe Grüße,
radi


Radi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.02.2013, 11:39     Titel: Stand 1
  Antworten mit Zitat      
Also ich habe jetzt ne funkction die so aussieht:

Code:
function []=bildereinlesen(fpath);

% fpath ist Pfad zu den Bildern
imglist=dir([fpath '*.jpg']); % Speichern der Namen aller jpegs

for k=1:length(imglist)
   
    bild=imread(imglist(k).name);
    % ... und dann einfach mit bild weiterarbeiten

end


diese rufe ich per "auswerte-m.file" auf und zwar so:

Code:
clear all;
clc;
fpath=['C:\...\Matlab\Bilder\'];
bildereinlesen(fpath);
 

(Directory nur fürs Forum gekürzt)

Jetzt gibt mir Matlab den Fehler bei imread zeile315 "File 001.jpg does not exist!"

Wieso? Er findet die Datei ja, sonst wüsste er ja nicht dass sie 001.jpg heißt.... Woher kommt das?
 
Radi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.02.2013, 12:03     Titel: Stand 2
  Antworten mit Zitat      
Ich habe jetzt die Funktion in dieser Art:

Code:
function []=bildereinlesen(fpath);

% fpath ist Pfad zu den Bildern
imglist=dir([fpath '*.jpg']); % Speichern der Namen aller jpegs

for k=1:length(imglist)
   
    bild{k}=imread([fpath imglist(k).name]);
    % ... und dann einfach mit bild weiterarbeiten

end


Es kommt keine Fehlermeldung mehr, aber es passiert auch nichts Question Müssten jetzt die Bilder nicht irgendwie im Workspace auftauchen?
Wie bekomme ich das hin, dass ich von allen Bildern die RGB-Werte einer Koordinate/eines Pixels in eine Matrix schreibe?
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.02.2013, 12:34     Titel:
  Antworten mit Zitat      
Hallo,

eine Funktion hat einen eigenen Workspace / Arbeitsbereich. Nach Abschluss der Funktion sind (von globalen oder statischen Variablen mal abgesehen) nur die Informationen verfügbar, die als Ausgabeargumente zurückgegeben werden.
Da du keine Ausgabeargumente angibst, ist auch nichts verfügbar.

Zitat:
Wie bekomme ich das hin, dass ich von allen Bildern die RGB-Werte einer Koordinate/eines Pixels in eine Matrix schreibe?


Wenn die Bilder alle die gleiche Größe haben, würde ich sie in einem 4D-Array statt einem Cell Array ablegen. Dann kannst du das problemlos durch Indizierung machen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
radi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.02.2013, 12:45     Titel:
  Antworten mit Zitat      
Vielen Dank schonmal!

Ok, das mit dem Workspace hab ich verstanden, nur wie schreibe ich das nach außen? Wenn ich das richtig verstanden habe, muss ich die Pixel innerhalb der Funktion definieren und in ein Array schreiben, da sonst quasi die geladenen Bilder nicht mehr verfügbar sind.

(btw. ich habe keine Ahnung was der Unterschied von einem Cell-Array zu einem 4D-Array ist Smile )
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.02.2013, 13:16     Titel:
  Antworten mit Zitat      
Hallo,

Funktionsdeklaration (1. Zeile) :
Code:
function [ergebnis1, ergebnis2]=bildereinlesen(fpath);


Funktionsaufruf:
Code:
[erg1, erg2] = bildereinlesen(pfad);


Natürlich kann die Anzahl der Rückgabeargumente variieren.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
radi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.02.2013, 13:53     Titel:
  Antworten mit Zitat      
ich bin nun auf folgendem Stand:

Code:
function [Tab]=bildereinlesen(fpath);

% fpath ist Pfad zu den Bildern
imglist=dir([fpath '*.jpg']); % Speichern der Namen aller jpegs

for k=1:length(imglist)
   
    bild=imread([fpath imglist(k).name]);
    % ... und dann einfach mit bild weiterarbeiten

Pix1=bild(1,1);
Pix2=bild(10,50);
Tab=[Pix1 Pix2]
end


Mit "Tab" soll mir eine Tabelle ausgegeben werden, in der die RGB-Werte der Pixel "Pix1", "Pix2", etc. stehen sollen.

Allerdings steht im Workspace immer nur der letzte Wert und das auch nicht als Vector sondern nur der "B-Wert" des "RGB-Signals" Sad

Die Werte müssen also nun noch in der Tabelle in folgender Weise gespeichert werden:


Code:
R(Bild1,Pix1) | g(Bild1,Pix1) | B(Bild1,Pix1) |  R(Bild1,Pix2) | g(Bild1,Pix2) | B(Bild1,Pix2) |  R(Bild1,Pix...) | g(Bild1,Pix...) | B(Bild1,Pix...)
R(Bild2,Pix1) | g(Bild2,Pix1) | B(Bild2,Pix1) |  R(Bild2,Pix2) | g(Bild2,Pix2) | B(Bild2,Pix2) |  R(Bild2,Pix...) | g(Bild2,Pix...) | B(Bild2,Pix...)
usw...


Sorry, aber ich bin echt Anfänger was sowas angeht Embarassed
 
radi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.02.2013, 14:11     Titel: neuer Stand
  Antworten mit Zitat      
Ich bin jetzt soweit, dass es mit den Zeilen schon mal passt. Es ist zwar pro pixel etwas arbeit aber das macht man einmal und gut ist.

Nur die Speicherung pro Bild in eine neue Zeile fehlt noch.

hier der aktuelle stand:

Code:
function [Tab]=bildereinlesen(fpath);

% fpath ist Pfad zu den Bildern
imglist=dir([fpath '*.jpg']); % Speichern der Namen aller jpegs

for k=1:length(imglist)
   
    bild=imread([fpath imglist(k).name]);
    % ... und dann einfach mit bild weiterarbeiten

RPix1=bild(1,1,1)
GPix1=bild(1,1,2)
BPix1=bild(1,1,3)

RPix2=bild(10,10,1)
GPix2=bild(10,10,2)
BPix2=bild(10,10,3)
end

Tab=[RPix1 GPix1 BPix1 RPix2 GPix2 BPix2]
 
radi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.02.2013, 15:20     Titel: Erfolg
  Antworten mit Zitat      
Geil ich habs hinbekommen:

Code:
function [Tab]=bildereinlesen(fpath);

% fpath ist Pfad zu den Bildern
imglist=dir([fpath '*.jpg']); % Speichern der Namen aller jpegs
Tab=zeros(length(imglist),6)
for k=1:length(imglist)
   
    bild=imread([fpath imglist(k).name]);
    % ... und dann einfach mit bild weiterarbeiten

        for i=1:1:3    ;
        Pix1(1,i)=bild(1,1,i);
        end;
       
        for i=1:1:3;
        Pix2(1,i)=bild(10,10,i);
        end;

        Tab(k,:)=[Pix1 Pix2]
end


Smile jetzt muss ich nur noch die Farbskala einbauen um die Zeilen mit Referenzwerten vergleichen zu können!
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 11.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.02.2013, 15:57     Titel:
  Antworten mit Zitat      
Hallo radi,

bevor Du jetzt anfängst, hunderte Variablen zu definieren
Code:

function [Tab]=bildereinlesen(fpath);

xy_positionen=[
1 1
10 10
5 13
];


% fpath ist Pfad zu den Bildern
imglist=dir([fpath '*.jpg']); % Speichern der Namen aller jpegs
Tab=zeros(length(imglist),size(xy_positionen,1)*3);
for k=1:length(imglist)
    bild=imread([fpath imglist(k).name]);
    ind = sub2ind(size(bild),xy_positionen(:,2),xy_positionen(:,1));
    bild = reshape(bild, [], 3);
    Tab(k,:)= reshape(bild(ind,:), 1, []);
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
radi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.02.2013, 17:54     Titel: Big Thanks
  Antworten mit Zitat      
hehe ich hab gewusst, dass man das noch eleganter lösen kann Very Happy

Danke Dir!
 
radi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.02.2013, 18:32     Titel: aaaaaahhhhhh....
  Antworten mit Zitat      
aaaahhhhhh ..... Achtung Smile

Da stimmt noch was nicht!

Mit obigem Code stimmt die Reihenfolge der Einträge in der Tabelle nicht mehr!

sie werden jetzt so eingeschrieben:

Code:

Bild1Pix1R | Bild1Pix2R | Bild1Pix3R | Bild1Pix1G | Bild1Pix2G | ...


anstatt

Code:

Bild1Pix1R | Bild1Pix1G | Bild1Pix1B | Bild1Pix2R | Bild1Pix2G | ...


Smile
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 11.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.02.2013, 09:48     Titel:
  Antworten mit Zitat      
Du mußt einfach die Matrix der Bildpunkte transponieren:
Code:
Tab(k,:) = reshape(bild(ind,:)', 1, []);
Private Nachricht senden Benutzer-Profile anzeigen
 
radi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.02.2013, 10:07     Titel:
  Antworten mit Zitat      
Sehr cool! Ja hab mir schon gedacht, dass man die Richtung einfach ändern muss, aber ich habe die Schritte des Codes nicht 100% verstanden, da ich die ganzen Befehle nicht kenne.

Vielen Dank für eure Mühe!
 
stubenfliege

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.07.2014, 10:56     Titel:
  Antworten mit Zitat      
Hallo,

ich arbeite gerade an einem ähnlichen Problem.

Ich würde gerne wissen, wie dass mit dem Einbauen der Farbskala und dem Vergleichen mit den Referenzwerten funktionieren kann.

Vielen Dank schon mal für eure Hilfe.
 
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.