◎ Radiance HDR Histogram
Read your image's dynamic range in stops
- image
- histogram
- stats
A histogram that stops at 1.0 is useless for HDR work, because half your data lives above 1.0. HDRHistogram is the Radiance pack's answer: a histogram plus a stats string built for float images, reporting dynamic range in stops and telling you exactly what percentage of pixels are clipped low or high. It's the analysis node you reach for when "looks a bit blown" needs to become "14.2 stops of range, 3.1% clipped high."
The shape of the node is simple - image in, an image of the histogram and a STRING of stats out - but it's the closest thing the pack has to a technical QC tool that fits in a utility menu. Wire the histogram output to a preview and the stats output to a ShowText node, and every run tells you what the data is actually doing before you decide what to do to it.
The inputs
- image - required. Float or 8-bit; it'll tell you the truth about either.
- mode -
luminance(Rec.709 weighted luma),rgb(three channels), orlog_luminance(log-scaled, better when the range is huge).luminanceis the sensible default;log_luminanceis your friend for genuinely wide-range EXR data where linear bins all pile up at the left. - show_clipping (default true) - marks the clipped regions on the plot.
- stops_range (8–24, default 14) - the horizontal axis width in stops.
What comes out
Two outputs:
- histogram - an IMAGE rendered with PIL (no matplotlib dependency, per the source), dark-background plot at 1000×600.
- stats - a STRING with the real numbers: min/max/mean values, dynamic range in stops, and % clipped low / clipped high. The source does one clever thing here: dynamic range is computed from the minimum positive value, not the raw minimum, because negative values are legitimate in wide-gamut float data and would otherwise report a nonsense ~49 stops. If you want to know why your export is banding or blowing out, this string is where the answer is.
Where it belongs
Think of it as the before/after instrument for the pack's HDR tools. Run it on your linear input to see how many stops you actually have and how much is clipped; then after HDRExpandDynamicRange or HDRToneMap, run it again and confirm the clipping % dropped and the range is sane. It's also the honest referee for the "did I actually gain anything from float?" question - the answer is visible as a number, not a vibe.
It's not a scope for live viewing - the Radiance Viewer has the interactive waveform/parade/vectorscope for that. This is the analysis node: discrete, per-run, with a number you can compare.
Install
Part of Radiance - ComfyUI Manager → search Radiance, or:
cd ComfyUI/custom_nodes
git clone https://github.com/fxtdstudios/radiance.git
cd radiance
pip install -r requirements.txt
Restart. It sits under FXTD Studios/Radiance/Analyze.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| mode | COMBO | luminance | 3 options: luminance, rgb, log_luminance |
| show_clipping | BOOLEAN | true | — |
| stops_range | INT | 148–24 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| histogram | IMAGE | — |
| stats | STRING | — |