Numpy уничтожает атрибут плитки PIL TiffImageFile - PullRequest
0 голосов
/ 31 января 2019

Я открываю ссылку на изображение, а затем открываю изображение, используя метод PIL Image.open.При преобразовании PIL TiffImageFile в массив numpy атрибут плитки PIL TiffImageFile теряется.

Почему это происходит?

Я ошибаюсь?

Здесьпример кода:

from urllib.request import urlopen
from PIL import Image
import numpy as np

url = "https://some_url_to_tiff_file"
img = Image.open(urlopen(url))
#If I call img.tile here, the info shows.
img_np = np.asarray(img)
#img_np = np.array(img) also causes a problem
#If I call img.tile here, the list is empty.

1 Ответ

0 голосов
/ 31 января 2019

Это проблема в коде Pillow .Метод TiffImageFile._load_libtiff выполняет строку self.tile = [].Этот метод вызывается, когда вызывается np.array(img) или np.asarray(img), потому что numpy обращается к свойству __array_interface__, а реализация этого свойства вызывает self.tobytes(), который вызывает self.load(), а в экземпляре TiffImageFile, который приводитна вызов self._load_libtiff().

Атрибут tile может быть неожиданно перенесен без использования numpy.Например,

In [25]: img = Image.open('foo.tiff')

In [26]: img.tile
Out[26]: [('tiff_lzw', (0, 0, 499, 630), 0, ('RGB', 'tiff_lzw', False))]

In [27]: img2 = img.convert(mode='RGB')

In [28]: img.tile
Out[28]: []

Первая строка строки документа convert - «Возвращает преобразованную копию этого изображения», поэтому удивительно, что метод изменяет атрибут tile.Я бы назвал это Подушкой, но, возможно, есть веская причина для этого побочного эффекта.

...