gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:46:19 26 4
gpt4 key购买 nike

我正在开发一个程序,用于从相当大的图像中检测彩色地面控制点。 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 有什么限制吗?您建议如何加载此图像?

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

预先感谢您的帮助:)

最佳答案

执行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 图像的像素也不是一个好主意,您无论如何都需要根据 regions of interests 来拆分它。 ,面积较小,可能是 channels 也取决于您要对像素执行的操作的性质。

编辑 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),据我所知,仍未修复。

关于python - OpenCV 不会加载大图像 (~4GB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35666761/

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