gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:05:10 28 4
gpt4 key购买 nike

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

下面的代码适用于较小的图像。我已经考虑尝试手动设置 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.

感谢任何帮助!

最佳答案

来自 Pillow 的 DecompressionBombErrorsafety feature对于网络服务,但如果您信任图像的来源,那么它只是一个任意限制。具有 1435500544 像素的 RGB 图像每个像素有 24 位,因此大约需要 4.3 GB RAM,这远远超出了 default Pillow limit 178956970 像素 ( about 0.5GB for an RGB image .)
根据他们的文档,您可以执行以下操作:

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 。它的速度非常快,并提供了一套围绕计算机视觉的算法。 getting started教程涵盖图像加载。

import cv2

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

需要注意的是,OpenCV 将 channel 堆叠为蓝-绿-红,Pillow 将 channel 堆叠为红-绿-蓝,但只要您使用 OpenCV API您将有很多选项可以转换为 RGB 或您想要的任何其他色彩空间。

关于python - 如何使用PIL加载大于MAX_IMAGE_PIXELS的图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56174099/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com