ComfyUI Extension: ComfyUI Multi-Analysis Heatmaps

Authored by Justify87

Created

Updated

0 stars

A custom ComfyUI node for visual comparison of two images using multiple perceptual and mathematical methods. The goal: make hidden differences visible as colorful heatmaps, so you can see where an upscaler, denoiser, or diffusion model changed your image — even when your eyes can’t tell at first glance.

Custom Nodes (0)

    README

    ComfyUI Multi-Analysis Heatmaps

    A custom ComfyUI node for visual comparison of two images using multiple perceptual and mathematical methods.
    The goal: make hidden differences visible as colorful heatmaps, so you can see where an upscaler, denoiser, or diffusion model changed your image — even when your eyes can’t tell at first glance.


    ✨ Features

    Each method outputs its own heatmap (and sometimes a numeric score) so you can inspect everything side by side:

    • SSIM / DSSIM / MS-SSIM
      Structural similarity.

      • Bright = dissimilar, dark = similar.
      • DSSIM is the inverse (bright = more difference).
      • MS-SSIM averages across multiple scales (robust to small shifts).
    • LPIPS (VGG16, perceptual map)
      Estimates whether differences are visible to human perception.

      • Bright areas = regions that look different to the eye.
      • Dark = visually similar.
    • Per-Pixel Difference (Abs)
      Direct pixel math.

      • Bright = strong raw value difference, even if imperceptible.
    • Residual (Signed)
      Highlights what B has added or removed compared to A.

      • Bright = added details/noise.
      • Dark = lost details.
    • FFT / Spectrum Analysis
      Looks at frequency content (textures, fine detail).

      • Shows original spectrum, upscaled spectrum, and difference.
      • Large changes in high frequencies = sharpening or hallucinated texture.
    • ΔE2000 (Color Difference)
      Shows perceptual color shifts in Lab color space.

      • Includes total ΔE2000 heatmap and individual L* (lightness), a* (red/green), b* (blue/yellow) differences.
    • Gradient Difference (Scharr)
      Compares edge strength.

      • Bright = edge got stronger/weaker.
      • Useful to detect oversharpening.
    • Edge IoU (Canny-like)
      Compares binary edge maps of A and B.

      • Bright = edges overlap.
      • Gray = edges differ.
      • Includes IoU score as text output.
    • Wavelet Band Difference
      Multi-scale Haar wavelet decomposition.

      • Bright = changes in fine details/texture.
    • Denoiser Residual
      Highlights high-frequency noise patterns.

      • Bright = new noise/texture in B.
      • Can reveal “fake texture” added by diffusion upscalers.
    • Round-Trip Stability
      Downscale & re-upscale B, compare to itself.

      • Bright = unstable areas (info lost or artifacts added).
      • Useful to judge robustness, not just looks.

    🧑‍🎨 How to Interpret

    Think of each heatmap as a different pair of glasses:

    • Dark = good match (few differences)
    • Bright = more change (differences, artifacts, or enhancements)

    Use the right “glasses” depending on what you care about:

    • Overall similarity: SSIM / DSSIM
    • Human perception: LPIPS, MS-SSIM
    • Color shifts: ΔE2000, a*, b*
    • Sharpness / edges: Gradient Diff, Edge IoU
    • Textures / hallucinations: FFT Diff, Wavelet Diff, Denoiser Residual
    • Robustness: Round-Trip Stability

    ⚠️ Disclaimer

    This project is vibe-coded:

    • Heatmaps are heuristic visualizations.
    • Bright ≠ bad, dark ≠ good — interpretation depends on context.
    • The node does not decide quality for you.

    👉 Interpretation and responsibility are fully on the user.
    These tools are meant for exploration and intuition, not absolute ground-truth judgment.


    📸 Example

    Heatmap Example


    🛠 Installation

    1. Clone or download this repo into your ComfyUI/custom_nodes/ folder:
      git clone https://github.com/Justify87/ComfyUI-Multi-Analysis-Heatmaps
      
      

    Additionals

    • Upscaler Used in the example workflow:
    • https://github.com/daredevilstudio/AI-upscaling-models
    • https://github.com/daredevilstudio/AI-upscaling-models/releases/download/PureVision/2x_PureVision.pth
    • image compare node:
    • https://github.com/quasiblob/ComfyUI-EsesImageCompare

    ⚙️ Node Options

    Node Example

    The Multi-Analysis Heatmap Node provides several options to control how comparisons are made:

    | Option | Type | Default | Description | |--------|------|---------|-------------| | align_mode | combo | resize_b_to_a | How to align the two input images: <br>resize_b_to_a → resizes B to match A <br>center_crop_to_min → crops both to the smaller overlap <br>pad_to_max → pads smaller one with black pixels | | color_map | combo | jet | The color scheme for heatmaps: <br>jet → rainbow style (bright = more difference) <br>grayscale → black–white map | | invert_ssim | bool | true | Flip SSIM visualization so differences appear bright instead of dark. | | ms_scales | int | 3 | Number of scales for MS-SSIM. Higher = more robust but slower. | | resid_gain | float | 2.0 | Strength multiplier for the Residual Visualization. Higher = amplifies added/removed details more strongly. | | fft_log_eps | float | 1e-3 | Stabilization constant for FFT log spectrum. Adjust only if you see black/overblown spectra. | | enable_lpips | bool | false | Whether to compute the LPIPS perceptual heatmap (uses VGG16 features, slower, more VRAM). | | denoise_sigma | float | 1.0 | Standard deviation for Gaussian blur in Denoiser Residual. Controls how aggressively “noise” is extracted. | | denoise_gain | float | 2.0 | Amplification factor for the residual visualization in Denoiser Residual. | | roundtrip_scale | float | 0.5 | Downscale factor for Round-Trip Stability test. (0.5 = downscale by 2×, then upscale again). | | roundtrip_kernel | combo | bicubic | Resampling kernel for round-trip test. Options: bicubic, bilinear, lanczos. |


    👉 Tip:

    • Start with defaults.
    • Enable LPIPS only if you want human-perception-like feedback.
    • Use invert_ssim = true for easier visual spotting (bright = problem).
    • Play with resid_gain and denoise_gain if maps look too weak/too strong.