实施imread() https://github.com/Itseez/opencv/blob/2.4/modules/highgui/src/loadsave.cpp:
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 https://www.thomas-krenn.com/en/wiki/Linux_Performance_Measurements_using_vmstat).
出于好奇,我试图获得一个连续的内存阵列(一个很大的,但是less比您的 4 GB 图像需要的那个)使用ascontiguousarray http://docs.scipy.org/doc/numpy/reference/generated/numpy.ascontiguousarray.html#numpy.ascontiguousarray,但在此之前,我已经偶然发现了一个内存分配问题:
>>> img = numpy.zeros(shape=(35000,35000))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
MemoryError
>>>
实际上,即使您有足够的 RAM,操作 4 GB RAM 图像的像素也不是一个好主意,无论如何您都需要将其分割为兴趣区域 http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_core/py_basic_ops/py_basic_ops.html#image-roi,较小的区域,并且可能是channels http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_core/py_basic_ops/py_basic_ops.html#splitting-and-merging-image-channels也取决于您要对像素执行的操作的性质。
EDIT 1:
正如我在您的答案下面的评论中所说,如果您有 16GB 的 RAM 并且您能够使用以下命令读取该图像scikit http://scikit-image.org/docs/dev/api/skimage.html那么你没有理由不能使用 OpenCV 做同样的事情。
请尝试一下:
import numpy as np # Do not forget to import numpy
import cv2
img = cv2.imread('ortho.tif')
您忘记在原始代码中导入 Numpy,这就是 OpenCV 显然无法加载图像的原因。所有 OpenCV 数组结构都与 Numpy 数组相互转换,并且您读取的图像由 OpenCV 表示为内存中的数组。
EDIT 2:
OpenCV 可以处理大小最大为 10 GB 的图像。但这是真的cv2.imwrite()
功能。为了cv2.imread()
然而,要读取的图像的大小要小得多:这是 2013 年 9 月宣布的一个错误(问题 3258 #1438 https://github.com/Itseez/opencv/pull/1438)据我所知,这仍然没有解决。