Добавление изображений с резкостью узла (libvips)

Я хочу использовать VIPS, чтобы добавить каталог из множества изображений меньшего размера к одному массивному изображению. Модуль узла "sharp" использует libvips. Есть ли способ использовать резкость для добавления 2 изображений вместе? В VIPS есть функция "LRJOIN", но я не вижу ее четкой реализации.

Я действительно просто хочу узнать самый быстрый способ заставить VIPS добавить каталог изображений в один большой TIFF. Изображение слишком велико для использования ImageMagick и т. д. из-за проблем с памятью.

Редактировать:

Я использовал ruby-vips, чтобы соединить изображения и вызвать инструмент командной строки VIPS для создания DZI.

#!/usr/bin/ruby

require 'rubygems'
require 'vips'

a = VIPS::Image.new(ARGV[1])
ARGV[2..-1].each {|name| a = a.tbjoin(VIPS::Image.tiff(name, :compression => :deflated))}                              
a.write("output.tiff", :compression => :deflated)

system("vips dzsave output.tiff '#{ARGV[0]}'/output_dz.zip --overlap=0 --suffix=.jpg")

Я нашел код на ruby-sharp выпуске github и немного изменил его. Результаты (только соединяющая часть) для 550 изображений 4096x256:

real    0m17.283s
user    0m47.045s
sys     0m2.139s

person JHawk    schedule 13.07.2015    source источник
comment
github.com/lovell/sharp/ blob/master/ или даже лучше github.com/lovell/sharp/blob/master/ :)   -  person Lovell Fuller    schedule 14.07.2015
comment
Просто хотел убедиться, что ничего не пропустил! Я закончил тем, что использовал ruby-vips, чтобы сделать размолвку и дзи. Хотя Sharp великолепен, я очень заинтересован в том, чтобы запустить его на AWS Lambda.   -  person JHawk    schedule 16.07.2015
comment
Re: AWS Lambda, есть несколько предложений по компиляции необходимой статической библиотеки на github.com/ lovell/sharp/issues/169   -  person Lovell Fuller    schedule 16.07.2015


Ответы (1)


Если Ruby или Python в порядке, вы можете попробовать их. Например:

#!/usr/bin/python

import sys
from gi.repository import Vips

if len(sys.argv) < 3:
    print("usage: join outfile in1 in2 in3 ...")
    sys.exit(1)

def imopen(filename):
    return Vips.Image.new_from_file(filename,
                                    access = Vips.Access.SEQUENTIAL_UNBUFFERED)

acc = imopen(sys.argv[2])
for infile in sys.argv[3:]:
    acc = acc.join(imopen(infile), Vips.Direction.HORIZONTAL,
                   align = "centre",
                   expand = True,
                   shim = 50,
                   background = 255)

acc.write_to_file(sys.argv[1])

Для объединения 100 tif-изображений 2000x2500 rgb требуется 1 ГБ памяти и около 30 секунд на этом рабочем столе:

$ time ../join.py x.tif *.tif
real    0m36.255s
user    0m8.344s
sys 0m3.396s
$ vipsheader x.tif 
x.tif: 204950x2500 uchar, 3 bands, srgb, tiffload

Очевидно, что большая часть времени тратится на дисковый ввод-вывод.

person jcupitt    schedule 14.07.2015
comment
У меня возникли проблемы с работой привязки python в Amazon Linux, поэтому я использовал Ruby. Интересно, что ваши столько времени провели в IO. - person JHawk; 16.07.2015
comment
Это механический жесткий диск, и данные не были в кеше. Если я запускаю команду во второй раз, я думаю, это всего 3 секунды. - person jcupitt; 16.07.2015