2014-01-13 63 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