处理大型TIFF图像C ++ / Magick / libtiff

时间:2015-07-02 10:14:34

标签: c++ imagemagick tiff large-data

我正在编写基于OpenCV的C ++软件来分析大量的大型TIFF图像 - 特征提取和表征。我目前的方法是尝试将每个图像分割成较小的裁剪部分,单独分析每个图像并合并结果。我试图使用Image Magick转换函数进行裁剪,使用标志:

convert input.tif -crop 4000x4000 +repage -scene 0 "output%d.tif"

然而,这可以运行数小时,利用100%的RAM和100%的IO吞吐量而不产生任何输出。

magick识别input.tif给出的图像细节是:

input.tif TIFF64 63488x49408 63488x49408+0+0 8-bit sRGB 9.4112GB 0.000u 0:00.031

相同的指令在较小的(大约20k×20k)下采样版本的图像上运行,在5秒内返回输出。

这台电脑有8GB内存,Windows 8 x64和2.00GHz CPU。

有人能告诉我如何确定出错的地方吗?否则,任何人都可以建议我采用另一种方法来解决这个问题吗?

编辑1:更多信息

 c:\test>identify -list resource
Resource limits:
  Width: 214.7MP
  Height: 214.7MP
  Area: 14.888GP
  Memory: 6.9326GiB
  Map: 13.865GiB
  Disk: unlimited
  File: 1536
  Thread: 4
  Throttle: 0
  Time: unlimited

1 个答案:

答案 0 :(得分:1)

我认为我的另一个答案here应该对你有很大的帮助,但另外一件事你可以检查,就是你允许ImageMagick使用8GB的RAM。试试这个命令

identify -list resource
  Resource limits:
  Width: 214.7MP
  Height: 214.7MP
  Area: 4.295GP
  Memory: 2GiB        <---
  Map: 4GiB
  Disk: unlimited
  File: 192
  Thread: 1
  Throttle: 0
  Time: unlimited

并检查Memory选项。

如果它很低,你可以在命令行上用这样的东西增加它

convert -limit memory 6GiB ...

或使用这样的环境变量:

export MAGICK_MEMORY_LIMIT=8000000000
identify -list resource
Resource limits:
  Width: 214.7MP
  Height: 214.7MP
  Area: 4.295GP
  Memory: 7.4506GiB     <---
  Map: 4GiB
  Disk: unlimited
  File: 192
  Thread: 1
  Throttle: 0
  Time: unlimited