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

R G B X Rawbild in Matlab einlesen

 

therealvash
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 15.11.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.05.2013, 20:13     Titel: R G B X Rawbild in Matlab einlesen
  Antworten mit Zitat      
Guten Abend allerseits!

Folgendes Problem beschäftigt mich seit einiger Zeit und da ich bisher keinen Lösungsweg gefunden habe setzte ich jetzt den Publikumsjoker ein.

Gegeben ist eine 640x480 Pixel Bilddatei mit folgender Datenstruktur:

R G B X R G B X R G B X........
Jede Information wird als 1 Byte gespeichert, X ist eine überflüssige 0, die leider immer dabei ist und das Bild ist ->Zeilenweise-< gespeichert.

Ingesamt ist die Datei also 640x480x4 Byte groß. Das geschickte Einlesen dieser habe ich inzwischen mit folgendem Befehl gelöst:
Code:

RAW=fread(datei,3,'3*uint8=>uint8',1)


Wem dies nichts sagt: Matlab ließt drei mal als uint8 ein (also 3 Byte) und überspringt danach ein Byte. Somit ist der X Wert schonmal raus und ich habe eine Variable mit den RGB Werten (921600x1 uint8)

Diesen langen Vector muss ich jetzt umformatieren zu 480x640x3

Als möglicherweise Sinnvolle Methoden habe ich bisher "reshape" und "permute" gefunden, jedoch komme ich da bisher auf keinen grünen Zweig.

Natürlich könnte man das Problem relativ einfach mit zwei bis drei Schleifen lösen, jedoch schätzte ich, dass diese Lösung sehr unperformant wäre und später ist mir eine schnelle Verarbeitung wichtig.

Als kleines Beispiel

Wie komme ich von (3 Breite x 2 Höhe x 3 Byte/Pixel)

Code:


zu

Code:
B(:,:,1) =
     1     4     7
    10    13    16

B(:,:,2) =
     2     5     8
    11    14    17

B(:,:,3) =
     3     6     9
    12    15    18


Vielen Dank schonmal!
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 27.05.2013, 22:04     Titel:
  Antworten mit Zitat      
mir fällt da auf die schnelle nur ne for schleife ein. aber es sind ja nicht viele werte
Code:
raw=1:640*480*3;
rgb=nan(640,480,3);
for j=1:640
    for k=1:480
        for l=1:3
            rgb(j,k,l)=raw(((j-1)*480)*3+(k-1)*3+l);
        end
    end
end

die zeit die ich bräuchte um mir ne vektor lösung zu überlegen bekomme ich durch rechenzeit ersparnis nie wieder rein ^^
Private Nachricht senden Benutzer-Profile anzeigen
 
therealvash
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 15.11.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.05.2013, 23:01     Titel:
  Antworten mit Zitat      
Hallo! Das Ganze muss später 30/Sekunde ausgeführt werden, weswegen ich vorsichtshalber auf Schleifen verzichten wollte, aber danke schonmal für die Mühe Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 28.05.2013, 08:10     Titel:
  Antworten mit Zitat      
Code:
raw=1:640*480*3;
rgb=nan(3,640,480);
rgb(1:length(raw))=raw;

ist jetzt nicht genau das was du wolltest aber nah drann wenn man den weiteren code einfach and die vertauschen indices anpasst
Code:
>> rgb(:,1,1)

ans =

     1
     2
     3

rgb(:,2,1)

ans =

     4
     5
     6
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 28.05.2013, 10:40     Titel: Re: R G B X Rawbild in Matlab einlesen
  Antworten mit Zitat      
Hallo therealvash,

Code:
A = 1:18;
B = permute(reshape(A, 3, 3, 2), [3, 2, 1]);

Wenn eine Umsortierung möglich ist, kann sie auch mit einem RESHAPE(PERMUTE(RESHAPE(M))) durchgeführt werden. Den dazugehörigen Beweis habe ich gerade vergessen. In Deinem Fall kann äußere RESHAPE wegfallen.
Wenn man gar nicht drauf kommt, kann man sich zur Not durch die lediglich 36 möglichen Fälle von Hand durcharbeiten.

Möglicherweise ist es schneller, die ganze Datei einzulesen und jedes 4. Element rauszuwerfen:
Code:
data = fread(fid, Inf, '*uint8');
data(4:4:end) = [];

Ein TIC/TOC wird zeigen, welche Variante effizienter ist.

Gruß, Jan

Zuletzt bearbeitet von Jan S am 28.05.2013, 11:46, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
therealvash
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 15.11.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.05.2013, 11:25     Titel:
  Antworten mit Zitat      
Code:
RAW=fread(datei,3,'3*uint8=>uint8',1)

Elapsed time is 0.032973 seconds.

Code:
image2 = fread(id, Inf, '*uint8');
image2(4:4:end) = [];

Elapsed time is 0.011877 seconds.

Faktor 3 schneller, danke Smile
Code:

IMAGE = permute(reshape(RAW, 3, 640, 480), [3, 2, 1]);
 

Funktioniert auch und braucht etwa 2ms. Vielen Dank für die schnelle Hilfe!
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.