You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用pyvips库从36万张基础瓦片创建.dzi图像

问题描述

我有360000张800x600像素的图像,需要带重叠拼接这些图像以生成可放大查看细节的完整图像。希望直接使用pyvips库从这些基础瓦片创建.dzi图像,而非先合成JPEG再转换。

我的尝试代码

import pyvips
import glob

# 创建图像数组
jpeg_images = glob.glob('*.jpg')
array_images= []
for i in jpeg_images:
    tile = pyvips.Image.new_from_file(i, access="sequential")
    array_images.append(tile)

# 拼接图像,across指定每行的图像数量
out = pyvips.Image.arrayjoin(array_images, 
across=len(jpeg_images)/2)

# 写入文件
out.write_to_file('big_dummy.jpg', Q=95)

# 读取图像
source_image = pyvips.Image.new_from_file(r'D:\Image 
processing\merge_images_python\dummy_images3\big_dummy.joeg')

# 创建dzi图像
source_image.dzsave('pyramid_new')

问题分析与解决方案

现有代码的核心问题

  • 内存过载:直接拼接36万张图成单张大JPEG完全不现实,会瞬间耗尽系统内存,arrayjoin处理海量图像的效率也极低。
  • 低级错误:读取文件时写错了后缀(big_dummy.joeg应为big_dummy.jpg)。
  • 缺失重叠逻辑:代码没有实现图像间的重叠拼接规则。
  • 冗余步骤:先合成大图再转.dzi完全没必要,pyvips支持直接基于瓦片构建金字塔。

正确实现思路

  1. 明确瓦片排列规则:先确定所有图像的网格位置(比如每行/每列的瓦片数量),以及相邻瓦片的重叠像素值。
  2. 流式拼接+低内存处理:利用pyvips的sequential访问模式,逐行加载瓦片并拼接,避免一次性加载所有图像到内存。
  3. 直接生成dzi金字塔:跳过中间大图的写入,拼接完成后直接调用dzsave生成可放大的.dzi文件。

示例代码(假设瓦片按行号_列号.jpg规则命名)

import pyvips
import os

# 核心配置
tile_width = 800
tile_height = 600
overlap_pixels = 20  # 相邻瓦片的重叠像素数
tiles_per_row = 600  # 36万张对应600x600的网格
tiles_per_col = 600
tile_dir = "你的瓦片存放目录"

# 计算拼接后的完整图像尺寸(扣除重叠部分)
full_width = tile_width * tiles_per_row - overlap_pixels * (tiles_per_row - 1)
full_height = tile_height * tiles_per_col - overlap_pixels * (tiles_per_col - 1)

def generate_row_images():
    """逐行生成拼接后的行图像"""
    for row_idx in range(tiles_per_col):
        row_tiles = []
        for col_idx in range(tiles_per_row):
            # 加载单张瓦片
            tile_path = os.path.join(tile_dir, f"{row_idx}_{col_idx}.jpg")
            tile = pyvips.Image.new_from_file(tile_path, access="sequential")
            
            # 裁剪重叠区域:非首列裁左侧重叠,非末列裁右侧冗余;行方向同理
            if col_idx > 0:
                tile = tile.crop(overlap_pixels, 0, tile_width - overlap_pixels, tile_height)
            if col_idx < tiles_per_row - 1:
                tile = tile.crop(0, 0, tile_width - overlap_pixels, tile_height)
            if row_idx > 0:
                tile = tile.crop(0, overlap_pixels, tile.width, tile_height - overlap_pixels)
            if row_idx < tiles_per_col - 1:
                tile = tile.crop(0, 0, tile.width, tile_height - overlap_pixels)
            
            row_tiles.append(tile)
        
        # 拼接当前行的所有瓦片
        yield pyvips.Image.arrayjoin(row_tiles, across=tiles_per_row)

# 逐行拼接成完整图像
row_generator = generate_row_images()
full_image = next(row_generator)
for row_img in row_generator:
    full_image = full_image.join(row_img, 'vertical')

# 直接生成dzi金字塔,无需中间文件
full_image.dzsave('final_pyramid', tile_size=256, overlap=1)

关键优化点

  • 流式处理:通过生成器逐行加载拼接,把内存占用控制在单张行图像的大小。
  • 重叠裁剪:精准处理瓦片的重叠区域,保证拼接后图像连续无重复。
  • 跳过中间文件:直接从拼接后的图像生成.dzi,节省磁盘空间和处理时间。

内容的提问来源于stack exchange,提问作者Aswin G Nath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 09:20:28