Potrzebuję metody Pythona do otwierania i importowania obrazów TIFF do tablic numpy, aby móc analizować i modyfikować dane pikseli, a następnie ponownie zapisywać je jako TIFF. (Są to w zasadzie mapy natężenia światła w skali szarości, przedstawiające odpowiednie wartości na piksel)
Nie mogłem znaleźć żadnej dokumentacji na temat metod PIL dotyczących TIFF. Próbowałem to rozgryźć, ale otrzymałem tylko błędy „zły tryb” lub „nieobsługiwany typ pliku”.
Czego potrzebuję tutaj?
DecompressionBombError: Image size (900815608 pixels) exceeds limit of 178956970 pixels, could be decompression bomb DOS attack.
Używam matplotlib do czytania plików TIFF:
import matplotlib.pyplot as plt I = plt.imread(tiff_file)
i
I
będzie typowyndarray
.Zgodnie z dokumentacją, w rzeczywistości to PIL działa za kulisami podczas obsługi plików TIFF, ponieważ matplotlib czyta natywnie tylko pliki PNG, ale dla mnie działa dobrze.
Jest też
plt.imsave
funkcja zapisywania.źródło
ValueError: Only know how to handle extensions: ['png']; with Pillow installed matplotlib can handle more images
Możesz również użyć do tego GDAL. Zdaję sobie sprawę, że jest to zestaw narzędzi geoprzestrzennych, ale nic nie wymaga posiadania produktu kartograficznego.
Link do prekompilowanych plików binarnych GDAL dla Windows (zakładając okna tutaj) http://www.gisinternals.com/sdk/
Aby uzyskać dostęp do tablicy:
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()
źródło
.astype(sometype)
połączenie na końcuReadAsArray()
połączenia, aby je przesłać. Nie jestem pewien, czy to tworzy kopię (po prostu nie testowałem).xrange
to żadna literówka,xrange
to wersja Pythona 2range
. Zaakceptowałem tę edycję, ponieważ Python 3 jest nadal aktywnie ulepszany, podczas gdy Python 2 nie.PyLibTiff działał lepiej dla mnie niż PIL, który od grudnia 2020 roku nadal nie obsługuje kolorowych obrazów z więcej niż 8 bitami na kolor .
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)
Możesz zainstalować PyLibTiff z
Plik Readme PyLibTiff również wspomina o
tifffile
bibliotece, ale nie próbowałem jej.źródło
W przypadku stosów obrazów łatwiej jest mi
scikit-image
je czytać,matplotlib
wyświetlać lub zapisywać. Obsługiwałem 16-bitowe stosy obrazów TIFF za pomocą następującego kodu.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)
źródło
Możesz też użyć pytiff, którego jestem autorem.
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]
Jest to dość mały moduł i może nie mieć tylu funkcji, co inne moduły, ale obsługuje kafelki tiffs i bigtiff, dzięki czemu można czytać części dużych obrazów.
źródło
Polecam używanie powiązań Pythona z OpenImageIO, to standard radzenia sobie z różnymi formatami obrazu w świecie vfx. Odkryłem, że jest bardziej niezawodny w czytaniu różnych typów kompresji w porównaniu do PIL.
import OpenImageIO as oiio input = oiio.ImageInput.open ("/path/to/image.tif")
źródło
Korzystanie z cv2
import cv2 image = cv2.imread(tiff_file.tif) cv2.imshow('tif image',image)
źródło