Мне нужен метод python для открытия и импорта изображений TIFF в массивы numpy, чтобы я мог анализировать и изменять данные пикселей, а затем снова сохранять их в формате TIFF. (Это в основном карты интенсивности света в оттенках серого, представляющие соответствующие значения на пиксель)
Я не смог найти никакой документации по методам PIL, относящимся к TIFF. Я попытался разобраться, но получил только ошибки «плохой режим» или «тип файла не поддерживается».
Что мне здесь нужно использовать?
DecompressionBombError: Image size (900815608 pixels) exceeds limit of 178956970 pixels, could be decompression bomb DOS attack.
Я использую matplotlib для чтения файлов TIFF:
import matplotlib.pyplot as plt I = plt.imread(tiff_file)
и
I
будет типаndarray
.Согласно документации, хотя на самом деле это PIL, который работает за кулисами при обработке TIFF, поскольку matplotlib изначально читает только PNG, но у меня это отлично работает.
Также есть
plt.imsave
функция сохранения.источник
ValueError: Only know how to handle extensions: ['png']; with Pillow installed matplotlib can handle more images
Вы также можете использовать для этого GDAL. Я понимаю, что это геопространственный инструментарий, но ничто не требует от вас наличия картографического продукта.
Ссылка на предварительно скомпилированные двоичные файлы GDAL для Windows (при условии, что здесь Windows) http://www.gisinternals.com/sdk/
Чтобы получить доступ к массиву:
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()
источник
.astype(sometype)
вызов в конецReadAsArray()
вызова для трансляции. Не уверен, что это делает копию (только не проверял).xrange
- это не опечатка,xrange
это версия для Python 2range
. Я принял это изменение, потому что python 3 все еще активно улучшается, а python 2 - нет.PyLibTiff работал у меня лучше, чем PIL, который по состоянию на декабрь 2020 года все еще не поддерживает цветные изображения с более чем 8 битами на цвет .
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)
Вы можете установить PyLibTiff с помощью
В readme PyLibTiff также упоминается
tifffile
библиотека, но я не пробовал.источник
В случае стеков изображений мне легче
scikit-image
читать,matplotlib
отображать или сохранять. Я обработал 16-битные стеки изображений TIFF с помощью следующего кода.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)
источник
Вы также можете использовать pytiff, автором которого я являюсь.
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]
Это довольно небольшой модуль и может не иметь такого количества функций, как другие модули, но он поддерживает мозаичные tiff и bigtiff, поэтому вы можете читать части больших изображений.
источник
Я рекомендую использовать привязки python к OpenImageIO, это стандарт для работы с различными форматами изображений в мире vfx. Я часто считаю его более надежным при чтении различных типов сжатия по сравнению с PIL.
import OpenImageIO as oiio input = oiio.ImageInput.open ("/path/to/image.tif")
источник
Использование cv2
import cv2 image = cv2.imread(tiff_file.tif) cv2.imshow('tif image',image)
источник