Изменение масштаба изображения с помощью libvips

У меня есть изображение 6130x5548 pixels, и я хочу масштабировать его так, чтобы самая длинная сторона была 32768 pixels (а затем сделать пирамиду плиток с 7 уровнями масштабирования). Я понимаю, что vips resize - это очевидный способ для чего-то подобного, поэтому я попробовал строку ниже

vips resize image_in.tif img_rescaled.tif 5.345513866231648

Число 5.34551 — это просто отношение 32768/6130, коэффициент масштабирования вдоль моего x axis. Если я хочу указать точные размеры в пикселях восстановленного изображения, как я могу это сделать, пожалуйста?

Я пытался использовать vips thumbnail для этой цели, я не знаю, рекомендуется это или нет, но это работает.

vips thumbnail image_in.tif img_rescaled.tif 32768

Что-то вроде этого, пожалуйста?

Кроме того, эти два подхода дают совершенно разные результаты с точки зрения размера МБ. В то время как vips thumbnail создает tif размера 2.8Gb, вызов vips resize возвращает tif размера 1.8Gb.

Оба изображения имеют (очевидно) одинаковые размеры 32768x29657 pixels, одинаковое разрешение 72dpi, но разные bit depth tif из vips thumbnail имеет 24 bit depth, а vips resize из 16 bit depth. Исходное изображение имеет bit depth=16.

Кроме того, я понимаю, что алгоритм, используемый vips translate, играет значительную роль в конечном размере файла. Могу ли я установить алгоритм, когда я использую vips thumbnail и/или bit depth, пожалуйста?


person Aenaon    schedule 23.05.2019    source источник
comment
Не могли бы вы объяснить, почему вам нужно увеличить масштаб в шесть раз, прежде чем строить пирамиду? Вы получите очень размытые пиксели. vipsthumbnail предназначен для создания миниатюр изображений, поэтому он превращает большинство изображений в sRGB, готовый для сохранения в формате jpeg.   -  person jcupitt    schedule 24.05.2019
comment
У меня есть около 300 тысяч точек для построения изображения. Вы видите только большое пятно маркеров, если не приближаетесь к чему-то более глубокому, чем уровень 5. В идеале я хотел бы дойти до уровня 8, но 7 — это хороший компромисс. Качество фонового изображения также не имеет первостепенного значения, я могу пойти на компромисс и в этом. Следовательно, я мог бы использовать интерполяцию cubic вместо lanczos, что приведет к немного меньшему размеру файла, или даже average, nearest и т. д., которые намного хуже с точки зрения качества, но размер файла также намного меньше.   -  person Aenaon    schedule 24.05.2019
comment
Просто чтобы немного расширить мой комментарий выше, если я хорошо понимаю, я не могу сделать 7 уровней масштабирования, если мое изображение не меньше 32768 pixels (width or height). В этом случае на уровне 7 одна единица будет соответствовать 1 пикселю. Если есть способ получить units per pixels = 0.5, то масштабирование до 16384 pixels тоже подойдет для меня, но я не думаю, что это возможно с vips   -  person Aenaon    schedule 24.05.2019


Ответы (1)


resize принимает только масштабный коэффициент, поэтому вам нужно его рассчитать. Вы можете использовать что-то вроде:

width=$(vipsheader -f width somefile.tif)
height=$(vipsheader -f height somefile.tif)
size=$((width > height ? width : height))
factor=$(bc <<< "scale=10; 32768 / $size")
vips resize somefile.tif huge.tif $factor

Я бы перешел на 8-бит перед масштабированием, так как вам нужно только 8 бит для отображения. Вы можете использовать:

vips colourspace thing.tif other.tif srgb

Сделать 8-битную версию srgb.

bash становится настолько уродливым, когда вы начинаете делать подобные вещи, что у меня возникает соблазн переключиться на pyvips .

import pyvips

image = pyvips.Image.new_from_file('somefile.tif', access='sequential')
image = image.colourspace('srgb')
image = image.resize(32768 / max(image.width, image.height))
image.dzsave('mypyramid')

У него есть дополнительное преимущество, заключающееся в том, что он не использует временные файлы. pyvips строит конвейеры операций обработки изображений, так что программа будет передавать пиксели из вашего ввода, увеличивать их размер и писать пирамиду одновременно и все параллельно. Это не будет использовать много памяти, и это будет быстро.

person jcupitt    schedule 24.05.2019