2014-01-13 89 views
0

我需要处理(导出小节)的大图像(33600x19200),我不知道如何开始。如何处理大图像?

我试着简单地分配使用openframeworks的形象,但我得到这个错误:

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

我没有经历过与处理的图像,此大。我应该从哪里开始?

+0

如果您想完全加载它,映像将需要大约2GB的内存。 –

+0

您没有提及该映像的操作系统或位深度。如果它是每个颜色文件RGB 8位,则它应该适合1.8 GB的RAM。如果它有alpha,2.4 - 如果它是每种颜色16位,则加倍。其中的任何一种应该能够适应现代机器的内存,所以很有可能每个进程都有某种操作系统限制。 –

+0

@MichaelGraff好点,对不起忘了提及:我正在处理Windows上的.tif文件:ibm/windows字节顺序,rgb colourspace,每通道8位,33600x19200像素,filezie实际上正好是磁盘上的1.8 GB –

回答

2

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

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

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

+0

所以我应该解析文件的块(头+一堆像素第一>处理这些,写结果,并记住我从哪里离开,清理,移动到下一个块并重复)? –

+0

没错,这种方式只有原始图像的一小部分驻留在内存中。 – Paranaix

+0

我忘记提及的另一个解决方案是直接在磁盘上运行。这可以通过正常的io(复杂的这项任务IMO)或通过使用特定于操作系统的方法来创建'http:// en.wikipedia.org/wiki/Memory-mapped_file'来实现。缺点当然是你会受到巨大的性能影响。 – Paranaix

1

我曾经遇到过这样的问题,我找到了一个库GDAL,它保存了我,它提供了一个功能GDALDataset::RasterIO,它可以通过任何分辨率读取/写入图像的任何部分,我没有在引入openframeworks时找到替代品,也许有人会提供一个用于openframeworks 。

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在大型图像上速度更快。

+0

真棒!那看起来正是我当时所期待的。我会放弃这一点。那时我最终编写了一个Photoshop Script来处理它,但是它的速度很慢,达到33600x19200像素。我会尝试重温这个工具,谢谢你的好评(+1) –

+0

@ user894763我有一个和上面类似的问题,我决定尝试vips。不幸的是,我找不到DLL的x86版本,只有64位版本的Windows。是32位支持? – Alex

+1

嗨@Alex,目前的Windows版本只有64位。你必须自己创造,或者以某种方式回到过去。它看起来像8.1有最后一个正式的32位Windows二进制:http://www.vips.ecs.soton.ac.uk/supported/8.1/win32/ – user894763