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 包也有帮助。
我正在开发一个程序,用于从相当大的图像中检测彩色地面控制点。 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)
加载大约需要半分钟。
使用此线程无济于事....
这可能是所用 tiff 库的限制。 需要将 bigTIFF 与 64 位表一起使用。 也许 USE_WIN32_FILEIO=OFF 在从源代码构建 openCV 时有帮助。 此外,使用使用大型 tiff 库的 python 包也有帮助。