Problem mit numpy Array

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
hscherer
User
Beiträge: 14
Registriert: Donnerstag 25. März 2010, 22:07
Wohnort: München

Hallo alle zusammen,

ich programmiere seit ~10 Jahren in IDL und mache meine ersten Gehversuche in Python. Um ein Ziel beim Lernen zu haben, versuche ich eine Rauschanalyse (NNP Noise power spectra) von medizinischen Bildern umzusetzen.
Dabei soll ein klinisches Bild (4644 x 3508 Pixel) eingelesen werden. Aus dem Bild wird ein Ausschnitt ausgewählt, von dem dann die 2D FFT erstellt werden soll. Das Einlesen und Konvertieren in ein "numpy" Array funktioniert recht einfach. Nach dem Rückspeichern des Bildes unter anderem Namen, kann ich mit dem Bildbetrachter ImageJ oder einem direkten Dateivergleich sehen, daß bis hier alle so läuft wie gewünscht.
Aber das Ausschneiden eines Bereichs (so wie ich es von IDL her kenne) scheitert. Testweise speichere ich nach dem gleichen Verfahren den Bereich ab. Das resultierende Bild in ImageJ ist aber völlig durcheinander gewürfelt.
Was mache ich hier im Code Beispiel unten falsch (Der Einrückfehler im Code ist durch das Kopieren entstanden und ich habe nicht herausgefunden, wie ich dies bei der Texteingabe hier ändern kann):


Vielen Dank im vorhinein

#!/usr/bin/python
# -*- coding: utf-8 -*-

''' Test binary IO

Version: x.xx first tests Datum: 02.03.2010
'''
import numpy as np

if __name__ == '__main__':
Dateiname = "/home/hscherer/work/K_4644_3508.raw"
MyImage = np.fromfile(Dateiname, dtype=np.uint16, count=4644*3508)
MyImage = np.array(MyImage)
Data_array = MyImage.reshape((4644, 3508))
Data_array.tofile("/home/hscherer/work/Big_4644x3508.raw")

x = 1335
y = 2080
Data_array_AOI = Data_array[x:x+2048, y:y+1024]
Data_array_AOI.tofile("/home/hscherer/work/t_2048x1024.raw")
print(Data_array_AOI.shape)


print("Fertig")
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

hscherer hat geschrieben:(Der Einrückfehler im Code ist durch das Kopieren entstanden und ich habe nicht herausgefunden, wie ich dies bei der Texteingabe hier ändern kann)
Dafür ist der Button namens "Python" da (siehe Foren-FAQ)

Ich korriegiere das mal für dich (aber nur das eine Mal!):

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

''' Test binary IO 

    Version: x.xx               first tests            Datum: 02.03.2010
'''
import numpy as np

if __name__ == '__main__':
    Dateiname = "/home/hscherer/work/K_4644_3508.raw"
    MyImage = np.fromfile(Dateiname, dtype=np.uint16,     count=4644*3508)
    MyImage = np.array(MyImage)
    Data_array = MyImage.reshape((4644, 3508))
    Data_array.tofile("/home/hscherer/work/Big_4644x3508.raw")
    
    x = 1335
    y = 2080
    Data_array_AOI = Data_array[x:x+2048, y:y+1024]
    Data_array_AOI.tofile("/home/hscherer/work/t_2048x1024.raw")
    print(Data_array_AOI.shape)
    
    print("Fertig")
BlackJack

@hscherer: Kann es sein, dass Du hier Zeilen und Spalten verwechselst? Im Computer werden 2D-Arrays ja in der Regel Zeilenweise hintereinander abgelegt, so dass der erste Index die Zeile auswählt und der Zweite einen Wert innerhalb einer Zeile. Beim einfach kopieren der ersten 16.291.152 Werte ohne sie zu verändern macht diese Verwechslung ja nichts aus, aber beim Ausschneiden eines Bereichs dann schon.
hscherer
User
Beiträge: 14
Registriert: Donnerstag 25. März 2010, 22:07
Wohnort: München

Hallo BlackJack,

zunächst einmal vielen Dank an den Admin, der mich in die richtige Rubrik "Python" verschoben hat. Sorry, für die Mühe, soll aber nicht mehr vorkommen.

An ein Vertauschen von Spalten und Zeilen hatte ich auch zuerst gedacht. Aber das bringt keine Verbesserung. Auch wenn ich statt 2048x1024 eine quadratische Region 2024x1024 wähle, bleibt das Problem vorhanden.
Ich habe auch mit "reshape(...., order ='C')" bzw. mit "reshape(...., order ='F')" versucht das Problem zu lösen aber ohne Erfolg
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Kannst Du einmal ein kleines Testbild irgendwo hochladen?
MfG
HWK
hscherer
User
Beiträge: 14
Registriert: Donnerstag 25. März 2010, 22:07
Wohnort: München

Hallo alle zusammen,

ich habe den Fehler gefunden. BlackJack hatte recht mit den vertauschten Indices.
Ich habe mich von dem ersten funktionierenden "tofile()" Befehl aufs Glatteis führen lassen. Der Befehl eine Zeile zuvor
"Data_array = MyImage.reshape((4644, 3508))"
ist das eigentliche Problem und nicht das anschließende "slicing". Durch "reshape()" wird keine Änderung im Speicher vorgenommen daher funktioniert der "reshape()" auch mit verdrehten Indices
(4644, 3508) bzw. (3508, 4644), ohne daß der nachfolgende Befehl
Data_array.tofile("/home/spiele/work/Big_4644x3508.raw")"
davon beeinflußt wird, wohle aber das "Slicing". Durch den Zusatz von "Oder='F'" beim "reshape()" kann ich dies zwar umgehen, habe dann aber das Problem, daß der "tofile()" das transponierte Bild speichert.
Da ich beruflich auch weiter mit IDL arbeiten muß, werde ich das Feld nach dem "korrekten" Einlesen transponieren. Dann bin ich bzgl. der Indices Reihenfolge wieder an der IDL Konvention und vermeide für mich ein permanentes hin und her, behalte aber andererseits die Python/numpy "defaults" (z.B.: beim Einlesen bzw. Anlegen von Feldern).

Nochmals vielen Dank für die Unterstützung.
Antworten