libvips и padding при создании пирамид изображений

Я пытаюсь сделать пирамиду из плиток с неквадратным изображением (width: 32768px and height: 18433px)

Я использую libvips следующим образом:

vips dzsave my_image.tif out_folder --layout google --suffix .png

С той же целью я также использовал gdal2tiles:

python gdal2tiles.py -p raster -z 0-7 -w none my_image.tif

Поскольку мое изображение не квадратное, при создании плиток 256x256 необходимо некоторое дополнение. Однако заполнение отличается между vips и gdal2tiles. Первый добавляет отступ внизу плитки, а второй — вверху (и является прозрачным). См. изображение ниже. Что показано на плитке 256x256 в корне пирамиды (т.е. zoom level=0). Я вручную добавил желтый фон и черный контур.

Можно ли с vips иметь отступ, аналогичный gdal2tiles, чтобы нижний левый угол плитки совпадал с углом изображения? Я рисую точки на своем изображении, поэтому полезно иметь начало координат внизу слева.

Как я могу также иметь прозрачный фон с vips? (хотя лучше бы это было в отдельном посте...)

введите здесь описание изображения


person Aenaon    schedule 22.05.2019    source источник


Ответы (1)


Вы можете запустить dzsave в качестве результата любой операции vips, используя .dz в качестве расширения файла и помещая аргументы в квадратные скобки после имени файла. Например, эта команда:

vips dzsave my_image.tif out_folder --layout google --suffix .png

Также можно записать как:

vips copy my_image.tif out_folder.dz[layout=google,suffix=.png]

Таким образом, вы можете решить свою проблему, расширив входное изображение до квадрата перед запуском dzsave.

Например:

$ vips gravity Chicago.jpg dir.dz[layout=google,suffix=.png,skip_blanks=0] south-west 32768 32768 --extend white

32768 — это ближайшая степень двух выше этой ширины изображения. Параметр skip_blanks запрещает dzsave выводить тайлы, равные пустому фоновому тайлу.

Эта команда делает это dir/0/0/0.png:

введите здесь описание изображения

(Я добавил черные линии, чтобы показать края)

Чтобы получить прозрачный фон, вам нужно добавить альфу. Для этого потребуется другая команда, и это выходит за рамки того, для чего на самом деле предназначен интерфейс командной строки vips.

Я бы переключился на что-то вроде Python. С помощью pyvips, например, вы можете написать:

import sys
import pyvips

im = pyvips.Image.new_from_file(sys.argv[1], access='sequential')

im = im.addalpha()

# expand to the nearest power of two larger square ... by default, gravity will
# extend with 0 (transparent) pixels
size = 1 << int.bit_length(max(im.width, im.height))
im = im.gravity('south-west', size, size)

im.dzsave(sys.argv[2], 
          layout='google', suffix='.png', background=0, skip_blanks=0)

Выполнить так:

$ ./mkpyr.py ~/pics/Chicago.jpg x

Чтобы сделать это x/0/0/0.png:

введите здесь описание изображения

(добавлен зеленый фон, чтобы показать прозрачность)

person jcupitt    schedule 23.05.2019
comment
Спасибо, Джон! CLI в порядке, мне нужно сделать это из Matlab, но также и для Python, поэтому я думаю использовать командную строку, особенно из Matlab. Я не смог поэкспериментировать со скриптом Python, я пытался установить vips, но получаю странную ошибку ModuleNotFoundError: No module named '_cffi_backend', но это может быть из-за моего Python. Я установил Python 3.7.2 неделю назад, и что-то не так. Могу я также спросить, почему плитка имеет оливково-зеленый фон? где этот набор и как он связан с альфой. - person Aenaon; 23.05.2019
comment
Похоже, модуль cffi не установился правильно, возможно, у вас не установлена ​​libffi? Я добавил оливково-зеленый фон, чтобы показать прозрачную область, я добавлю примечание. - person jcupitt; 23.05.2019