如何处理大图像?

时间:2014-01-13 00:27:55

标签: c++ image-processing large-files

我需要处理(导出子部分)大图像(33600x19200)并且我不确定如何开始。

我尝试过简单地使用openframeworks分配图片,但我收到了这个错误:

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc

我对处理这么大的图像没有经验。我应该从哪里开始?

3 个答案:

答案 0 :(得分:3)

我维护vips, an image processing library,专门用于处理大型图片。它将使用许多CPU内核自动加载,处理和写入图像。您可以用C,C ++,Python,PHP和Ruby编写算法。它是快速,免费和跨平台的。

vips网站上有一个非常simple benchmark:加载图片,每边裁剪100像素,缩小10%,锐化和保存。对于笔记本电脑上的5k x 5k RGB TIF,ImageMagick需要1.6s和500MB RAM,vips需要0.4s和25MB。

ImageMagick非常棒,当然,它是免费的,记录完备,可以生成高质量的输出并且易于使用。 vips在大图像上更快。

答案 1 :(得分:2)

发生了

std::bad_alloc,因为您没有足够的内存来容纳整个图像。

为了处理如此大的事情,必须将它们分开,例如将图片威胁为一组具有明确定义的大小(例如1000x1000)的子部分/子图片并逐个处理它们。

另一种解决方案就是尽可能多地将内存投入到系统中。如果你有钱,程序应该只在一台特定的机器上运行,它肯定是一个选项,但我认为它清楚哪两种解决方案都更好;)

答案 2 :(得分:1)

我曾经遇到这样的问题,我找到了一个库GDAL,它保存了我,它提供了一个函数GDALDataset::RasterIO,它可以通过任何分辨率读/写图像的任何部分,我在openframeworks的介绍中没有找到替代品,也许有人会为openframeworks提供一个。