我正在尝试处理一个巨大的numpy数组,然后我最终使用cv2.imwrite(numpy.array)
写入JPEG图像。不幸的是,即使最终的JPG图像只能达到200 MB左右,我正在使用的内容也不适合我的RAM。
如何管理此类负载而不会使RAM过载?
是否有其他方法可以在不将整个阵列同时存储在RAM的情况下写入图像?我可以一次加载一小部分数组,但我不知道用哪个模块/函数写入图像而不立即将整个内容存储在我的RAM中。
到目前为止,我已经将整个图像保存在4个较小的图像(四分之一)中,因为这是我用有限的RAM做的最好的。但我仍然希望能够将它们拼接成一个完整的图像。目标图像是3通道26112 x 20480图像。
答案 0 :(得分:2)
如果图像大小为26112 x 20480,有三个通道,每个通道一个字节,未压缩数据需要3 x 26112 x 20480字节,大小约为1.5千兆字节。 JPEG文件可以比这小得多,因为它使用有损压缩,但图像的OpenCV表示不会。
Jpegtran证明了压缩表示中的某些操作(例如块边界上的裁剪),但对于OpenCV中的大部分操作,您必须解压缩数据。如果您的算法碰巧是可以根据8x8块的DCT系数直接编写的,那么您不必解压缩,但OpenCV不会帮助您。
我不知道OpenCV是否可行,但numpy支持memory-mapped I/O原始数组数据。当您读取一个不在内存中的数据页面时,操作系统会从映射文件中读取它,如果内存不足,它将逐出某些页面。它将取决于您的数据访问模式,如果这将是高性能。原则上你应该能够简单地在一个文件中调用mmap,你已经在正确的内存布局中解压缩了所有图像数据wrap the pointer in an OpenCV array,但我自己没有尝试过这个。
答案 1 :(得分:1)
您可以使用稀疏矩阵进行大图像处理。一个可能适合您的库是Eigen。 Here is a tutorial关于在该库中使用稀疏矩阵。
OpenCV也支持稀疏矩阵。