ComfyUI Node

Panorama Cutout

Take a normal photo from inside your 360° panorama

By nomadoor·Created 6 months ago·Updated 13 days ago· 162
Panorama Cutout
  • erp_image
  • audio
  • rect_image
  • sticker_state
  • mask
coverage360
state_json
output_megapixels1.00
fps24

A 360° equirectangular image - that squished 2:1 rectangle where the whole world is wrapped around the middle - is genuinely hard to judge flat. You can't tell what a given direction actually looks like, where the horizon sits, or whether the geometry holds up. Panorama Cutout is the node that fixes that by letting you "take a photo" from inside the panorama: you point a camera at whatever direction you like, and it extracts a normal perspective frame you can actually look at, edit, and use.

It's one of four nodes in nomadoor's ComfyUI-Panorama-Stickers pack, which was built around the author's FLUX.2 Klein 360° ERP outpaint LoRA. That pack treats "make a panorama" as an outpainting problem - and the whole reason outpainting is usable is that you can step inside the result and pull out clean views. Cutout is the "step inside" half of the loop. The other half is Panorama Stickers, which drops images back into the sphere. The two feed each other.

How it works

The node samples the equirectangular image at a given direction - yaw, pitch, and a horizontal/vertical field of view - using a bilinear sampling map that inverts the ERP projection. Open the node and you get an interactive modal editor (WebGL-rendered since v1.1.0) where you drag to look around and frame your shot. Since v1.4.0 the Frame view is an interactive crop-style camera editor with direct framing, aspect-ratio, and roll controls. It also handles video: feed it a batch of ERP frames and it renders each one, with preview playback at the fps you set.

The inputs and outputs that matter

You mostly touch three things:

  • erp_image - your 2:1 equirectangular input. If it's a video batch, every frame gets cut out.
  • coverage - 360 (full sphere, the default) or 180 for half-sphere panoramas added in v1.3.0.
  • output_megapixels - default 1.0. This sets how big the extracted frame is. Bump it toward 4+ megapixels for a sharp export; drop it for quick drafts. The node caps at 4096 on the long side.

state_json carries your camera shot out of the modal editor - you normally never touch it by hand. fps and audio only matter when the input is video.

The outputs are where this node earns its keep:

  • rect_image - the extracted perspective frame.
  • sticker_state - the JSON position of that shot in 360° space. This is the clever bit: feed this back into Panorama Stickers along with rect_image, and the image gets placed back exactly where it came from. The author calls this "frame stitch back," and it's how you take a frame, fix it in a normal editor or inpaint pass, and drop the result into the sphere without re-painting anything.
  • mask - a mask of the frame, useful if you painted or edited part of it and want to composite selectively.

Installing it

Same story as every node in this pack: install via ComfyUI Manager (search "Panorama Stickers"), or clone it in:

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

Then restart ComfyUI. The pack has no model files of its own and no heavy Python deps - it runs on numpy/PIL/torch that ComfyUI already ships. The one optional extra is PyAV or similar encoders, only needed if you want mp4 preview playback for video inputs.

Where people get burned

The most common confusion: if you haven't actually configured a shot in the editor, the node does a pure passthrough - it returns your input image unchanged (plus an empty mask) rather than erroring. If you see the raw equirectangular coming out of rect_image, you haven't set a camera view.

Also worth knowing: this node extracts, it doesn't fix. If your panorama has a visible seam at the wrap point, the cutout will happily show it to you. That's a job for Panorama Seam Prep before you export, or a seam-inpaint pass after.

CategoryPanorama Suite

Inputs (6)

NameTypeDefaultDescription
erp_imageIMAGE
coverageCOMBO3602 options: 360, 180
state_jsonSTRING
output_megapixelsFLOAT1.00
fpsFLOAT241–120Preview playback framerate.
audiooptAUDIOOptional audio for preview playback.

Outputs (3)

NameTypeDescription
rect_imageIMAGE
sticker_stateSTRING
maskMASK