0

私は Python 3 と Numpy を使用して、小さなタイルを大きな完全な画像に組み立てる画像処理タスクを処理してきました。

私はこれをします:

canvas = np.zeros((max_y + tilesize_y, max_x + tilesize_x, 3), dtype='uint8')

ここmax_xで、max_yは個々の画像タイルの最大開始座標です。次に、この大きなキャンバスに次のように画像を貼り付けます。

canvas[jj['YStart']: jj['YStart'] + tilesize_y, jj['XStart']: jj['XStart'] + tilesize_x] = temp_img

Wherejjは、各タイルが属する場所を記録するファイルリストのエントリです。Python を使用した VIPS で同様の操作を実現できるかどうか疑問に思っています。

4

1 に答える 1

1

VIPS には破壊的な操作はありません。新しいイメージを作成することしかできず、既存のイメージを変更することはできません。この制限があるため、vips は自動並列化や操作キャッシュなどを行うことができます。

舞台裏では、これを思ったほど非効率にしないようにするための追加の機械がいくつかあります。次のように問題を解決できます。

#!/usr/bin/python

import sys
import random

from gi.repository import Vips

# make vips leaktest itself .. this also reports a memory high-water mark
# you'll get a small speedup if you comment this out
Vips.leak_set(True)

composite = Vips.Image.black(10000, 10000)

for filename in sys.argv[1:]:
    tile = Vips.Image.new_from_file(filename, access = Vips.Access.SEQUENTIAL)
    x = random.randint(0, 10000)
    y = random.randint(0, 10000)
    composite = composite.insert(tile, x, y)

composite.write_to_file("output.tif")

ここには、すべての vips オペレーターの検索可能なリストがあります。

http://www.vips.ecs.soton.ac.uk/supported/current/doc/html/libvips/func-list.html

挿入のドキュメントは次のとおりです。

http://www.vips.ecs.soton.ac.uk/supported/current/doc/html/libvips/libvips-conversion.html#vips-insert

反復ごとに新しい (巨大な) イメージを作成しているように見えますが、実際には背後の vip がイメージを共有し、必要なビットのみを作成します。さらに、open で「シーケンシャル」ヒントを設定すると、最終的な tiff を書き込む際に、VIP がサブイメージをストリーミングできることを意味します。

次のように実行します。

$ time ./insert.py ~/pics/k*.jpg 
memory: high-water mark 53.81 MB
real    0m1.913s
user    0m0.939s
sys 0m0.266s
$ ls ~/pics/k*.jpg | wc
       8       8     278

それは8つの大きなjpg画像に貼り付けています。報告されているメモリ使用量はピクセル バッファ用であり、すべてのメモリが含まれているわけではありません。このスクリプトは、RGB と RGBA の画像を組み合わせて貼り付けようとすると壊れてしまいます。アルファ チャンネルを処理するために何かを追加する必要があります。

(実際には、破壊的な貼り付け操作があります。

http://www.vips.ecs.soton.ac.uk/supported/current/doc/html/libvips/libvips-draw.html#vips-draw-image

実際に画像を変更する必要があるペイントボックス スタイルのプログラム用にあり、一般的な使用にはあまり適していません)。

于 2015-10-19T09:52:44.137 に答える