libvips Ближайший сосед / Создание бикубической пирамиды с глубоким масштабированием

Я нахожусь в процессе переноса части своего кода с openzoom.py на Libvips, но не уверен, как диктовать метод интерполяции, что важно. Мне, по крайней мере, нужно иметь возможность использовать бикубический/билинейный в одном случае и ближайших соседей в другом случае.

Мой старый код выглядит следующим образом:

creator = deepzoom.ImageCreator(tile_size=128, tile_overlap=2, tile_format="png",
                                        image_quality=0.8, resize_filter="nearest")
creator.create(sourceFile, destFile)

В настоящее время, используя pyvips, у меня есть следующее

image = pyvips.Image.new_from_file(sourceFile)
image.dzsave(destFile, tile_size=128, overlap=2,
                     suffix='.png[Q=80]')

Любая помощь будет принята с благодарностью :)


person Simon Warchol    schedule 29.01.2020    source источник


Ответы (1)


По умолчанию dzsave усредняет каждый блок 2x2 пикселей, что эквивалентно билинейному.

Иногда, например, с изображениями, где значения пикселей представляют метки, а не интенсивность, вам нужно уменьшить размер без интерполяции. В этих случаях вы можете использовать параметр region_shrink для выбора median или mode, оба из которых сохранят значения меток.

Я хотел бы использовать:

image = pyvips.Image.new_from_file(sourceFile, access='sequential')
image.dzsave(destFile,
             overlap=1,
             tile_size=126,
             region_shrink='mode',
             suffix='.png')

Не забудьте установить подсказку access. Это значительно улучшит скорость и поведение памяти для больших изображений, которые не поддерживают произвольный доступ.

Число PNG Q задает качество квантования при выводе изображений с палитрой. Возможно, вы имеете в виду compression? libvips по умолчанию имеет значение 6, стандарт PNG.

Вы уверены, что хотите overlap=2? Стандарт глубокого масштабирования — перекрытие 1. Перекрытие 1 означает, что по краю каждой плитки имеется один дополнительный пиксель, поэтому плитки в центре изображения будут иметь два общих пикселя на каждом краю со своими соседями. Установка overlap=2 означает, что у вас будет четыре перекрытия пикселей, что сбивает с толку.

Точно так же tile_size=128 означает, что большинство ваших плиток будут иметь размер 132x132 пикселя. Для PNG это не имеет значения, но JPG лучше всего работает с числами, кратными 8 на оси. Я бы установил tile_size на (128 - 2 * перекрытие), как по умолчанию делает deepzoom.

git master libvips также добавляет max, min и nearest (всегда выбирайте верхний левый пиксель). У ветки есть lanczos3, но она так и не была объединена по разным причинам.

person jcupitt    schedule 31.01.2020
comment
Благодарю вас! Это именно то, что мне нужно было сделать, и я ценю, что вы заметили другие мои ошибки :) - person Simon Warchol; 03.02.2020
comment
Пожалуйста, рассмотрите возможность принятия ответа Джона (щелкнув галочку) рядом с подсчетом голосов, если это то, что вы искали. Надеюсь, вы могли бы также проголосовать за это. - person Mark Setchell; 18.02.2020