Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Bücher:

Robotik mit MATLAB

Fachkräfte:
weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Schichtbilder in Array speichern

 

semm0
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 04.09.08
Wohnort: BaWü
Version: Octave 3.0.0
     Beitrag Verfasst am: 04.09.2008, 15:14     Titel: Schichtbilder in Array speichern
  Antworten mit Zitat      
Hallo liebe Forum Nutzer,

nachdem ich nun den ganzen Tag schon suche und probiere bin ich zu keiner Lösung gekommen. Ich benutze Octave 3.0.0.

Mein Problem:
Ich möchte S/W Schichtbilder in ein Array speichern. Oder auch eine andere Struktur, falls diese performanter wäre.
Mein momentaner Testdatensatz hat die Dimensionen: 256x256x110. Ein Bild hat die Auflösung 256x256, insgesamt 110 Bilder.
Zum einlesen der Daten dient folgende Funktion:

Code:

function [data,x,y,z]=readaz(name);
%READAZ [data,x,y,z]=readaz(name) reads an analyze image to a
%   two-dimensional array of data whose colums hold the
%   frames of the volume-data.
%   Image data are stored in the array 'data', the size
%   of the volume is stored in the parameters x=width,
%   y=height, z=number of images
%
%   (c) Werner Backfrieder 1996
%   Dept.Biomedical Engineering & Physics
%   University of Vienna

dummy=[name,'.hdr'];
fid=fopen(dummy,'r');
fseek(fid,42,'bof');
x=fread(fid,[1,1],'short');
y=fread(fid,[1,1],'short');
z=fread(fid,[1,1],'short');
fseek(fid,70,'bof');
type=fread(fid,[1,1],'short');
fclose(fid);

if type==2
    flag='uchar';
end;
if type==4
   flag='short';
end;
if type==8
   flag='int';
end;
if type==16
   flag='float';
end;
if type==32
   fprintf('\n not able to load complex data');
   return;
end
if type==64
   flag='double';
end;

dummy=[name,'.img'];
fid=fopen(dummy,'r');
data=fread(fid,[x*y,z],flag);
fclose(fid);

return
 


Soweit sogut, das funktioniert und ich kann mir ein Bild anzeigen lassen mit:
Code:

bild=zeros(256); for k=1:256 bild(k,:)=data((256*(k-1)+1):(256*k),1); end
colormap(gray)
image(bild)
 


Nun möchte ich die Bilder in ein Array o.Ä. speichern um später das Array bzw Matrix drehen zu können.

Vielen Dank für eien Tip!

Grüße
Simon
Private Nachricht senden Benutzer-Profile anzeigen
Verschoben: 04.09.2008, 15:23 Uhr von nschlange
Von Programmierung nach Octave-Forum


nschlange
Ehrenmitglied

Ehrenmitglied



Beiträge: 1.311
Anmeldedatum: 06.09.07
Wohnort: NRW
Version: R2007b
     Beitrag Verfasst am: 04.09.2008, 16:48     Titel:
  Antworten mit Zitat      
Hi,

Octave hat glaube ich auch Cell Arrays, damit müsste das bequem zu machen sein.

Edit: Zur Anwendung von Cell Arrays kannst Du auch hier im Forum suchen. Dazu gibt es einige Beiträge.
_________________

Viele Grüße
nschlange

"Chuck Norris ejakuliert fluessigen Stahl!"
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
semm0
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 04.09.08
Wohnort: BaWü
Version: Octave 3.0.0
     Beitrag Verfasst am: 04.09.2008, 17:01     Titel:
  Antworten mit Zitat      
Hi nschlange,

vielen Dank für den Hinweis. Lese gerade über cell arrays und werde hier im forum suchen.
Wenn ich etwas habe, poste ich gerne eine Lösung!

Danke & Grüße
simon
Private Nachricht senden Benutzer-Profile anzeigen
 
semm0
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 04.09.08
Wohnort: BaWü
Version: Octave 3.0.0
     Beitrag Verfasst am: 04.09.2008, 17:52     Titel:
  Antworten mit Zitat      
hmm scheinbar hab ich ein brett vor dem kopf nach dem ganzen tag probieren. sorry aber ich kriege es nicht so hin wie ich gerne möchte Sad

habe das hier probiert

Code:

schicht=cell(110,1);
for b=1:3
   %bild=zeros(256);
   for c=1:y
      bild(c,:)=data((256*(c-1)+1):(256*c),55);
   end
   schicht={b,bild};
end
 

aber irgendwie bringt das nicht wirklich was. dachte ich kann dann recht simpel darauf zugreifen. habe das mal nur für schicht 55 gemacht.. bzw dreimal immer das gleiche bild...

sorry für diese anfängerfragen..
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 04.09.2008, 18:38     Titel:
  Antworten mit Zitat      
Hallo simon,

sind in data alle 256x256x110 informationen drin? Dann geht vielleicht dies:

Code:
bild = reshape(data,x,y,z);
colormap(gray)
for k = 5:10
    figure(k)
    image(squeeze(bild(:,:,z)));
end


bild ist ein 3D-Array, das alle Daten enthält. Die Schleife zeigt die Bilder der Schichten 5 bis 10 in jeweils eigenen figures an. 110 figures sollte man nicht unbedingt gleichzeitig aufmachen... Wink

