我需要处理(导出子部分)大图像(33600x19200)并且我不确定如何开始。
我尝试过简单地使用openframeworks分配图片,但我收到了这个错误:
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
我对处理这么大的图像没有经验。我应该从哪里开始?
答案 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提供一个。