python - 如何使用 PIL 加载大于 MAX_IMAGE_PIXELS 的图像?
问题描述
我正在尝试将一些图像加载到我的 Jupiter Notebook 中,但 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.
任何帮助表示赞赏!
解决方案
DecompressionBombError
from Pillow 是 Web 服务的安全功能,但如果您信任图像的来源,那么它只是一个任意限制。具有 1435500544 像素的 RGB 图像每个像素有 24 位,因此它需要大约 4.3 GB 的 RAM,这远远超出了178956970 像素的默认 Pillow 限制( RGB 图像大约 0.5GB。)
根据他们的文档,您可以做类似的事情:
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)
它应该工作。如果您预计使用大图像,Pillow 的一个很好的替代品是OpenCV。它非常快,并提供了一套围绕计算机视觉的算法。入门教程涵盖了图像加载。
import cv2
# Load an color image as a numpy array
img = cv2.imread('messi5.jpg',1)
需要注意的是,OpenCV 将通道堆叠为蓝-绿-红,而 Pillow 将它们堆叠为红-绿-蓝,但只要您使用OpenCV API,您将有很多选项可以转换为 RGB 或任何其他颜色空间你要。
推荐阅读
- jquery - 加载时光滑的轮播调用事件
- python - 创建一个与另一个相同的 Python 关键字
- azure - Azure Powershell Function App 从 Data Lake Gen 1 读取内容
- python - 从 Django 中的 JSONField 访问嵌套数据
- linux - 延迟后将阻塞进程发送到后台
- c# - Umbraco.Core.Exceptions.BootFailedException:配置了连接字符串,但 Umbraco 无法连接到数据库
- svg - reportlab svg2rlg 绘制带边框的图像
- aws-lambda - AWS Aurora / Lambda 无服务器生产环境偶尔出现峰值
- r - 如何在R中多次使用grepl函数
- php - PHP SpreadSheet找不到自动调整列宽的功能