如何使用PIL加载大于MAX_IMAGE_PIXELS的图像?

时间:2019-05-16 17:53:25

标签: python python-imaging-library

我正在尝试将一些图像加载到Jupiter Notebook中,但是PIL.Image.open()表示图像太大。在PIL图像源代码中设置了MAX_IMAGE_PIXEL,但是我的图像要大得多。我想知道是否有办法解决这个问题?

以下代码适用于较小的图像。我已经尝试尝试手动设置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 个答案:

答案 0 :(得分:1)

Pillow的DecompressionBombError是Web服务的safety feature,但是如果您信任图像的来源,那么它只是一个任意限制。 1435500544像素的RGB图像每个像素有24个字节,因此它将占用大约500 MB(接近“枕头”的默认限制)。根据他们的文档,您可以执行以下操作

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是Pillow的一个不错的选择。它的速度非常快,并提供了一套围绕计算机视觉的算法。 getting started教程介绍了图像加载。

import cv2

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

请务必注意,OpenCV将通道堆叠为蓝绿色红色,将枕头堆叠为红绿色蓝色,但是,只要您使用OpenCV API,您就有很多选择可以转换为RGB或您想要的任何其他色彩空间。