OpenCV 不会加载大图像 (~4GB)

OpenCV will not load a big image (~4GB)

我正在开发一个程序,用于从相当大的图像中检测彩色地面控制点。 TIFF 图像大约有 3 - 4 GB(大约 35 000 x 33 000 像素)。 我正在使用 Python 2 和 OpenCV 进行图像处理。

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 "workstation"(它有足够的马力来处理图像)。

预先感谢您的帮助:)

执行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).

出于好奇,我尝试使用 ascontiguousarray 获得一个连续的内存阵列(一个大的,但 比你的 4 GB 图像需要的少),但是在此之前,我已经偶然发现了一个内存分配问题:

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

在实践中,即使您有足够的 RAM,操作 4 GB RAM 图像的像素也不是一个好主意,您无论如何都需要根据 [=21 拆分它=] 也一样,这取决于您要对像素执行的操作的性质。

编辑 1:

正如我在您的回答下方的评论中所说,如果您有 16GB 的 RAM 并且能够使用 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 可以处理最大 10 GB 的图像。但当 cv2.imwrite() 函数出现时,情况确实如此。然而,对于 cv2.imread(),要读取的图像的大小要小得多:这是 2013 年 9 月 (Issue3258 #1438) 宣布的一个错误,据我所知,仍未修复。

原来是scikit-image came to the rescue, which I found out from .

下面让我将图像加载到 python 会话中:

import numpy as np
from skimage.io import imread

img = imread(path_to_file)

加载大约需要半分钟。

使用此线程无济于事.... 总之,pip install tifffile 并将 tif 文件加载到 numpy 数组中,然后可以像往常一样将其与 OpenCV 一起使用(但使用如此大的文件需要您自担风险……OpenCV 的设计假设图像小于1 十亿像素)

这可能是所用 tiff 库的限制。 需要将 bigTIFF 与 64 位表一起使用。 也许 USE_WIN32_FILEIO=OFF 在从源代码构建 openCV 时有帮助。 此外,使用使用大型 tiff 库的 python 包也有帮助。