Nodes/ComfyUI-Panorama-Stickers/Panorama Seam Prep
ComfyUI Node

Panorama Seam Prep

Where the panorama wraps around, and how to fix the seam

By nomadoor·Created 6 months ago·Updated 13 days ago· 162
Panorama Seam Prep
  • image
  • image
  • mask
  • mask_blurred
seam_width_px64
seam_center_offset_px0
mask_blur_px10

Every equirectangular panorama has a seam: the place where the left edge and the right edge meet, i.e. the same point in the 360° world. And seams are the thing that keeps panoramas from looking finished. The author of this pack said it flat out in the r/comfyui thread where he launched it - seam matching is still hard with this approach, and you'll want post steps (upscale, inpaint) on top. Panorama Seam Prep is the node that makes those post steps easy.

It does two jobs. First, it rolls the seam into the center of the image, where a normal inpaint pass can actually reach it. Second, it hands you the mask of exactly that seam band - hard-edged or blurred - so you can inpaint it without touching the rest of the panorama. It's the "before you call it done" node in nomadoor's ComfyUI-Panorama-Stickers pack, and the one that's most useful standalone: it doesn't care about FLUX.2 Klein or the LoRA at all.

How it works

The mechanism is refreshingly simple and fully deterministic. The node takes your image and concatenates it with a horizontal copy of itself, so the left edge now sits next to the right edge in the middle of a doubled image. Then it crops a window out of that doubled strip. Result: the seam - which used to be at both edges - now runs vertically through the center of the output, ready for inpainting. At the same time it builds a mask marking a vertical band at that (new) seam position, and a Gaussian-blurred version of the same band for when you want feathered falloff instead of a hard cut.

The inputs

Four ints, that's the whole node - no editor state, no JSON, nothing hidden:

  • image - your ERP image, shaped [B,H,W,C]. The only required input.
  • seam_width_px - width of the seam band, default 64. This is the band that gets inpainted.
  • seam_center_offset_px - shifts the seam band left or right, default 0. Positive moves the band right; negative moves it left. Use this if your source's seam isn't exactly at the image midpoint.
  • mask_blur_px - how soft the blurred mask is, default 10. Set 0 for a hard mask only.

The outputs

  • image - your panorama with the seam relocated to the center. Feed this into the sampler/VAE side of your inpaint graph.
  • mask - the hard vertical band marking the seam.
  • mask_blurred - the same band, Gaussian-feathered, for gentler blending.

Wire image into your inpaint setup, mask (or mask_blurred) into the mask input - with the built-in SetLatentNoiseMask, for instance - and run your seam-fix pass. The blurred mask is the one you'll reach for most; a hard mask leaves an outline, a soft one doesn't.

Installing it

Same as every node in this pack: ComfyUI Manager (search "Panorama Stickers"), or:

cd ComfyUI/custom_nodes
git clone https://github.com/nomadoor/ComfyUI-Panorama-Stickers

Restart ComfyUI. No models, no extra deps - the math is torch/numpy only.

Where people get burned

The classic trap: people run a seam pass and wonder why the rest of the image changed too. The node only prepares - it shifts the seam and gives you masks, but it doesn't inpaint anything itself. You still have to run the actual inpaint step with the LoRA or another model, and the mask is there to make sure only the seam band gets touched.

Second, this assumes the seam is at the wrap edges. If your image already had its seam rolled somewhere else (for example, you re-rolled it earlier), the band won't line up - check the preview and nudge seam_center_offset_px until the band covers the actual seam. And remember it's built for 360 coverage by default; if you're on a 180 panorama, adjust your expectations for where the "seam" genuinely is.

CategoryPanorama Suite

Inputs (4)

NameTypeDefaultDescription
imageIMAGE
seam_width_pxINT641–2048
seam_center_offset_pxINT0-2048–2048
mask_blur_pxINT100–256

Outputs (3)

NameTypeDescription
imageIMAGE
maskMASK
mask_blurredMASK