Ich benötige eine Python-Methode, um TIFF-Bilder zu öffnen und in Numpy-Arrays zu importieren, damit ich die Pixeldaten analysieren und ändern und sie dann erneut als TIFFs speichern kann. (Es handelt sich im Grunde genommen um Lichtintensitätskarten in Graustufen, die die jeweiligen Werte pro Pixel darstellen.)
Ich konnte keine Dokumentation zu PIL-Methoden in Bezug auf TIFF finden. Ich habe versucht, es herauszufinden, habe aber nur die Fehler "Bad Mode" oder "Dateityp nicht unterstützt" erhalten.
Was muss ich hier verwenden?
Ich benutze matplotlib zum Lesen von TIFF-Dateien:
import matplotlib.pyplot as plt I = plt.imread(tiff_file)
und
I
wird vom Typ seinndarray
.Laut der Dokumentation ist es tatsächlich PIL, das hinter den Kulissen funktioniert, wenn TIFFs als Matplotlib behandelt werden, die PNGs nur nativ lesen, aber das hat für mich gut funktioniert.
Es gibt auch eine
plt.imsave
Funktion zum Speichern.quelle
ValueError: Only know how to handle extensions: ['png']; with Pillow installed matplotlib can handle more images
Sie können dazu auch GDAL verwenden. Mir ist klar, dass es sich um ein Geodaten-Toolkit handelt, aber für nichts ist ein kartografisches Produkt erforderlich.
Link zu vorkompilierten GDAL-Binärdateien für Windows (vorausgesetzt, Windows hier) http://www.gisinternals.com/sdk/
So greifen Sie auf das Array zu:
from osgeo import gdal dataset = gdal.Open("path/to/dataset.tiff", gdal.GA_ReadOnly) for x in range(1, dataset.RasterCount + 1): band = dataset.GetRasterBand(x) array = band.ReadAsArray()
quelle
.astype(sometype)
am Ende des zu besetzenden Anrufs einen Anruf hinzufügenReadAsArray()
. Nicht sicher, ob dies eine Kopie macht (nur nicht getestet).xrange
ist kein Tippfehler,xrange
ist die Python 2-Version vonrange
. Ich habe diese Änderung akzeptiert, da Python 3 immer noch aktiv verbessert wird, Python 2 jedoch nicht.pylibtiff hat bei mir besser funktioniert als PIL, das ab Juni 2020 keine Farbbilder mit mehr als 8 Bit pro Farbe unterstützt .
from libtiff import TIFF tif = TIFF.open('filename.tif') # open tiff file in read mode # read an image in the currect TIFF directory as a numpy array image = tif.read_image() # read all images in a TIFF file: for image in tif.iter_images(): pass tif = TIFF.open('filename.tif', mode='w') tif.write_image(image)
Sie können pylibtiff mit installieren
In der Readme-Datei von pylibtiff wird ebenfalls erwähnt
tifffile
, aber ich habe es nicht ausprobiert, und obwohl es angeblich Open Source ist, glaube ich nicht, dass der Code irgendwo mehr verfügbar ist (abgesehen davon, dass er manuell aus dem PyPI-Paket extrahiert wurde).quelle
Sie können auch pytiff verwenden, dessen Autor ich bin.
import pytiff with pytiff.Tiff("filename.tif") as handle: part = handle[100:200, 200:400] # multipage tif with pytiff.Tiff("multipage.tif") as handle: for page in handle: part = page[100:200, 200:400]
Es ist ein ziemlich kleines Modul und verfügt möglicherweise nicht über so viele Funktionen wie andere Module, unterstützt jedoch gekachelte Tiffs und Bigtiffs, sodass Sie Teile großer Bilder lesen können.
quelle
Bei Bildstapeln fällt es mir leichter, sie
scikit-image
zu lesen,matplotlib
anzuzeigen oder zu speichern. Ich habe 16-Bit-TIFF-Bildstapel mit dem folgenden Code verarbeitet.from skimage import io import matplotlib.pyplot as plt # read the image stack img = io.imread('a_image.tif') # show the image plt.imshow(mol,cmap='gray') plt.axis('off') # save the image plt.savefig('output.tif', transparent=True, dpi=300, bbox_inches="tight", pad_inches=0.0)
quelle
Ich empfehle die Verwendung der Python-Bindungen für OpenImageIO, dies ist der Standard für den Umgang mit verschiedenen Bildformaten in der vfx-Welt. Ich habe festgestellt, dass es beim Lesen verschiedener Komprimierungsarten im Vergleich zu PIL zuverlässiger ist.
import OpenImageIO as oiio input = oiio.ImageInput.open ("/path/to/image.tif")
quelle