Fish Eye Effect
Doing fisheye distortion right
- images
- IMAGE
Most "fisheye" filters are just a rounded black mask and a barrel bulge. FishEyeEffect is not that. It's a proper lens model - polar-coordinate distortion with control over barrel vs pincushion, radial falloff, zoom, spherical aberration, and per-channel chromatic aberration - which means it produces the curved, organic wide-angle look you'd get from an actual lens rather than a cheap warp. If your shot needs to feel like it was captured through glass, this is one of the better lens-simulation nodes in the DJZ pack.
The inputs that matter
- distortion_strength (0–1, default 0.2) - the overall amount of distortion. The default was deliberately dropped to 0.2 because the old default was too strong; for a gentle wide-angle feel stay in the 0.05–0.15 range, and only push toward 0.4+ for a true fisheye.
- barrel_vs_pincushion (-1 to 1) - negative pulls edges inward (pincushion), positive pushes them outward (barrel). Most of what you'll want is barrel, i.e. positive.
- radial_falloff (1–4, default 2) - how quickly the distortion ramps from the center to the edges. Higher = stronger edge behavior, the signature fisheye bend.
- zoom (0.5–2) - below 1 pulls back so you see more of the scene, above 1 crops in. This is how you hide the empty corners a barrel distortion leaves behind - crank zoom up a touch and the image fills the frame again.
- spherical_aberration (-0.5 to 0.5) and chromatic_aberration (0–0.02) - the two "character" knobs. Spherical aberration bends the image subtly inward or outward beyond the main distortion; chromatic aberration separates the color channels for that telltale color fringing at the edges. Tiny values (0.003–0.005) sell realism; big values turn everything into a rainbow-edged mess, on purpose if you want.
How it works
It remaps the image through a polar-coordinate transform - each output pixel samples a nonlinearly-scaled radius from the input - using scipy's map_coordinates for high-quality sampling, and it can sample each RGB channel separately when chromatic aberration is on. The whole batch is processed in one go, so it works just as happily on a video frame sequence as on a single still. Deterministic, no seeds.
Where it fits
Reach for it in two scenarios. One: subtle wide-angle correction or a light lens character on a shot that's too flat - a touch of barrel plus a hair of chromatic aberration reads as "shot on glass." Two: full fisheye goofiness on a subject, usually combined with a vignette or film grain to sell the look. Since it's pure geometry it composes cleanly with the rest of DJZ's film effects (grain, halation, weave) - you can stack the whole vintage-lens kit.
The caveats: at strong distortion, edges get soft and stretched - that's physics, not a bug. And the node imports scipy internally, which isn't in the pack's requirements.txt; it's normally present in a ComfyUI env, but if the node won't load after install, pip install scipy is the fix.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| distortion_strength | FLOAT | 0.2000–1 | — |
| barrel_vs_pincushion | FLOAT | 0.00-1–1 | — |
| radial_falloff | FLOAT | 2.01–4 | — |
| edge_softness | FLOAT | 0.100–1 | — |
| zoom | FLOAT | 1.000.5–2 | — |
| spherical_aberration | FLOAT | 0.00-0.5–0.5 | — |
| chromatic_aberration | FLOAT | 0.0000–0.02 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |