如何查看大图像的实时拼接?

时间:2018-06-26 09:46:22

标签: python image-processing deepzoom openseadragon seadragon

我建立了一个代码,可以缝制约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映像非常昂贵,因此我不想在每个运行循环中都创建它。替换图像可能是一种解决方案。有什么建议的人吗?

1 个答案:

答案 0 :(得分:0)

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

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

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