SeedVR2 Tile Stitcher (Seamless)
The node that makes tiled SeedVR2 look like it was never tiled
- tiles
- tile_info
- image
Tiling fixes SeedVR2's OOM problem, then hands you a new one: seams. When each tile gets upscaled independently, the diffusion model resolves the overlap differently on each side, and a naive stitch leaves a grid of visible boundaries - the community's words for it are "tiles regenerate too independently" and it's the number-one complaint in tiled SeedVR2 threads. This node is the other half of this pack's answer: it takes your processed tiles and rebuilds the full image with Laplacian pyramid blending, which is how you make the seams disappear instead of feathered-over-them-then-hope.
It pairs with the pack's Tile Splitter - the splitter hands it a tile_info dict describing the grid, and it reconstructs at the original aspect ratio at whatever upscale_by you chose. That's the whole workflow in four nodes: split, upscale each tile, stitch, save.
How it works
Most tile utilities blend overlaps with a linear alpha ramp, which is exactly why you still see the grid - a straight alpha fade smears both the low-frequency brightness difference and the high-frequency detail difference the same way. This one does multiresolution blending properly:
- Each tile is broken into a Laplacian pyramid - four levels that separate low-frequency gradients from high-frequency detail.
- A Gaussian pyramid of a distance-weighted mask feathers the overlap region, ramping to full strength as you move toward the tile center.
- Each frequency band is blended separately, then the pyramid is collapsed back into one image.
The payoff: smooth brightness gradients merge gradually and fine detail merges cleanly, so neither one leaves a boundary line. If you've ever squinted at a tiled upscale and seen faint squares, this is the fix.
One thing the source tells you that the README doesn't: the stitch runs on the CPU (tiles.cpu().float()), not the GPU. That's fine - it's the lightweight step - but it means the stitcher is the slow spot on very high-res outputs, and it can look bad on a weak CPU. It's not a bug; it just lives where your RAM does.
The inputs
Tiny node, three inputs:
tiles(IMAGE) - the processed tiles, straight out of the SeedVR2 node. Batch order must match what the splitter emitted.tile_info(TILE_INFO) - from this pack's Tile Splitter. This is the coupling that makes splitter and stitcher a matched pair: arbitrary tiles from some other tiling setup won't have it, so you can't just drop this node into a foreign pipeline and expect magic.black_level_fix(default 0.05) - a diffusion upscale pass can lift the black level slightly, leaving the output looking washed or hazy in the darks. This shifts blacks back down and rescales. If your pipeline didn't go through a diffusion pass, set it to 0 or you'll crush shadows that were never lifted.
The single output is image - the full reconstructed upscale, at the original aspect ratio. Wire it to a Save Image or Preview Image node.
Installing
Same story as the rest of the pack: no requirements.txt, pure torch. ComfyUI Manager → search "SeedVR2 TilingWrapper", or:
cd ComfyUI/custom_nodes
git clone https://github.com/turinastudio/ComfyUI-SeedVR2-TilingWrapper.git
Restart, and you'll find it under SeedVR2_Tiling. One stale-README note: the README's clone URL says shikasensei-dev/..., but the repo actually lives at turinastudio/... - use the one above.
Common issues
- Grid artifacts remain. The overlap at split time was too small for what you're upscaling - go back to the splitter and raise
overlapto 160–256. The stitcher can only blend what exists. - Output looks darker/crushed. Your pipeline didn't raise blacks, but
black_level_fixis still at 0.05. Drop it to 0. - "Can't find TILE_INFO" / wrong tiles. You're feeding tiles from a different splitter. This node only understands this pack's
tile_info. - Stitching is slow. It's doing the pyramid math on CPU. If a single upscale takes minutes on a small machine, that's expected - not stuck.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| tiles | IMAGE | — | |
| tile_info | TILE_INFO | — | |
| black_level_fix | FLOAT | 0.050–0.2 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |