2016-06-10 7 views
0

ich mit einigen Graustufen tif-Dateien arbeiten müssen, und ich habe PIL worden, sie als Bilder zu importieren und sie in numpy Arrays konvertieren:Dolmetschen numpy Array von tif-Datei erhalten

np.array(Image.open(src)) 

ich ein transparentes haben wollen Verständnis genau, was die Werte dieser Array entsprechen und insbesondere war es nicht klar, welcher Wert als Weißpunkt oder Schwarzpunkt für meine Bilder geeignet war. Zum Beispiel, wenn ich dieses Array in ein Array von Floats mit Pixelwerten von 1 für Weißwerte und 0 für Schwarz mit anderen linear skalierten Werten konvertieren wollte.

Ich habe einige naive Methoden einschließlich der Skalierung durch den Maximalwert im Array versucht, aber beim Öffnen der resultierenden Dateien gibt es immer eine gewisse Verschiebung der Farbstufen.

Gibt es Dokumentation für den richtigen Weg, um die in diesen TIF-Arrays gespeicherten Werte zu verstehen?

Antwort

1

Ein TIFF ist im Grunde ein Computer-Dateiformat zum Speichern von Rastergrafiken. Es hat eine Menge von specs und schnelle Suche im Internet erhalten Sie die Ressourcen, die Sie brauchen.

Sie verwenden PIL als Eingabebibliothek. Das Array Sie haben, ist wahrscheinlich mit einem uint8 Datentyp arbeiten, die Ihre Daten bedeutet, können innerhalb von 0 bis 255 überall sein, um die von 0 bis 1 Farbbereich gehen Sie wie folgt zu erhalten: wahrscheinlich

im = np.array(Image.open(src)).astype('float32')/255 

Hinweis Array wird 4 Schichten in der dritten Dimension im[:,:, here] (im.shape = (i,j,k)). Jede Spur im[i,j,:] (die ein Pixel darstellt) wird also ein Quadruple für einen RGBA-Wert sein.

Das R steht für Rot (oder Menge von Rot), G für Grün, B für Blau. A ist der Alphakanal und ermöglicht Transparenz (niedrigere Werte bedeuten weniger Deckkraft und mehr Transparenz).

Es kann auch drei Schichten für nur RGB haben, oder eine Schicht, wenn beabsichtigt ist, in der Grauskala aufgetragen zu werden.

Wenn Sie RGB (oder RGBA, aber nicht Alpha) haben, aber einen einzelnen Wert benötigen, sollten Sie verstehen, dass es dafür einige verschiedene Möglichkeiten gibt. In this post @denis empfiehlt die Verwendung der folgenden Formulierung:

Y = .2126 * R^gamma + .7152 * G^gamma + .0722 * B^gamma 

wo Gamma 2.2 für viele PCs. Die üblichen R G B werden manchmal geschrieben als R 'G' B '(R' = Rlin^(1/Gamma)) (Puristen Zunge-Klick) aber hier Ich werde die 'fallen lassen.

Und schließlich L* = 116 * Y^1/3 - 16, um die Luminanz zu erhalten.

Ich empfehle Ihnen, seinen Beitrag zu lesen.Sehen Sie sich auch in den folgenden Begriffen suchen:

+0

Vielen Dank für Ihre Antwort. Eine Sache scheint mir hier seltsam zu sein, und das ist, dass mein numpliges Array ganz klar kein 'Uint8'-Array ist. Die Maximalwerte im Array liegen irgendwo in der Größenordnung von 30000, aber um fair zu sein, arbeite ich mit 16-Bit-Graustufen-TIFs. –

+0

@FrankWang Das erklärt es als. Das ist ein altes Problem mit PIL, von dem ich annehmen würde, dass es jetzt gelöst wäre. In jedem Fall gibt es Lösungen. Sehen Sie sich zum Beispiel diesen Link an: http://blog.philippklaus.de/2011/08/handle-16bit-tiff-images-in-python/ – armatita