我如何使用OpenCV在Python中管理大型图像



我试图处理一个巨大的numpy数组,然后我最终使用cv2.imwrite(numpy.array)写入JPEG图像。不幸的是,我正在使用的内容不适合我的RAM,即使最终的JPG图像应该只有大约200 MB。

如何在不使RAM过载的情况下管理这些负载?

有没有其他的方法来写一个图像没有存储整个数组在我的RAM一次?我可以一次加载一小部分数组,但我不知道使用哪个模块/函数来写入图像,而不需要立即将整个内容存储在RAM上。

到目前为止,我已经将整个图像保存在4个较小的图像(四分之一)中,因为这是我在有限的RAM中所能做的最好的事情。但我仍然希望能够将它们拼接成一个完整的图像。目标图像为3通道26112 x 20480图像。

如果图像大小为26112 x 20480,有三个通道,每个通道一个字节,则未压缩的数据占用3 x 26112 x 20480字节,约为1.5 gb。JPEG文件可以比这小得多,因为它使用有损压缩,但图像的OpenCV表示没有。

一些操作(如裁剪块边界)是可能的压缩表示,由Jpegtran证明,但对于大多数事情,你会做在OpenCV你将不得不解压缩数据。如果你的算法恰好是可以直接用8x8块的DCT系数来编写的,你就不需要解压缩,但OpenCV在这方面帮不了你。

我不知道它是否适用于OpenCV,但numpy支持原始数组数据的内存映射I/O。当您读取不在内存中的数据页时,操作系统将从映射文件中读取它,如果内存耗尽,它将驱逐一些页面。这将取决于您的数据访问模式,如果这将是高性能的。原则上,您应该能够简单地在一个文件上调用mmap,其中您已经解压缩了正确内存布局中的所有图像数据,并将指针包装在OpenCV数组中,但我自己还没有尝试过。

您可以使用稀疏矩阵进行大型图像处理。一个可能对你有用的库是Eigen。下面是关于使用稀疏矩阵的教程。

OpenCV也支持稀疏矩阵

相关内容

  • 没有找到相关文章

最新更新