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

Problem bei der Bildpositionierung mit "fliplr" et

 

Abdik
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 14.12.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.12.2010, 16:21     Titel: Problem bei der Bildpositionierung mit "fliplr" et
  Antworten mit Zitat      
Hallo zusammen,

Ich hoffe ihr könnt mir etwas helfen.

Als erstes mein Code was ich gerade bearbeite.

Code:
addpath('Z:\spm5')
addpath('Z:\Marie\kino\')

ProbNum = [6 7 8 11:24]

for i =1:length(ProbNum)
    path= strcat('Z:\Probanden Pool\Prob',num2str(ProbNum(i)),'\T1map\wrsProb',num2str(ProbNum(i)),'_T1.img');
    T1 = spm_vol(path);% Einlesen von SPM-Files
   
    mapT1 = spm_read_vols(T1) % Einlesen von SPM-Files
   
    % map=rot90(mapT1) % Korrektur der Position

   % Mittelwert_Atlant_H20= mean(mapT1)
   % Mean_Atlant_H20=mean(map)
   
  mk_kino(map)
 end


Das Problem ist, dass ich es nicht schaffe, die eingelesene Bilder um 90° zu rotieren. Ich habe es mit allen möglichen varianten versucht. Klappt einfach nicht.

Die Bilder sind MRT-Gehirnaufnahmen und müssen anschließend noch gemittelt werden.

Hier die eingelesenen Bildgrößen. 192x256x50. 50 stellt die Slicezahl dar.

Bei rot90 gibt es ein Fehlermeldung "A must be a 2-D matrix".

Ich verstehe das Problem zwar aber leider keine Lösung.

Ich wäre dankbar wenn ihr mir Tipps gibt.
_________________

ABDIKOGLU
Private Nachricht senden Benutzer-Profile anzeigen


Abdik
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 14.12.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.12.2010, 16:26     Titel:
  Antworten mit Zitat      
So sieht es besser aus.

Code:
addpath('Z:\spm5')
addpath('Z:\Marie\kino\')

ProbNum = [6 7 8 11:24]

for i =1:length(ProbNum)
    path= strcat('Z:\Probanden Pool\Prob',num2str(ProbNum(i)),'\T1map\wrsProb',num2str(ProbNum(i)),'_T1.img');
    T1 = spm_vol(path);% Einlesen von SPM-Files
    mapT1 = spm_read_vols(T1) % Einlesen von SPM-Files
   
    % map=rot90(mapT1) %Korrektur der Position

   % Mittelwert_Atlant_H20= mean(mapT1)
   % Mean_Atlant_H20=mean(map)
   
  mk_kino(map)
 end







 

_________________

ABDIKOGLU
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 14.12.2010, 18:15     Titel:
  Antworten mit Zitat      
Hallo,

1. bitte verwende das naechste mal die edit-Funktion, anstatt einen neuen Post zu erstellen, Danke.

Nun zu deinem Problem: Du koenntest in einer Schleife alle Schichten einzeln 90 Grad rotieren, z.B. mit
Code:

imrotate
 

und jeweils die einzelnen Bilder wieder in einer 3D Matrix abspeichern.

Es istr auch moeglich den gesamten Datensatz zu drehen, jedoch ist dies programiertechnich etwas aufwendiger und bei groesseren Matrizen extrem rechenaufwendig. Ich spreche hierbei aus Erfahrung, da ich genau dies im Zuge eines Projektes getan habe. Ich war jedoch in der gluecklichen Lage ueber eine Workstation zu verfuegen mit 64 Kernen + sehr viel Arbeitsspeicher. An allen "normalen" PC's kam nach wenigen Sekunden sofort: "OUT OF MEMORY". Falls es dich jedoch interessiert schau dir folgende Befehle an:
Code:

makehgtform
maketform
makeresampler
tformarray
 

und dieses Beispiel: http://blogs.mathworks.com/steve/20.....ree-dimensional-rotation/

Hoffe das Hilft erstmal

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
Abdik
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 14.12.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2010, 00:46     Titel:
  Antworten mit Zitat      
Danke dir Sco. Es hat geklappt. Sorry wegen dem neuen Post. Ich bin unerfahren und neu hier.

Nun hätte ich aber noch ein kleines Problem. Ich glaube du kennst hiermit gut aus. Deswegen würde ich dich nocht etwas Fragen. Mein Datenpalette besteht aus Probandenaufnahmen die für die quantitative MRT benutzt werden. Nun müssen diese Aufnahmen gemitttelt werden. Daraus ergibt sich dann gemittelte quantitative MRT Aufnahmen (so genannte mean_q-Atlanten) die dann mit anderen Atlanten wie median-Atlanten vergliechen werden.

Für die Mittelung habe ich bereits M = mean(A)
M = mean(A,dim) und B = mean2(A) versucht anzuwenden. Leider hatte ich aber nicht das richtige Ergebnis. Ich habe auch versucht ein zweites for-Schleife zu bilden und es mathematisch mit dem Formel der aritmetischen Mittelung zu lösen. War aber auch leider nicht erfolgreich.

Könntest du mir bitte noch ein Tipp geben, wie ich das noch lösen könnte?
_________________

ABDIKOGLU
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: 16.12.2010, 04:43     Titel:
  Antworten mit Zitat      
Hallo Abdik,

Zum ROT90-Problem fiel mir noch dies ein:
Matt Fetterman, "ROT90 IN 3D":
http://www.mathworks.com/matlabcentral/fileexchange/25546

Zitat:
Für die Mittelung habe ich bereits M = mean(A)
M = mean(A,dim) und B = mean2(A) versucht anzuwenden. Leider hatte ich aber nicht das richtige Ergebnis.

Dann beschreibe doch noch den Unterschied zwischen den jeweiligen Ergebnissen und dem, was Du suchst.

Du hast [192 x 256 x 50] Arrays. Welche Größe soll das Array denn nach der Mittelwertbildung haben?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Abdik
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 14.12.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2010, 12:27     Titel:
  Antworten mit Zitat      
Hallo Jan S,

Das Problem mit Rotation habe ich bereits gelöst. Danke für dein Tipp.

Es sieht folgendermaßen aus.

Code:


A=mean(B) % erzeugt ein Datensatz der Größe [1 X   256 X   50]

A=mean(B,2) % erzeugt ein Datensatz der Größe [192 X 1X 50]

A=mean2(B) % gibt ein Fehler aus: "Attempted to access si(3); index out of bounds because numel(si)=2."
 


Ich benötige aber ein Array der Größe [192x 256x50] nach der Mittelung. Es muss auch ein Datensatz (wieder [192X256X50]) mit Median erzeugt werden. Die werden danach verglichen.


Kleines Beispiell aus der Help-Funktion in Matlab.

Code:

 A = [1 2 3; 3 3 6; 4 6 8; 4 7 7];
mean(A)
 


Zitat:

ans =
3.0000 4.5000 6.0000


Code:


Zitat:

ans =
2.0000
4.0000
6.0000
6.0000


Was könnte ich jetzt noch versuchen?

Danke.

MFG
_________________

ABDIKOGLU
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 16.12.2010, 14:49     Titel:
  Antworten mit Zitat      
Abdik hat Folgendes geschrieben:
Hallo Jan S,

Ich benötige aber ein Array der Größe [192x 256x50] nach der Mittelung. Es muss auch ein Datensatz (wieder [192X256X50]) mit Median erzeugt werden. Die werden danach verglichen.


Hallo,
da ist stimmt doch etwas vor der Mittelung und nach der Mittelung gleiche Größe?

Du willst wahrscheinlich über 50 Slides mitteln?
dann versuch doch so:
Code:
Private Nachricht senden Benutzer-Profile anzeigen
 
Abdik
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 14.12.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.12.2010, 17:48     Titel:
  Antworten mit Zitat      
Hallo,

es existiert kein Befehl der
Code:
heißt.

Hat keiner ein Idee wie es es schaffe, alle Bilder Voxelweise zu mitteln?
_________________

ABDIKOGLU
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: 17.12.2010, 19:21     Titel:
  Antworten mit Zitat      
Hallo Abdik,

Zitat:
es existiert kein Befehl der
Code:
heißt.

Soso. Wie kommst Du zu dieser Idee?
Der Befehl heißt "mean", das erste Argument ist das zu bearbeitende Array, das zweite Argument ist die Dimension, entlang der gemittelt werden soll. Wenn Du Dir über den Befehl "mean" unsicher bist, kannst Du ja dort nachlesen:
Code:


Zitat:
Hat keiner ein Idee wie es es schaffe, alle Bilder Voxelweise zu mitteln?

Es wäre schon hilfreich für Dich, wenn Du unsere Nachfragen beantworten würdest. Offenbar hat sich irgendwo ein hartnäckiges Missverständnis eingeschlichen und muss zunächst ausgeräumt werden.
Du sagst, die Original-Daten hätten die Dimension [192 x 256 x 50]. Und die gemittelten Daten sollen die gleiche Dimension haben. Das ist aber mathematisch nicht möglich! Die gemittelten Daten müssen auf alle Fälle ein kleineres Array belegen, sonst wären sie nicht gemittelt! Beispiel:
Code:
x = rand(2, 3, 4)
disp(mean(x, 1))  % [1 x 3 x 4] array
disp(mean(x, 2))  % [2 x 1 x 4] array
disp(mean(x, 3))  % [2 x 3] array

Im letzten Fall ist zu bemerken, dass in Matlab [a x b] und [a x b x 1] und [a x b x 1 x 1 x x... 1] genau das gleiche bedeuten. Dimensionen der Länge 1 werden am Ende einfach ignoriert oder angefügt, je nach Bedarf.

Also: Bitte erkläre noch mal, was Du genau mathematisch berechnen möchtest. "Voxelweise mitteln" reicht als Definition nicht.
Vielleicht möchtest Du die Daten per "Moving Average" filtern - das beinhaltet zwar auch einen Mittelwert, aber das ist definitiv nicht "Mitteln".

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Abdik
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 14.12.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.12.2010, 17:16     Titel:
  Antworten mit Zitat      
Hallo Jan,

Zitat:
Also: Bitte erkläre noch mal, was Du genau mathematisch berechnen möchtest. "Voxelweise mitteln" reicht als Definition nicht.
Vielleicht möchtest Du die Daten per "Moving Average" filtern - das beinhaltet zwar auch einen Mittelwert, aber das ist definitiv nicht "Mitteln".


ich möchte aus ALLEN Probanden (3D Frames) Voxelweise den Median bzw. den Mittelwert bilden. D. h. dass ich zum Beispiel an der Stelle AtlasT1(31,66,30) den Mittelwert aus den Voxel, die genau an der gleichen Stelle (31,66,30) in den einzelnen Probanden T1-Karten liegen, bilden soll.


Bsp für ein Voxel:

Code:
AtlasT1(31,66,30) = mean(T1_Prob1(31,66,30),T1_Prob2(31,66,30),...,T1_Prob20(31,66,30)  );


Das muss aber über alle Frames laufen und alle Voxeln bearbeiten.



Ich hoffe, es ist jetzt besser erklärt was ich genau möchte. Jetzt suche ein einfacher Weg, um dieses zu realisieren.
_________________

ABDIKOGLU
Private Nachricht senden Benutzer-Profile anzeigen
 
LittleX
Forum-Guru

Forum-Guru


Beiträge: 494
Anmeldedatum: 14.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.12.2010, 18:12     Titel:
  Antworten mit Zitat      
Hallo,

also falls ich das richtig verstanden haben, könntest Du folgendes machen:
Code:

data = cat(4,T1_Prob1,T2_Prob2,...);
m = mean(data,4);
 


Viele Grüße,

LittleX
Private Nachricht senden Benutzer-Profile anzeigen
 
Abdik
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 14.12.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.01.2011, 14:23     Titel:
  Antworten mit Zitat      
Hallo,

Hier ist die Lösung von mir. Vielleicht braucht das jemand eventuell..!

Code:
addpath('Z:\spm5')
addpath('Z:\Marie\kino\')
load('Z:\Vyara\MatlabskripteSeptember2009\WaterColorMap_new.mat')
ProbNum = [6 7 8 11:24];
m = 1;
for i = 1:length(ProbNum)
    path = strcat('Z:\Probanden Pool\Prob',num2str(ProbNum(i)),'\H2O_corrected\wrsProb',num2str(ProbNum(i)),'_H2O_corrected.img');
    v = spm_vol(path);
    map = spm_read_vols(v);
    maprotH2O = imrotate(map,90);
   
    map4D(:,:,:,m) = maprotH2O; %Dimensionserweiterung um m.
        %% Daraus  kann dann voxelweise Mittelwert berechnet werden.
    m = m+1;
   
   ProbNum(i) ;
end
Mittelwert_Atlas_H2O = (mean(map4D,4))/100; % Wassergehalt in %


MFG
_________________

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