libvips Ближайший сосед / Бикуби c Deep Zoom Создание пирамиды - PullRequest
2 голосов
/ 29 января 2020

Я нахожусь в процессе перемещения некоторого моего кода из 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]')

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

1 Ответ

2 голосов
/ 31 января 2020

По умолчанию 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? Стандарт DeepZoom перекрывается 1. Перекрытие 1 означает, что по краям каждой плитки есть дополнительный пиксель, поэтому плитки в центре изображения будут делить два пикселя на каждом крае со своими соседями. Установка overlap=2 означает, что вы будете иметь четыре пиксельных перекрытия, до некоторой степени запутанно.

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

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

...