首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用PIL加载比MAX_IMAGE_PIXELS大的图像?

如何用PIL加载比MAX_IMAGE_PIXELS大的图像?
EN

Stack Overflow用户
提问于 2019-05-16 17:53:25
回答 1查看 8.7K关注 0票数 7

我正在尝试将一些图像加载到我的木星笔记本中,但是PIL.Image.open()说这个图像太大了。MAX_IMAGE_PIXEL是在PIL源代码中设置的,但是我的图像要大得多。我在想有没有办法解决这个问题?

下面的代码适用于较小的图像。我已经尝试过手动设置MAX_IMAGE_PIXEL,但似乎做不到。

代码语言:javascript
复制
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()

上面的代码返回以下错误:

代码语言:javascript
复制
---------------------------------------------------------------------------
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.

任何帮助都是非常感谢的!

EN

回答 1

Stack Overflow用户

发布于 2019-05-16 18:58:26

Pillow的DecompressionBombError是用于web服务的安全特征,但是如果您信任图像的来源,那么它只是一个任意的限制。一幅1435500544像素的RGB图像每像素有24位,所以它需要大约4.3GB的内存,这远远超过了178956970像素的缺省枕限 (大约0.5GB的RGB图像)。

根据他们的文档,你可以这样做:

代码语言:javascript
复制
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是枕头的一个很好的替代方案。它非常快速,提供了一套面向计算机视觉的算法。开始教程涵盖图像加载。

代码语言:javascript
复制
import cv2

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

重要的是要注意的是,OpenCV的通道是蓝绿红和枕头堆,它们是红绿蓝的,但是只要你使用OpenCV API,你就有很多选项可以转换为RGB或者任何你想要的颜色空间。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56174099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档