Как загрузить изображения размером более MAX_IMAGE_PIXELS с помощью PIL? - PullRequest
2 голосов
/ 16 мая 2019

Я пытаюсь загрузить некоторые изображения в свой Блокнот Юпитера, но PIL.Image.open () говорит, что изображение слишком большое.MAX_IMAGE_PIXEL устанавливается в исходном коде PIL Image, но мое изображение намного больше.Мне интересно, есть ли способ обойти это?

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

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

im = np.array(Image.open('data/big_image.jpg'), dtype=np.uint8)

# Create figure and axes
fig,ax = plt.subplots(1,figsize=(10,10))

# Display the image
ax.imshow(im)

plt.show()

Приведенный выше код возвращает следующую ошибку:

---------------------------------------------------------------------------
DecompressionBombError                    Traceback (most recent call last)
<ipython-input-15-09854c1c6343> in <module>
      3 from PIL import Image
      4 
----> 5 im = np.array(Image.open('data/big_image.jpg'), dtype=np.uint8)
      6 
      7 # Create figure and axes

/opt/anaconda3/lib/python3.7/site-packages/PIL/Image.py in open(fp, mode)
   2640         return None
   2641 
-> 2642     im = _open_core(fp, filename, prefix)
   2643 
   2644     if im is None:

/opt/anaconda3/lib/python3.7/site-packages/PIL/Image.py in _open_core(fp, filename, prefix)
   2631                     fp.seek(0)
   2632                     im = factory(fp, filename)
-> 2633                     _decompression_bomb_check(im.size)
   2634                     return im
   2635             except (SyntaxError, IndexError, TypeError, struct.error):

/opt/anaconda3/lib/python3.7/site-packages/PIL/Image.py in _decompression_bomb_check(size)
   2566             "Image size (%d pixels) exceeds limit of %d pixels, "
   2567             "could be decompression bomb DOS attack." %
-> 2568             (pixels, 2 * MAX_IMAGE_PIXELS))
   2569 
   2570     if pixels > MAX_IMAGE_PIXELS:

DecompressionBombError: Image size (1435500544 pixels) exceeds limit of 178956970 pixels, could be decompression bomb DOS attack.

Любая помощь приветствуется!

1 Ответ

2 голосов
/ 16 мая 2019

DecompressionBombError от Pillow - это функция безопасности для веб-служб, но если вы доверяете источнику изображения, то это просто произвольное ограничение. RGB-изображение с 1435500544 пикселями имеет 24 байта на пиксель, поэтому оно занимает примерно 500 МБ (что близко к пределу по умолчанию для подушки). Согласно их документам, вы можете сделать что-то вроде

import numpy as np
from PIL import Image
Image.MAX_IMAGE_PIXELS = None

im = np.array(Image.open('data/big_image.jpg'), dtype=np.uint8)

И это должно работать. Если вы планируете работать с большими изображениями, хорошей альтернативой подушке является OpenCV . Это очень быстро и предлагает набор алгоритмов, ориентированных на компьютерное зрение. начало работы учебное пособие посвящено загрузке изображений.

import cv2

# Load an color image as a numpy array
img = cv2.imread('messi5.jpg',1)

Важно отметить, что OpenCV суммирует каналы как синий-зеленый-красный, а подушка - как красный-зеленый-синий, но пока вы используете OpenCV API , у вас будет много вариантов преобразовать в RGB или любое другое цветовое пространство, которое вы хотите.

...