16-Bit-TIFF-Bildimport ist ein Wunsch von JMP, Graustufendaten mit mehr als 256 Graustufen laden zu können. Ich schlug vor, dass Python eine vernünftige Möglichkeit wäre, dies zu tun, bevor Sie es versuchen. Die erste Testdatei, die ich mit Gimp erstellt habe, hat in Python eine seltsame Fehlermeldung erzeugt, die ich so ausfindig gemacht habe, dass "die 16-Bit-Graustufendaten nicht von Python importiert werden können, es sei denn, es gibt keinen anderen Kanal (wie einen Alphakanal oder einen anderen Schicht)." Die Standardeinstellung in Gimp hat einen Alphakanal, und ein erneuter Export ohne ihn führte zu einer 16-Bit-Graustufendatei, die Python laden kann. Das Folgende ist eine 8-Bit-PNG-Bildschirmaufnahme. Das erste Bild ist ein bisschen Lava von Gimp, das als 16-Bit-Graustufen gespeichert wurde.
The delta noise image is multiplied by 30 to make the noise visible. It is nearly uniform gray on my display at < 10X. The truncation error is about 1/255 of the gray scale range.Das Delta-Rauschbild wird mit 30 multipliziert, um das Rauschen sichtbar zu machen. Auf meinem Display ist es bei < 10X fast einheitlich grau. Der Abschneidefehler beträgt etwa 1/255 des Graustufenbereichs.
Die beiden orangefarbenen Bilder sehen identisch aus. Die Konvertierung in die Spektralfarben auf dem unteren Bild wurde mit 16-Bit-Daten durchgeführt, daher gibt es wahrscheinlich einige Unterschiede. Das schwach texturierte blau/grau/rote Bild stellt den Unterschied zwischen den Daten dar, die die beiden orangefarbenen Bilder erzeugt haben. Wenn Ihre Kamera tatsächlich 10- oder 12- oder vielleicht sogar 14-Bit-Daten erzeugen kann, kann diese zusätzliche Präzision wichtig sein. Oder der Dynamikbereich kann wichtig sein.
Python Init();
path = Convert File Path(
Save Text File( "$temp/deleteme.tiff", // the 2channel file will fail - see link in message
Load Text File( "16bitgray1channel.tif", blob() ) // pic is part of the project, move to $temp
),
"windows"
);
// first import it using built-in image that truncates the bit depth
truncated = Color To RGB( New Image( path ) << getpixels )[1]; // use the red channel
// stretch truncated image bit depth 0 to 1
r = Range( truncated );//[0.00784 0.803]
min = r[1];
max = r[2];
truncated = (truncated - min) / (max - min); // 0 to 1
timage = New Image( Heat Color( 1 - truncated, "spectral" ) );
// now import with Python PIL to preserve the 16-bit depth
rc = Python Execute( {path}, {im}, "\[
import numpy as np
import PIL
from PIL import Image
try:
im = np.array(Image.open(path))
except Exception as e:
print("make sure there is only one channel (no alpha for example) see https://github.com/python-pillow/Pillow/issues/1888",e)
]\" );
If( rc, Throw( "python code failed" ) );
// stretch full image bit depth 0 to 1
r = Range( im ); //[530 52698]
min = r[1];
max = r[2];
full = (im - min) / (max - min);
fimage = New Image( Heat Color( 1 - full, "spectral" ) );
// diff and magnify the difference
magnify = 30;
delta = (full - truncated) * magnify; // small negative and positive diffs, scaled up to be visible
delta = delta + .5; // center
dimage = New Image( Heat Color( delta ) );
New Window( "compare", Lineup Box( N Col( 2 ),
textbox("original\!ngray\!nscale"),New Image( path ),
Text Box( "truncated\!nheatcolor\!nspectral" ), timage,
Text Box( evalinsert("delta\!ntimes ^magnify^\!nblue\!nto gray\!nto red\!n\!nfullres -\!ntruncated") ),
dimage, Text Box( "full res\!nheatcolor\!nspectral" ), fimage, ) );
Eine Projektdatei (JMP 16) ist mit zwei TIFs angehängt; man scheitert am Extrakanal von Alphadaten. Entfernen Sie die ZIP-Datei für JMP 16 oder verwenden Sie Ihre ZIP-Tools, wenn Sie älteres JMP verwenden.
Danke @RJ_Bailey !