5

40000x40000 などの巨大な画像からタイルを作成しようとしています。

彼がタイルを切り取るimagemagickのスクリプトをオンラインで見つけました。10000x5000などの小さな画像では問題なく動作します

大きくなると、メモリを使い切ってしまい、コンピューターが死んでしまいます。

制限オプションを追加しましたが、効果がないようです

そこにモニターがありますが、スクリプトが速度を落としてマシンをロックアップするだけなので役に立ちません

50ギガのスワップディスクのように貪欲になり、マシンを強制終了するようです

問題は、各タイルをトリミングするときにそれらをメモリに保持することだと思います。私が必要だと思うのは、すべてのタイルをメモリに保存するのではなく、作成時に各タイルをディスクに書き込むことです。

これがこれまでのスクリプトです

 #!/bin/bash
 file=$1
 function tile() {
 convert -monitor -limit memory 2GiB -limit map 2GiB -limit area 2GB $file -scale ${s}%x -crop 256x256 \
 -set filename:tile "%[fx:page.x/256]_%[fx:page.y/256]" \
 +repage +adjoin "${file%.*}_${s}_%[filename:tile].png"
 }
 s=100
 tile
 s=50
 tile
4

4 に答える 4

7

libvipsには、必要なことを非常に迅速に実行できるオペレーターがあります。ドキュメントには、 dzsave を紹介し、その仕組みを説明する章があります。

また、比較的少ないメモリでも実行できます。私は定期的に 200,000 x 200,000 ピクセルのスライド イメージを 1 GB 未満のメモリで処理しています。

この回答を参照してください。ただし、簡単に説明します。

$ time convert -crop 512x512 +repage huge.tif x/image_out_%d.tif
real    0m5.623s
user    0m2.060s
sys     0m2.148s
$ time vips dzsave huge.tif x --depth one --tile-size 512 --overlap 0 --suffix .tif
real    0m1.643s
user    0m1.668s
sys     0m1.000s
于 2013-03-08T12:20:39.417 に答える
7

ImageMagick フォーラムの人たちの助けを借りて、さらに掘り下げた後、何とか機能させることができました。

それを機能させるための秘訣は.mpcformat です。これは ImageMagick が使用するネイティブの画像形式であるため、最初の画像を変換する必要はなく、必要な部分を切り取るだけです。これは、セットアップした 2 番目のスクリプトの場合です。

という50000x50000 .tif画像があるとしmyLargeImg.tifます。最初に、次のコマンドを使用してネイティブ イメージ形式に変換します。

 convert -monitor -limit area 2mb myLargeImg.tif myLargeImg.mpc

次に、タイルを作成する次の bash スクリプトを実行します。mpc イメージと同じフォルダーに名前の付いたファイルを作成しtiler.sh、次のスクリプトを配置します。

 #!/bin/bash
 src=$1
 width=`identify -format %w $src`
 limit=$[$width / 256]
 echo "count = $limit * $limit = "$((limit * limit))" tiles"
 limit=$((limit-1))
 for x in `seq 0 $limit`; do
   for y in `seq 0 $limit`; do
     tile=tile-$x-$y.png
     echo -n $tile
     w=$((x * 256))
     h=$((y * 256))
     convert -debug cache -monitor $src -crop 256x256+$w+$h $tile
   done
 done

コンソール/ターミナルで以下のコマンドを実行し、タイルが一度に 1 つずつフォルダーに表示されるのを確認します。

 sh ./tiler.sh myLargeImg.mpc
于 2012-05-14T12:15:28.653 に答える
2

GDALプロジェクトのgdal_translateユーティリティを使用してみてください。プロジェクト名の「地理空間」に怖がらないでください。GDALは、さまざまな形式のラスターデータにアクセスして処理するための高度なライブラリです。地理空間ユーザー専用ですが、通常の画像の処理にも問題なく使用できます。

in.tif寸法40000x40000ピクセルの大きなファイルから256x256ピクセルのタイルを生成する簡単なスクリプトは次のとおりです。

#!/bin/bash
width=40000
height=40000
y=0
while [ $y -lt $height ]
do
   x=0
   while [ $x -lt $width ]
   do
      outtif=t_${y}_$x.tif
      gdal_translate -srcwin $x $y 256 256 in.tif $outtif
      let x=$x+256
   done
   let y=$y+256
done

GDALバイナリは、ほとんどのUnixライクなシステムで利用でき、Windowsはダウンロード可能です。

于 2012-05-10T22:46:44.527 に答える
1

ImageMagick は、この種のタスクには適していません。あなたのような状況では、VIPS ライブラリと関連するフロントエンド Nip2 を使用することをお勧めします

VIPS は、非常に大きな画像を処理するために特別に設計されています。

http://www.vips.ecs.soton.ac.uk/index.php?title=VIPS

于 2012-05-10T21:23:50.600 に答える