Nodes/ComfyUI-Furrey-TurnaroundSplitter/Auto-Split Turnaround Sheet
ComfyUI Node

Auto-Split Turnaround Sheet

Your Turnaround Sheet Is Four Images Wearing a Trench Coat

By SilentLuxRay·Created 21 days ago·Updated 20 days ago· 1
Auto-Split Turnaround Sheet
  • image
  • view_1
  • view_2
  • view_3
  • view_4
  • view_5
  • view_6
  • view_7
  • view_8
  • info
◄num_views4►
◄padding12►
◄bg_threshold0.040►
◄min_col_fraction0.010►
◄merge_gap8►
◄min_width20►
◄tight_verticalfalse►
◄pad_to_squarefalse►
◄margin_percent0.0►

Edit models made turnaround sheets almost free: prompt Kontext or Qwen-Image-Edit for "front, side, back views, side by side on a flat background" and you get a usable character sheet in one pass. All the views share one latent context, so the faces match.

The problem is the next step. The multiview path in every image-to-3D pipeline - TRELLIS.2, Hunyuan3D, TripoSR, TencentARC's Pixal3D - takes each view as its own image input. Pixal3D's official multiview mode still hadn't shipped as of mid-2026, so people were feeding views into hacked-together Trellis2 multiview ComfyUI graphs instead. Either way you have a sheet, the pipeline wants four separate crops, and now you're doing x/y/width/height arithmetic while your GPU idles.

That's the entire job of Auto-Split Turnaround Sheet: sheet in, one IMAGE per view out, no pixel math.

How it finds the views

It doesn't assume a grid; it measures.

First it samples the outermost pixels of the sheet (top row, bottom row, left column, right column), averages them, and calls that your background colour. Then it compares every pixel against that colour; anything further away than bg_threshold is "content". Columns where more than min_col_fraction of the pixels are content become figure columns, and the stretches of consecutive ones become blocks. Gaps narrower than merge_gap get bridged back into the same figure, and blocks narrower than min_width are thrown out as noise.

Each surviving block is cropped at its own width and padded onto a canvas filled with that detected background colour - nothing gets stretched to a uniform size, which is the point. Works with black, white or grey backgrounds, and doesn't care about resolution or how many views are on the sheet.

One mechanism detail worth knowing: detection reads only the first image of the batch, then applies those boxes to every frame - so batching is fine as long as every frame is the same sheet.

The inputs you'll actually touch

  • image - the sheet, obviously.
  • num_views - 1 to 8, default 4. Ask for the number of figures you put on the sheet.
  • padding (12px) or margin_percent (0, disabled). These fight each other: if margin_percent is above zero, padding is ignored. padding is a fixed pixel margin; margin_percent is a percentage of the view's longest side, applied on all four sides, and it scales with resolution. The tooltip's own note is that many 3D and conditioning pipelines want the subject at ~90% of the frame, so 8–10% is the number to reach for.
  • bg_threshold (0.04), min_col_fraction (0.01), merge_gap (8), min_width (20) - the "why is my sheet detecting wrong" knobs.
  • tight_vertical - crops each view to its own content height instead of the full sheet height. Nice when the sheet has big empty bands.
  • pad_to_square - centres each crop on a square canvas; CLIP-Vision-style conditioning expects square, centred inputs.

Outputs are view_1 through view_8 (all IMAGE) plus info, a STRING you should actually read: it reports the detected background colour, how many views it found versus how many you asked for, and the exact box used for each.

Install

It's about as light as a custom node gets: two Python files, no requirements.txt, no model downloads, no compiled extensions, only torch.

Search Furrey-TurnaroundSplitter in ComfyUI Manager and hit install, or do it the manual way:

cd ComfyUI/custom_nodes
git clone https://github.com/SilentLuxRay/ComfyUI-Furrey-TurnaroundSplitter
# restart ComfyUI

It's MIT-licensed and registry-shaped (the pack ships a pyproject.toml with a [tool.comfy] publisher entry), so Manager should find it.

Where people get burned

The unused view slots aren't empty. Slot 5 on a 4-view sheet returns an 8x8 black image, not nothing. Wire view_5 into a pipeline that expects real input and you get a mysterious black mesh, not an error.

More detected blocks than num_views means it keeps the widest blocks. If your sheet has a logo or a stray mark wider than one of your side profiles, it can steal a slot from a real view. Read info, and raise min_width if you see spurious detections.

The background has to be flat and it has to reach the border. The background colour is the mean of the border pixels, so a figure bleeding off the edge of the sheet poisons the sample. Full-bleed sheets and photoreal scenes with gradients are not what this is for.

Split first, remove background second. Background removal gives you a mask and disturbs the flat background the detector relies on. Split first, then feed each view_N into core BiRefNet (or RMBG) if your generator wants a clean subject.

Wide poses can split into two blocks. A gap between the body and an outstretched arm is sometimes two runs, not one; bumping merge_gap bridges it. Raise min_width too far and it quietly drops the narrower half instead.

When it misbehaves, don't guess - the info output tells you what it saw:

image 2048x768, bg_color~[1.0, 1.0, 1.0], detected 4 view(s) (asked for 4)
Categoryimage/transform

Inputs (10)

NameTypeDefaultDescription
imageIMAGE—
num_viewsINT41–8—
paddingINT120–512Fixed margin in pixels. Ignored if margin_percent > 0.
bg_thresholdFLOAT0.0400–1Per-pixel distance from the detected background color, above which a pixel counts as 'content'.
min_col_fractionFLOAT0.0100–1Minimum fraction of a column's pixels that must be 'content' for the column to count as part of a figure (filters noise).
merge_gapINT80–512Background gaps narrower than this (in px) get merged into the same figure block.
min_widthINT201–4096Minimum block width in px to be considered a real figure, not noise.
tight_verticalBOOLEANfalseCrop each view to its own tight vertical content bounds instead of the full image height.
pad_to_squareBOOLEANfalsePad each cropped view to a square canvas (centered, filled with the detected background color). Useful for pipelines (e.g. CLIPVisionEncode-based conditioning) that expect square, centered inputs.
margin_percentFLOAT0.00–50Margin as a percentage of the view's own size, added on ALL sides (including top/bottom, even outside the source sheet's own bounds) -- self-scales to any resolution, unlike a fixed pixel padding. 0 = disabled, use 'padding' instead. Many 3D/conditioning pipelines expect the subject to occupy ~90% of the frame (about 8-10% margin), not edge-to-edge.

Outputs (9)

NameTypeDescription
view_1IMAGE—
view_2IMAGE—
view_3IMAGE—
view_4IMAGE—
view_5IMAGE—
view_6IMAGE—
view_7IMAGE—
view_8IMAGE—
infoSTRING—