首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCV不会加载大图像(~4GB)

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

Stack Overflow用户
提问于 2016-02-27 06:55:11
回答 4查看 9.1K关注 0票数 8

我正在做一个程序,就是从一幅相当大的图像中检测彩色地面控制点。TIFF图像约为3-4 GB (约35000 x 33000 pix).我使用Python2和OpenCV进行图像处理。

代码语言:javascript
复制
import cv2
img = 'ortho.tif'
I = cv2.imread(img, cv2.IMREAD_COLOR)

此部分并不(总是)产生错误消息。在显示图像时:

代码语言:javascript
复制
cv2.imshow('image', I)

我还尝试使用matplotlib显示图像:

代码语言:javascript
复制
plt.imshow(I[:, :, ::-1])  # Hack to change BGR to RGB

对于大型图像,OpenCV或Python是否有任何限制?你有什么建议把这个装上吗?

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

提前,谢谢您的帮助:)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-02-27 09:32:26

imread()的实现

代码语言:javascript
复制
Mat imread( const string& filename, int flags )
{
    Mat img;
    imread_( filename, flags, LOAD_MAT, &img );
    return img;
}

这将分配相应的矩阵以连续数组的形式加载图像。因此,这取决于硬件性能(至少部分地):您的机器必须能够分配4GB的连续RAM数组(如果您在Debian发行版上,可以通过运行vmstat -s -SM来检查RAM大小)。

出于好奇,我试图使用获得一个连续的内存数组(一个大内存数组,但比您的4GB映像所需的内存数组少),但在此之前,我已经遇到了内存分配问题:

代码语言:javascript
复制
>>> img = numpy.zeros(shape=(35000,35000))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError
>>>

实际上,即使你有足够的内存,操纵一个4 GB内存图像的像素也不是一个好主意,而且你需要用http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_core/py_basic_ops/py_basic_ops.html#image-roi、更小的区域和可能也是http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_core/py_basic_ops/py_basic_ops.html#splitting-and-merging-image-channels来分割它,这取决于你想要在像素上执行的操作的性质。

编辑1:

正如我在下面的评论中所说的,如果您有16 do的内存,并且能够使用科舍特读取该图像,那么您就没有理由不能对OpenCV做同样的事情。

请试一试:

代码语言:javascript
复制
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的imaes。但是,当涉及到cv2.imwrite()函数时,这是正确的。然而,对于cv2.imread()来说,要读取的图像的大小要小得多:这是2013年9月发布的一个bug (https://github.com/Itseez/opencv/pull/1438),它仍然是AFAIK,而不是固定的。

票数 8
EN

Stack Overflow用户

发布于 2016-02-28 13:57:45

原来科学图像是来救我的,我从这里那里发现了这件事。

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

代码语言:javascript
复制
import numpy as np
from skimage.io import imread

img = imread(path_to_file)

装货大约花了半分钟左右。

票数 3
EN

Stack Overflow用户

发布于 2020-04-06 03:01:23

用这条线没有用..。总之,pip安装tifffile,它将把tif文件加载到numpy数组中,然后这些数组可以像往常一样与OpenCV一起使用(但是这样大的文件将承担您自己的风险.OpenCV的设计假设是图像小于10亿像素)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35666761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档