Ansonsten ist mir nicht ganz klar, was du drehen möchtest. Wenn Du das Ziel noch näher beschriebst, fällt auch das Helfen leichter. Smile

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
semm0
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 04.09.08
Wohnort: BaWü
Version: Octave 3.0.0
     Beitrag Verfasst am: 04.09.2008, 18:57     Titel:
  Antworten mit Zitat      
hey Bijick,

wow vielen Dank schonmal. Gerade mal nachgelesen was die Befehle so machen. Leider kriege ich nur einfarbige Bilder. EDIT: Das gesamte Bild ist einfach blau.

Die Daten werden mit

Code:

dummy=[name,'.img'];
fid=fopen(dummy,'r');
data=fread(fid,[x*y,z],flag);
 

eingelesen. Die Variablen x,y,z werden zuvor mit Informationen aus einer Header Datei belegt. Hierbei gehts um CT-Bilder im Analyze Format. Einlesen klappt, ein Bild alleine anschauen geht auch.
Ich möchte alle 110 Schichtbilder der Dimension 256x256 ablegen. Später sollen hier Raycasting Techniken angewandt werden (MW, Maximum Intensity Projection usw). Von daher auch der Wunsch, das ganze "drehen" zu können. Es soll möglich werden, Linienintegrale durch die Daten zu berechnen, um später eine 2D-Projektion des 3D-Datensatzes abbilden zu können....

Das nächste Ziel ist es, durch Angabe der X-Y Koordinaten komplett auf der Z Ebene durch die Daten zu laufen. Also alle Werte für ein Pixel der 2D-Projektion berechnen zu können.


VIELEN Dank schonmal!!

Grüße
Simon
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 05.09.2008, 09:43     Titel:
  Antworten mit Zitat      
Hallo Simon,

ja, da waren so einige Fehler in meinem Code, sorry. Ich revidiere.

1. Schritt: Korrektur der Schleife. Die colormap muss nach dem image-Befehl gesetzt werden. Wie peinlich. Der Index in bild muss natürlich k sein, nicht z.

2. Schritt: Anpassen der Farbskala an den Wertebereich. Da Du keine RGB-Werte hast, sondern nur eine 256x256-Matrix pro Bild, ist die automatische Einstellung, dass die Werte direkt in die Farbskala übernommen werden. Richtig ist hier aber eine Skalierung, sodass die ganze Farbpalette ausgeschöpft wird (Hilfeseite zu image, der Kasten bei Remarks).

Das hier müsste jetzt klappen:
Code:
bild = reshape(data,x,y,z);

for k = 5:10
    figure(k)
    image(squeeze(bild(:,:,k)),'CDataMapping','scaled');
    colormap(gray)
end


Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
semm0
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 04.09.08
Wohnort: BaWü
Version: Octave 3.0.0
     Beitrag Verfasst am: 05.09.2008, 10:16     Titel:
  Antworten mit Zitat      
Hallo Bijick,

wow. Funktioniert! Ich bin beeindruckt wie schnell dieser Code ist. Meine for-Schleifen Variante hatte für eine Schicht so 1-2 Sekunden benötigt...

Dann werde ich weiterarbeiten daran.

VIELEN DANK!!

Ich werde mich bestimmt nochmal melden...

Viele Grüße,
Simon
Private Nachricht senden Benutzer-Profile anzeigen
 
semm0
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 04.09.08
Wohnort: BaWü
Version: Octave 3.0.0
     Beitrag Verfasst am: 08.09.2008, 10:53     Titel:
  Antworten mit Zitat      
Soo nun habe ich herumprobiert, aber schaffe es schon wieder nicht so wie ich es gerne hätte.

Ich würde nun gerne die Daten in Z-Richtung (also über alle 110 Schichten) in eine Datenstruktur legen. Und zwar immer für einen Punkt X,Y. Also so dass ich alle Daten hintereinander in Z-Richtung für einen Bildpunkt X,Y habe...

Das müsste ja auch mit reshape funktionieren, allerdings habe ich es nicht hinbekommen :/

VIele Dank schonmal,
Grüße
Simon
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 08.09.2008, 13:12     Titel:
  Antworten mit Zitat      
Hallo Simon,

auf diese Daten kannst Du durch die Variable bild zugreifen. Für jedes x0 und jedes y0 ergibt

Code:
vec = bild(x0,y0,:);


den gewünschten 1x110-Vektor. Je nachdem, was du damit genau vorhast, geht es mit oder ohne Schleife.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
semm0
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 04.09.08
Wohnort: BaWü
Version: Octave 3.0.0
     Beitrag Verfasst am: 11.09.2008, 14:21     Titel:
  Antworten mit Zitat      
HI Bijick,

habe nun ein wenig weitermacht und bin bei folgendem Code angekommen:

Code:

fb=zeros(256,256);
tic;
for i=1:256
   for j=1:256
      linie = bild(i,j,:);
      %Mittelwertdarstellung:
      fb(i,j)=(sum(linie)/256);
     
      %MIP
      %fb(i,j)=max(linie);
   end
end
toc;
colormap(gray);
image(fb);
 


Das funktioniert auch schon so wie es soll. Gäbe es hier noch Optimierungsansätze? Oder lässt es sich hier nicht anders als mit den beiden Schleifen realisieren?

Viele Grüße
Simon
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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2021 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.