2016-02-27 57 views
6

我正在研究一个程序,该程序是从相当大的图像中检测彩色地面控制点。 TIFF图像大约是3 - 4 GB(大概35 000 x 33 000像素)。 我正在使用Python 2和OpenCV来完成图像处理。OpenCV将不会加载大图像(〜4GB)

import cv2 
img = 'ortho.tif' 
I = cv2.imread(img, cv2.IMREAD_COLOR) 

这部分不会(总是)产生错误信息。同时显示图像的功能:

cv2.imshow('image', I) 

我也试图通过使用matplotlib显示图像:

plt.imshow(I[:, :, ::-1]) # Hack to change BGR to RGB 

是否有OpenCV的或Python关于大图像的任何限制? 你会建议如何加载这个iamge?

PS:我这样做的计算机是Windows 10“工作站”(它有足够的马力来处理图像)。

预先,感谢您的帮助:)

+0

错误信息说什么? – Hexaholic

+0

对于matplotlib plt.imshow(self.image [:,:,:: - 1]) 类型错误: 'NoneType' 对象没有属性 '\ _ \ _的GetItem \ _ \ _' 的OpenCV赛斯: OpenCV错误:断言失败(size.width> 0 && size.height> 0)在cv :: imshow,file .. \ .. \ .. \ modules \ highgui \ src \ window.cpp中,第261行 cv2.imshow ('image',self.image) cv2.error:.. \ .. \ .. \ modules \ highgui \ src \ window.cpp:261:error:(-215)size.width> 0 && size.height > 0在功能cv :: imshow 从本质上讲,它是图像的大小为0 x 0像素。 – cLupus

+0

...你肯定这个东西(当我说这个东西,我的意思是OpenCV和Python)已经编译为64位? – carlosdc

回答

3

imread()实施:

Mat imread(const string& filename, int flags) 
{ 
    Mat img; 
    imread_(filename, flags, LOAD_MAT, &img); 
    return img; 
} 

此分配对应于加载图像作为连续阵列的矩阵。因此,这取决于(至少部分)硬件性能:您的计算机必须能够分配4 GB的连续RAM阵列(如果您位于Debian发行版中,则可以通过运行来检查您的RAM大小,例如vmstat -s -SM)。

出于好奇,我试图让一个连续的内存阵列(一个大,但比你4 GB图像需要少一个)使用ascontiguousarray,但在此之前,我已经遇到一个内存分配的问题:

>>> img = numpy.zeros(shape=(35000,35000)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
MemoryError 
>>> 

在实践中,即使你有足够的内存,这不是一个好主意,操纵4 GB RAM图像的像素,你将需要在regions of interests条款反正拆呢,更小的区域,可能是channels也取决于不适用您想要对像素执行的操作。

编辑1:

正如我在你的答案我下面的评论说,如果你有16GB的内存,你就能够读取与scikit的形象那么有没有理由你不能做与OpenCV相同。

请这给一试:

import numpy as np # Do not forget to import numpy 
import cv2  
img = cv2.imread('ortho.tif') 

你忘了导入numpy的在你的原代码,这就是为什么OpenCV的显然没有加载图像。所有的OpenCV数组结构都被转换为Numpy数组,并且您读取的图像被OpenCV表示为内存中的数组。

编辑2:

的OpenCV可以处理imaes其大小可达10 GB。但是,当它出现cv2.imwrite()函数时,情况就是如此。但是,对于cv2.imread(),要读取的图像大小要小得多:这是2013年9月发布的一个错误(Issue3258 #1438),它仍然是AFAIK,尚未修复。

+0

感谢您的提示。该计划的目标之一是自动找到感兴趣的地区。因此,整个图像必须在记忆中,尽管并非同时不是必然的。我听说过''h5py'](http://www.h5py.org/),它应该和你的建议做类似的事情。我对这个图书馆没有任何经验。 – cLupus

+0

你的机器有多少内存? @cLupus –

+0

该计算机有16 GB的RAM(DDR3)。 – cLupus

2

事实证明,scikit-image来救援,我从here发现。

下面就让我的图像加载到一个Python会话:

import numpy as np 
from skimage.io import imread 

img = imread(path_to_file) 

过了约半分钟,还是这样,加载。

+0

它运行时没有错误,但变量img是空的(np.size(img)给出输出1),而scikit的imread给出了一个包含数据(大约40亿比特)的图像。 – cLupus

+1

我想你做了正确的决定,不依赖于OpenCV这个特定的图像:我花时间四处看看,因为你的问题吸引我。最后我发现这是一个** bug **。你可以检查我的答案的编辑,并...接受它,因为这是你面临的问题的解释。最后,这是图书馆本身的问题,而不是硬件或其他问题。 –