Importation d'images TIFF 16 bits est un souhait pour JMP de pouvoir charger des données en niveaux de gris avec plus de 256 nuances de gris. J'ai suggéré que Python pourrait être un moyen raisonnable de le faire avant de l'essayer. Le premier fichier de test que j'ai créé avec Gimp a produit un message d'erreur étrange en Python, que j'ai suivi pour signifier "les données d'échelle de gris 16 bits ne peuvent pas être importées par Python à moins qu'il n'y ait pas d'autre canal (comme un canal alpha ou autre couche)." La valeur par défaut dans Gimp a un canal alpha, et la réexportation sans lui a créé un fichier en niveaux de gris 16 bits que Python peut charger. Ce qui suit est une capture d'écran PNG 8 bits. La première image est un peu de lave de Gimp, qui a été enregistrée en échelle de gris 16 bits.
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.L'image du bruit delta est multipliée par 30 pour rendre le bruit visible. Il est gris presque uniforme sur mon écran à <10X. L'erreur de troncature est d'environ 1/255 de la gamme d'échelle de gris.
Les deux images orange semblent identiques. La conversion en couleurs spectrales sur l'image du bas a été effectuée à l'aide de données 16 bits, il y a donc probablement quelques différences. L'image bleu/gris/rouge légèrement texturée représente la différence entre les données qui ont fait les deux images orange. Si votre appareil photo peut réellement produire des données 10 ou 12 ou peut-être même 14 bits, cette précision supplémentaire peut être importante. Ou, la plage dynamique peut être importante.
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, ) );
Un dossier de projet (JMP 16) est joint avec deux TIF ; on échoue à cause du canal supplémentaire de données alpha. Supprimez le .zip pour JMP 16 ou utilisez vos outils zip si vous utilisez un JMP plus ancien.
Merci @RJ_Bailey !