首页 > 解决方案 > 如何查看大图实时拼接?

问题描述

我已经构建了一个代码,可以缝合大约 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将从 pics 文件夹中复制 k2.jpg 图像 1600 次,因此请根据您的图像名称和位置进行更改。

我想实时显示这个过程。现在,在创建最终的马赛克图像后,我可以显示了。只是一个想法,我正在考虑制作大图像并显示它,然后插入较小的图像。我不知道,它是怎么做到的。我很困惑,因为我们还必须制作金字塔结构。所以如果我们首先创建大图像,我们必须用新图像替换每个级别的图像。创建 .DZI 图像很昂贵,所以我不想在每个运行循环中都创建它。替换图像可能是一种解决方案。大家有什么建议吗??

标签: pythonimage-processingdeepzoomopenseadragonseadragon

解决方案


我想你有两个挑战:如何让金字塔在服务器上保持最新,以及如何在客户端保持最新。蛮力方法是不断地在服务器上重建 DZI,并定期刷新客户端上的图块(以便它们重新加载)。对于类似的事情,您还需要每次都向磁贴 URL 添加缓存块,否则浏览器会认为它应该只使用其本地副本(没有意识到它已更新)。当然,这种蛮力方法可能太慢了(尽管尝试一下可能很有趣!)。

为了更加巧妙,您需要制作一个与子图像完全对齐的金字塔。这样,当您更改单个子图像时,很明显需要更新哪些图块。如果您有方形子图像并且您使用的图块大小是子图像大小的几分之一,则可以使用 DZI 执行此操作。也没有瓷砖重叠。当然,您必须构建自己的 DZI 构造函数,因为现有的构造函数不能简单地替换单个图块。如果您知道您在服务器上更改了哪些图块,则可以将其传达给客户端(通过定期轮询或使用 Web 套接字之类的东西),然后仅刷新这些图块(再次使用缓存清除)。

您可以尝试的另一种解决方案是不尝试金字塔本身,而只是尝试一组具有合理分辨率的平面图块,以允许用户在场景中平移。这将大大简化您在服务器上的金字塔更新,因为您需要做的就是为每个子图像替换一个图像。这可以在客户端以自定义(非 OpenSeadragon)方式加载和显示,或者您甚至可以使用 OpenSeadragon 的多图像功能来利用其平移和缩放功能,例如:http: //www.letsfathom.com /(每张专辑封面都是自己独立的图像对象)。


推荐阅读