我正在做一个程序,就是从一幅相当大的图像中检测彩色地面控制点。TIFF图像约为3-4 GB (约35000 x 33000 pix).我使用Python2和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“工作站”(它有足够的马力来处理图像)。
提前,谢谢您的帮助:)
发布于 2016-02-27 09:32:26
imread()的实现
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映像所需的内存数组少),但在此之前,我已经遇到了内存分配问题:
>>> 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做同样的事情。
请试一试:
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,而不是固定的。
发布于 2016-02-28 13:57:45
原来科学图像是来救我的,我从这里那里发现了这件事。
下面让我将图像加载到python会话中:
import numpy as np
from skimage.io import imread
img = imread(path_to_file)装货大约花了半分钟左右。
发布于 2020-04-06 03:01:23
用这条线没有用..。总之,pip安装tifffile,它将把tif文件加载到numpy数组中,然后这些数组可以像往常一样与OpenCV一起使用(但是这样大的文件将承担您自己的风险.OpenCV的设计假设是图像小于10亿像素)
https://stackoverflow.com/questions/35666761
复制相似问题