онемел.массив файла изображения" I;16"


Я хочу использовать TIFF-изображения для эффективного сохранения больших массивов данных измерений. Установив их в режим= " I; 16 "(соответствующий моему 16-битному диапазону данных), они дают файлы размером 2 МБ (~1000x1000"пикселей"). И это хорошо.

Однако у меня возникают проблемы с преобразованием их в массивы, когда речь заходит об их анализе. Для 32-битных данных (- >"I") numpy.команда array работает нормально. В случае "I;16" результатом является массив 0d numpy с TIFF в качестве записи [0,0].

Есть ли способ заставить это работать? Я действительно хотел бы избежать использования 32-битных изображений, так как мне не нужен диапазон, и это удваивает требуемое место на жестком диске (много и много таких измерений запланировано...)

3 6

3 ответа:

Это должно работать (решение pillow/PIL, медленное для 16-битного изображения, см. ниже).

from PIL import Image
import numpy as np

data = np.random.randint(0,2**16-1,(1000,1000))
im = Image.fromarray(data)
im.save('test.tif')

im2 = Image.open('test.tif')
data2 = np.array(im2.getdata()).reshape(im2.size[::-1])

Другое решение, используя tifffile к. голк (очень быстро):

import tifffile

fp = r'path\to\image\image.tif'

with tifffile.TIFFfile(fp) as tif:
    data = tif.asarray()

Вы можете использовать GDAL + Numpy/Scipy для чтения растровых изображений с 16-битными данными канала:

import gdal
tif = gdal.Open('path.tif')
arr = tif.ReadAsArray()

Преобразование TIFF (ImageJ) в 8-битный массив numpy

im = numpy.array(Image.open('my.tiff'))
n = (im / numpy.amax(im) * 255).astype(numpy.uint8)