Pano Seam Roll
The one node that fixes the wrap seam on a 360° pano
- image
- rolled_image
- seam_mask
Every equirectangular panorama has a lie baked into its left and right edges. The image wraps around 360°, but when you outpaint it the two ends rarely line up - the generated content on the far left won't match the far right, and the moment you view it as a full sphere you get a visible vertical seam exactly at that wrap point. This node is the standard fix, packaged into one call.
What it does
Pano Seam Roll rolls the pano by half its width so the wrap seam moves to the center of the frame, and emits a centered vertical seam mask for inpainting. You outpaint that masked center strip (where the seam now is), then run the node again on the result to roll everything back. Rolling by W/2 is its own inverse, so the same node both prepares and unrolls.
The clever bit: after the roll, the new left/right edges are former interior content, which is continuous by construction. Only the old seam (now the center strip) is a discontinuity, and it's the only thing you need to repaint. Roll back, and the freshly painted strip sits exactly where the wrap happens.
Inputs and outputs
image- the pano, on its way in or back out.seam_width- width of the center seam mask as a fraction of pano width. 0.06 ≈ a 6% strip, wide enough to cover the wrap discontinuity. Start there.feather- horizontal feather in pixels on the seam mask. Keep 0 for a hard binary mask (most inpainting samplers are happiest with hard edges); raise it if your model wants a soft mask.
Outputs are rolled_image (the rolled pano) and seam_mask (the center strip, ready for an inpainting sampler). On the unroll pass you can ignore the mask output.
How it fits the workflow
You've already warped your photo and outpainted the holes. Now, before calling it done: SeamRoll → inpaint the center strip with the same prompt/settings that generated the rest → SeamRoll again to roll back. If you'd rather keep the seam where it is and just mask it, Pano Seam Mask does the mask half alone, and Pano Roll Horizontal rolls by any fraction (not just half).
Install
It's part of Mickmumpitz-Nodes - MIT, no model downloads, dependencies are just numpy, Pillow and opencv-python. ComfyUI Manager, search "Mickmumpitz", or:
cd ComfyUI/custom_nodes && git clone https://github.com/mickmumpitz/ComfyUI-Mickmumpitz-Nodes.git
Restart and it's under Mickmumpitz/Panorama as "Pano Seam Roll". This is one of those nodes you'll reach for on every single pano, because the seam is the one artifact that never fails to show up.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| seam_width | FLOAT | 0.060.01–0.5 | Width of the centre seam mask as a fraction of the pano width. 0.06 ~= a 6% strip. Wide enough to cover the wrap discontinuity. |
| feather | INT | 00–256 | Horizontal feather (px) on the seam mask. Keep 0 for a hard binary mask; raise for a soft-mask sampler. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| rolled_image | IMAGE | — |
| seam_mask | MASK | — |