numpy.array файла изображения "I; 16" - PullRequest
6 голосов
/ 07 октября 2011

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

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

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

Ответы [ 3 ]

6 голосов
/ 10 октября 2011

Это должно работать (решение для подушки / 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 от C. Gohlke (очень быстро):

import tifffile

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

with tifffile.TIFFfile(fp) as tif:
    data = tif.asarray()
3 голосов
/ 10 октября 2011

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

import gdal
tif = gdal.Open('path.tif')
arr = tif.ReadAsArray()
0 голосов
/ 18 апреля 2017

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

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