3

有谁知道如何使用 python 打开一个大的图像文件?我尝试使用 ipython 通过 windows 命令提示符打开一个图像文件(大约 2 GB),但是每次将图像值更改为数组后它都会崩溃。

我的笔记本电脑是 window7-64bit,配备 4GB 内存和 Intel(R) Core(TM) i7-2860 QM CPU。

错误消息是:python.exe 已停止工作一个问题导致程序停止正常工作。Windows 将关闭该程序并通知您是否有可用的解决方案

这是我的代码。

import Image
import numpy as num
im=Image.open('myimage.tif')
imarray=num.array(im)
4

2 回答 2

7

你有多少内存?您将需要超过 2GB 的 RAM 来存储 2-gig 图像。我不知道Image存储图像的效率如何,但是一个字节列表为列表中的每个元素使用四个字节的空间,所以你会烧掉超过 8GB 的​​(虚拟)内存......还有很多耐心. 编辑:因为你只有 4(或 3)GB 的空间可以玩,这几乎肯定是你的问题。

但是,您为什么要尝试将其转换为数值数组?使用im返回的对象的方法Image.open,如PIL 教程中所述。

我不知道你在用图像做什么,但也许你可以在不读取内存中的整个图像的情况下做到这一点,或者至少不需要将整个对象转换为numpy数组。如果可能的话,一点一点地阅读它以避免炸毁您的机器:阅读 python 生成器,并查看该Image.getdata()方法,该方法一次返回您的图像一个像素值。

于 2012-07-20T19:29:46.230 回答
2

我不知道将 numpy 与PIL一起使用,但这是我将像素数据读入数组的方式(这使用.jpg图像)。在过去,这效果很好,但我认为我没有尝试过使用图像,所以你的问题可能归结为内存问题

import Image
im = Image.open('pic.jpg')

pix_ar = im.load()       # load image into 2D array
red_pixel = 255, 0, 0    # a red RGB pixel

并像这样访问单个元素:

x = 10
y = 5
print pix_ar[x, y]
(255, 255, 255)

或赋值

pix_ar[x, y] = red_pixel

重新内存:一旦将 2GB 图像“解压缩”为单个像素值,它最终可能会占用2GB更多的 RAM,这取决于数据结构在将其读入某些变量/数据后为您存储此信息的效率如何结构体。考虑到您还同时运行操作系统和其他一些应用程序,同时还尝试将这个大文件读入内存,4 GB 的 RAM 不太可能足够。

此外,如果您过去成功地将使用 PIL 打开的文件传输/读取到 numpy,则上述代码可能没有帮助。

于 2012-07-20T19:31:32.010 回答