ComfyUI Extension: WAS Affine
Apply AFFINE noise transforms to latent space to improve image quality, especially with light loras.
Custom Nodes (0)
README
AFFINE
Adaptive Field Filtering by Intermittent Noise Enhancement
AFFINE is a comprehensive ComfyUI node suite that performs sparse Adaptive Field Filtering by Intermittent Noise Enhancement in latent space to steer diffusion results during sampling.
It works by applying controlled scale and bias (z' = scale * z + bias
) to masked regions of the latent tensor, enabling precise control over brightness, contrast, and detail enhancement without collapsing noise structure.
The suite includes:
- Core Affine Nodes - Basic latent space transformations
- Integrated Samplers - KSampler and Custom Sampling with built-in affine scheduling
- Ultimate SD Upscaler Ports - Tiled upscaling with affine enhancement
- Pattern Noise Generation - AFFINE augmented random noise for custom sampling
- Modular Options System - Granular control over all parameters (also a super options node for the adventurous)
Example
Here we use some aggressive settings to give a neutral cinematic look without hard contrast.
- Affine WAN Example
- Affine USDU 720p -> 2k Example (Nevermind the base generation, was playing with I2T2V experiment. <.<)
Things to take note of:
- The background rock quality is improved.
- The trees and brush look more naturally dispersed.
- Roads are more realistic
- The foreground detail is essentially better preserved.
- The overall contrast is reduced.
๐ง How it works (ELI5)
- Controlled enhancement: Apply scale and bias transforms to specific regions defined by procedural masks.
- Pattern-based masking: Choose from 20+ patterns including Perlin noise, spectral noise types, geometric patterns, and content-aware masks.
- Temporal consistency: Static or per-frame mask generation for stable video processing.
- External gating: Use custom mask images to limit where effects are applied.
- Modular configuration: Mix and match common options with pattern-specific parameters.
- Integrated workflows: Built-in samplers handle scheduling automatically, or use manual latent transforms between sampling passes.
The core transformation: z' = scale * z + bias
where the mask determines the blend between original and transformed values.
โจ Why AFFINE?
- Improves Quality โ Enhance detail in light LoRA outputs or tame overly contrasted/burned results from speed-boosting LoRAs.
- Works in latent space โ Avoids costly VAE decode/encode cycles and raster-space artifacts.
- Sparse control โ Apply adjustments selectively using sophisticated mask patterns.
- Stable video โ Temporal modes maintain consistency or controlled variation across frames.
- Flexible integration โ Use standalone transforms, integrated samplers, or tiled upscaling workflows.
- Advanced patterns โ 20+ mask types from simple geometric to complex spectral and content-aware patterns.
- Ultimate SD Upscaler compatibility โ Tiled processing with world-aligned noise and affine enhancement.
๐ง Workflow Options
Option 1: Manual Latent Transform (Classic)
- Run KSampler Advanced or Custom Sampling for high-noise steps
- Apply Latent Affine or Latent Affine Simple
- Resume with second sampler for low-noise steps
Option 2: Integrated Samplers
- Use KSampler Affine or KSampler Affine Advanced for automatic scheduling
- Use Custom Sampler Affine Advanced for custom sampling workflows
- Configure affine schedule, interval, and pattern parameters directly
Option 3: Tiled Upscaling
- Use Ultimate Affine KSampler - USDU nodes for large image processing
- Combines upscaling, tiling, and affine enhancement in one step
- Supports custom samplers and sigma schedules
๐ Node Reference
Core Affine Nodes
Latent Affine
The main affine transformation node with full configurability.
Inputs:
latent
โ Input latent tensorscale
โ Multiplicative factor (1.0 = no change, <1 darkens, >1 brightens)bias
โ Additive offset (-2.0 to 2.0)pattern
โ Mask pattern (20+ options including procedural, spectral, and content-aware)temporal_mode
โstatic
orper_frame
for videoseed
โ Random seed for procedural patternsexternal_mask
โ Optional IMAGE input for custom maskingoptions
โ Base options DICT (use WASLatentAffineCommonOptions)noise_options
โ Pattern-specific options DICT
Returns:
latent
โ Transformed latentmask
โ Generated mask for visualization
Latent Affine Simple
Streamlined version with auto-tuned parameters for quick results.
Inputs:
latent
โ Input latentscale
โ Multiplicative gain (0.95-0.98 for subtle darkening)noise_pattern
โ Auto-tuned mask patternseed
โ Random seedtemporal_mode
โstatic
orper_frame
frame_seed_stride
โ Seed increment per frame
Returns:
latent
โ Adjusted latentmask
โ Generated mask
Integrated Samplers
KSampler Affine / KSampler Affine Advanced
Drop-in replacements for standard KSamplers with built-in affine scheduling.
Key Parameters:
affine_interval
โ Apply affine every N stepsmax_scale
/max_bias
โ Peak transformation valuesaffine_schedule
โ WASAffineScheduleOptions DICT for timing curveaffine_seed
/affine_seed_increment
โ Seed management- All standard KSampler parameters
Custom Sampler Affine Advanced
Advanced custom sampling with affine integration.
Inputs:
noise
/guider
/sampler
/sigmas
โ Standard custom sampling inputslatent_image
โ Input latent- Affine parameters (same as KSampler variants)
Returns:
output
โ Final latentdenoised_output
โ Denoised latent
Ultimate SD Upscaler Ports
Ultimate Affine KSampler - USDU
Full upscaling with model-based upscaling and affine enhancement.
Key Features:
upscale_model
/upscale_factor
โ Upscaling configuration- Tiling parameters (
tile_width
,tile_height
,tile_padding
) - Seam fixing options
- Full affine parameter set
- World-aligned noise for consistent tiling
Ultimate Affine KSampler (No Upscale) - USDU
Tiled processing without initial upscaling.
Ultimate Affine KSampler (Custom) - USDU
Supports custom samplers and sigma schedules.
Pattern Noise Generation
Affine Pattern Noise
Generates structured noise by augmenting base ComfyUI noise with procedural patterns.
Inputs:
pattern
โ Noise pattern typeseed
โ Random seedaffine_scale
โ Pattern amplitude multipliernormalize
โ Center and scale patternaffine_bias
โ Additive biasoptions
/noise_options
โ Pattern parameters
Returns:
noise
โ Structured noise generator
๐จ Available Patterns
Spectral Noise Types
- white_noise โ Uniform frequency spectrum
- pink_noise โ 1/f frequency falloff (natural)
- brown_noise / red_noise โ 1/fยฒ falloff (warmer)
- blue_noise โ High-frequency emphasis
- violet_noise / purple_noise โ fยฒ emphasis (harsh)
- green_noise โ Mid-frequency band-pass
- black_noise โ Sparse narrowband spectrum
Geometric Patterns
- checker โ Checkerboard tiles
- bayer โ Ordered dithering matrix
- solid โ Constant alpha mask
Procedural Patterns
- perlin โ Smooth fractal noise (organic)
- worley_edges โ Cellular noise emphasizing edges
- poisson_blue_mask โ Blue-noise Poisson-disk distance field
- cross_hatch โ Oriented gratings and cross-hatch
- tile_oriented_lines โ Per-tile oriented lines
- dot_screen_jitter โ Halftone dots with jitter
- velvet_noise โ Sparse high-frequency impulses
Frequency Domain
- ring_noise โ Narrow annulus in frequency domain
- highpass_white โ High-pass filtered white noise
Content-Aware (from latent)
- detail_region โ High texture/variance areas
- smooth_region โ Low detail areas
- edges_sobel โ Sobel edge detection
- edges_laplacian โ Laplacian edge detection
External
- external_mask โ Use provided IMAGE directly
๐ง Options System
Common Options (WASLatentAffineCommonOptions)
Base parameters that apply to all patterns:
- mask_strength โ Scales mask intensity (0.0-2.0)
- threshold โ Binarize mask if > 0 (0.0-1.0)
- invert_mask โ Invert after threshold/blur
- blur_ksize / blur_sigma โ Gaussian blur for soft edges
- clamp / clamp_min / clamp_max โ Output value clamping
- frame_seed_stride โ Seed increment per frame (temporal mode)
- compute_device โ Where to generate masks (auto/cuda/cpu)
- sharpen_enable / sharpen_sigma / sharpen_amount โ Unsharp masking
Pattern-Specific Options
Each pattern type has dedicated option nodes:
WASPerlinOptions
perlin_scale
โ Base feature size (larger = smoother)perlin_octaves
โ Number of octaves (1-8)perlin_persistence
โ Amplitude falloff per octaveperlin_lacunarity
โ Frequency multiplier per octave
WASWorleyEdgesOptions
worley_points_per_kpx
โ Cell density per 1000 pixelsworley_metric
โ Distance metric (L2/L1)worley_edge_sharpness
โ Edge emphasis exponent
WASPoissonBlueOptions
poisson_radius_px
โ Minimum dot spacingpoisson_softness
โ Distance field smoothing
WASCrossHatchOptions
hatch_freq_cyc_px
โ Line frequencyhatch_angle1_deg
/hatch_angle2_deg
โ Hatch angleshatch_square
โ Square wave vs sinehatch_phase_jitter
โ Random phase variationhatch_supersample
โ Anti-aliasing factor
WASRingNoiseOptions
ring_center_frac
โ Ring center (fraction of Nyquist)ring_bandwidth_frac
โ Ring thickness
WASHighpassWhiteOptions
highpass_cutoff_frac
โ Butterworth cutoffhighpass_order
โ Filter steepness
WASTileLinesOptions
tile_line_tile_size
โ Tile dimensionstile_line_freq_cyc_px
โ Line frequency per tiletile_line_jitter
โ Orientation randomness
WASDotScreenOptions
dot_cell_size
โ Halftone cell sizedot_jitter_px
โ Dot center randomnessdot_fill_ratio
โ Coverage per cell
WASGreenNoiseOptions / WASBlackNoiseOptions / WASVelvetOptions
- Spectral and impulse noise parameters
- See node tooltips for detailed ranges
WASCheckerOptions / WASBayerOptions
checker_size
/bayer_size
โ Pattern scale
WASDetailRegionOptions / WASSmoothRegionOptions
content_window
โ Kernel size for content analysis
Affine Schedule Options (WASAffineScheduleOptions)
Controls timing and intensity curves for integrated samplers:
- start / end โ Active range (0.0-1.0 of total steps)
- bias โ Curve bias toward start/end
- exponent โ Power curve shaping
- curve โ Easing function (linear, sine, cubic, etc.)
- start_offset / end_offset โ Value adjustments
Returns: Schedule DICT + visualization plot
๐๏ธ External Mask Gating
Use external masks to limit where affine effects are applied:
- Connect a grayscale IMAGE to
external_mask
input - Set
pattern
to any procedural pattern (notexternal_mask
) - The generated pattern mask is multiplied by your external mask
- Affine transforms only apply where both masks are bright
Use Cases:
- Apply effects only to specific objects or regions
- Combine with segmentation masks for targeted enhancement
- Create complex composite effects with multiple mask layers
๐ Installation
Manual
- Clone the repository to your
ComfyUI/custom_nodes
directory:cd ComfyUI/custom_nodes git clone https://github.com/WASasquatch/was_affine.git
- Restart ComfyUI via Manager or console
Manager
- Open Manager and click "Install Custom Nodes"
- Search "WAS Affine" and click install on the custom node by author WAS.
- Restart ComfyUI via Manager's main menu.
Dependencies: Standard ComfyUI installation (torch, numpy). Ultimate SD Upscaler nodes require the UltimateSDUpscale extension.
๐งช Tips & Best Practices
General Guidelines
- Start subtle: Latent space is sensitive -
scale=0.95
can be quite strong - Model sensitivity varies: Some models respond more dramatically than others
- Flux/Krea models: May need positive scale values (inverted behavior)
- Lightning LoRAs: Combine with lower CFG (1-2) for best results
Pattern Selection
- Organic content: perlin, worley_edges work naturally
- Architectural/geometric: checker, bayer, cross_hatch
- Fine detail work: velvet_noise, highpass_white, ring_noise
- Content-aware: detail_region for textures, smooth_region for skies
๐ License
MIT โ Free to use, modify, and share with attribution.
๐ Acknowledgments
- ComfyUI team for the excellent software
- Ultimate SD Upscaler and ComfyUI wrapper developers
- Community feedback and testing contributions like "Ansel" and "Lucifer".