2017-06-21 66 views
1

我想調整大小並將巨大(1TB)的圖像分割爲256x256像素圖塊(Zoomify/OSM/Google Maps/XYZ模式)。圖像將採用BigTIFF或PSB(大文檔格式或Photoshop Big)格式。在Python中調整大圖像(大於可用RAM)

什麼是可以做到這一點的可用庫?我正在看看GDAL,但它產生的輸出很模糊,我不能將它設置得更好。理想情況下,我會考慮一個Lanczos內插器來完成這個任務。

是否有任何本機Python庫,或基於C的庫的包裝可以做到這一點? imagemagick的Python包裝可以做這樣的事情嗎?

如果沒有Python庫可用,我也開放了基於命令行的工具,我可以使用Python自動化。

+1

如果你沒有找到更好的選擇,你可以走火花分佈的計算路線。 –

+1

ImageMagick可以通過-crop操作符來實現。請參閱http://www.imagemagick.org/Usage/crop/#crop上的切片部分。我相信有Python ImageMagick API和Python Wand。 – fmw42

+0

我建議你看看'vips' http://www.vips.ecs.soton.ac.uk,也許它的作者約翰(@ user894763)會有一些建議。 –

回答

4

libvips可以高效地處理巨大的(大於RAM)圖像。它是一個流式圖像處理庫,因此它可以(在這種情況下)同時解壓縮,調整大小,平鋪和寫入所有內容,而不需要在內存中存儲整個圖像或者不需要任何臨時文件。

dzsave運營商將編寫DeepZoom/Zoomify/Google Maps金字塔。你可以在命令行這樣運行:

$ vipsheader y.tif 
y.tif: 104341x105144 uchar, 3 bands, srgb, tiffload 
$ ls -l y.tif 
-rw-r--r-- 1 john john 32912503796 Jun 13 13:31 y.tif 
$ time vips dzsave y.tif x 
real 3m4.944s 
user 9m21.372s 
sys 7m20.232s 
peak RES: 640mb 
$ ls -R x_files/ | wc 
227190 227172 2784853 

所以我的桌面上,它在約3分鐘轉換32GB的圖像23萬片。這是與一個機械硬盤,它可能會更快與SSD。有一個blog post introducing dzsave

a Python binding,所以你也可以這樣寫:

import pyvips 

image = pyvips.Image.new_from_file("y.tif", access = "sequential") 
image.dzsave("x") 

access選項告訴libvips,它應該流中的圖像。它可以閱讀BigTIFF和PSB,但您會發現TIFF加載器速度更快。

+0

偉大的答案!我忘記了libvips,並已開始思考一些自定義代碼。 – jsbueno