Как просмотреть мозаику большого изображения в реальном времени? - PullRequest
0 голосов
/ 26 июня 2018

Я создал код, который будет сшивать изображения размером 100X100 ок. Я хочу посмотреть этот процесс сшивания в режиме реального времени. Я использую Pyvips для создания большого изображения. Я сохраняю окончательное изображение в формате .DZI, так как для его отображения требуется меньше памяти. Ниже код копируется только для целей тестирования https://github.com/jcupitt/pyvips/issues/43.

#!/usr/bin/env python

import sys
import pyvips

# overlap joins by this many pixels
H_OVERLAP = 100
V_OVERLAP = 100

# number of images in mosaic
ACROSS = 40
DOWN = 40

if len(sys.argv) < 2 + ACROSS * DOWN:
    print 'usage: %s output-image input1 input2 ..'
    sys.exit(1)
def join_left_right(filenames):
    images = [pyvips.Image.new_from_file(filename) for filename in filenames]
    row = images[0]
    for image in images[1:]:
        row = row.merge(image, 'horizontal', H_OVERLAP - row.width, 0)
    return row
def join_top_bottom(rows):
    image = rows[0]
    for row in rows[1:]:
        image = image.merge(row, 'vertical', 0, V_OVERLAP - image.height)
    return image
rows = []
for y in range(0, DOWN):
    start = 2 + y * ACROSS
    end = start + ACROSS
    rows.append(join_left_right(sys.argv[start:end]))
image = join_top_bottom(rows)
image.write_to_file(sys.argv[1])

Для запуска этого кода:

$ export VIPS_DISC_THRESHOLD=100
$ export VIPS_PROGRESS=1
$ export VIPS_CONCURRENCY=1
$ mkdir sample
$ for i in {1..1600}; do cp ~/pics/k2.jpg sample/$i.jpg; done
$ time ./mergeup.py x.dz sample/*.jpg

здесь cp ~/pics/k2.jpg скопирует изображение k2.jpg 1600 раз из папки с фотографиями, поэтому измените его в соответствии с именем и местоположением вашего изображения.

Я хочу отображать этот процесс в режиме реального времени. Прямо сейчас после создания окончательного мозаичного изображения я могу отобразить. Просто идея, я думаю сделать большое изображение и показать его, а затем вставить меньшие изображения. Я не знаю, как это можно сделать. Я в замешательстве, так как мы также должны сделать пирамидальную структуру. Поэтому, если мы сначала создадим большое изображение, мы должны заменить изображения каждого уровня новыми изображениями. Создание образа .DZI стоит дорого, поэтому я не хочу создавать его в каждом рабочем цикле. Замена изображений может быть решением. Любое предложение, люди?

1 Ответ

0 голосов
/ 06 июля 2018

Я полагаю, у вас есть две проблемы: как поддерживать пирамиду в актуальном состоянии на сервере, и как поддерживать ее в актуальном состоянии на клиенте.Метод грубой силы будет состоять в том, чтобы постоянно перестраивать DZI на сервере и периодически сбрасывать плитки на клиенте (чтобы они перезагружались).Для чего-то подобного вам также нужно будет каждый раз добавлять кеш кэша к URL-адресам плиток, иначе браузер подумает, что он должен просто использовать свою локальную копию (не подозревая, что она обновилась).Конечно, этот метод грубой силы, вероятно, слишком медленный (хотя, возможно, было бы интересно попробовать!).

Для немного большей утонченности вы бы хотели создать пирамиду, точно выровненную с подизображениями.Таким образом, когда вы изменяете одно вспомогательное изображение, становится очевидно, какие плитки нужно обновить.Вы можете сделать это с DZI, если у вас есть квадратные субизображения, и вы используете размер плитки, который является некоторой четной долей размера субизображения.Также нет перекрытия плитки.Конечно, вам придется создать свой собственный конструктор DZI, поскольку существующие не предназначены для простой замены отдельных плиток.Если вы знаете, какие листы вы изменили на сервере, вы можете сообщить об этом клиенту (либо с помощью периодического опроса, либо с помощью чего-то вроде веб-сокетов), а затем сбросить только эти листы (опять же с очисткой кэша).

Другое решение, с которым вы могли бы поэкспериментировать, состояло бы в том, чтобы не пытаться использовать пирамиду как таковую, а просто плоский набор плиток с разумным разрешением, чтобы позволить пользователю перемещаться по сцене.Это значительно упростит обновление вашей пирамиды на сервере, поскольку все, что вам нужно будет сделать, это заменить одно изображение для каждого подизображения.Это может быть загружено и показано на клиенте нестандартным способом (не в OpenSeadragon), или вы даже можете использовать функцию мультиизображения OpenSeadragon, чтобы воспользоваться преимуществами панорамирования и масштабирования, как здесь: http://www.letsfathom.com/ (каждый альбомобложка - это самостоятельный объект изображения).

...