Преобразование TIFF в массив NumPy - PullRequest
0 голосов
/ 07 октября 2018

В настоящее время я работаю над преобразованием файла TIFF в пустой массив.Простой рабочий код:

from PIL import Image

photo = Image.open("filename.tif")
photo.show()

Хотя я получаю в качестве вывода изображение, я получаю ошибку

TIFFSetField: tempfile.tif: Unknown pseudo-tag 65538.

Более того, когда я пытаюсь

data = np.array(photo)
print(data)

Я получаю вывод

[[[  0   0   0 255]
  [  0   0   0 255]
  [  0   0   0 255]
  ...
  [  0   0   0 255]
  [  7   7   7 255]
  [  7   7   7 255]]

 [[  0   0   0 255]
  [  0   0   0 255]
  [  0   0   0 255]
  ...
  [  0   0   0 255]
  [  0   0   0 255]
  [  0   0   0 255]]

 [[  5   5   5 255]
  [  0   0   0 255]
  [  0   0   0 255]
  ...
  [  0   0   0 255]
  [  0   0   0 255]
  [  0   0   0 255]]
 ...

 [[  0   0   0 255]
  [  0   0   0 255]
  [  0   0   0 255]
  ...
  [  1   1   1 255]
  [  0   0   0 255]
  [  3   3   3 255]]

 [[  0   0   0 255]
  [  0   0   0 255]
  [  0   0   0 255]
  ...
  [ 11  11  11 255]
  [  0   0   0 255]
  [  0   0   0 255]]]

, который, я уверен, не отражает информацию изображения.Есть идеи, что может вызвать эту ошибку?Я бы предпочел, чтобы мне не приходилось загружать файл изображения.

1 Ответ

0 голосов
/ 08 октября 2018

Ваш подход мне кажется правильным.Ниже приведен пример, который отлично работает.

In [1]: import numpy as np
In [2]: import PIL
In [3]: from PIL import Image

In [4]: img = Image.open('image.tif')
In [5]: img.show()

In [6]: img_arr = np.array(img)

# 2D array
In [7]: img_arr.shape
Out[7]: (44, 330)

In [8]: img_arr.dtype
Out[8]: dtype('uint8')

In [9]: img_arr
Out[9]: 
array([[  0,   1,   2, ..., 244, 245, 246],
       [  0,   1,   2, ..., 244, 245, 246],
       [  0,   1,   2, ..., 244, 245, 246],
       ...,
       [  0,   1,   2, ..., 244, 245, 246],
       [  0,   1,   2, ..., 244, 245, 246],
       [  0,   1,   2, ..., 244, 245, 246]], dtype=uint8)

В качестве альтернативы вы также можете использовать matplotlib для чтения изображения, как в:

In [10]: import matplotlib.pyplot as plt
In [12]: img_ = plt.imread('image.tif')

# 3D array
In [13]: img_.shape
Out[13]: (44, 330, 4)

# PIL image read yields a 2D array instead
In [14]: img_arr.shape
Out[14]: (44, 330)

In [15]: img_.dtype
Out[15]: dtype('uint8')
...