[](https://www.python.org/)
| Sr | Scene | Degraded | Do nothing | Global HE | AHE (unclipped) | CLAHE (clip 2) | Hist. matching | Gamma 0.6 | **Oracle** |
|---|---|---|---|---|---|---|---|---|---|
| 1 | moonlit pines · tone 25% | 15.3 dB | **15.3** | 9.4 | 8.6 | 14.3 | 9.3 | 9.7 | **22.2** |
| 2 | mare and foal · tone 76% | 14.9 dB | 14.9 | 11.1 | 9.9 | **15.4** | 11.4 | 9.7 | **26.2** |
| 3 | covered wagons · tone 84% | 16.4 dB | 16.4 | **18.8** | 11.7 | 16.5 | 17.9 | 12.2 | **23.1** |
| 4 | child on water · tone 98% | 13.0 dB | 13.0 | 15.1 | 10.9 | 15.3 | **16.9** | 9.5 | **30.4** |
Every row above is one monotonic map from input level to output level. Drawing that map says more than any metric, because the oracle's curve is the correct answer and distance from it is the error:
* Global HE and histogram matching lift the shadows roughly 50 levels too far between inputs 100 and 140, then run out of range and clip. * Gamma barely has a shape — it lifts everything and is nearly flat against the oracle's slope, which is why it scores worst of all. * AHE is visibly *non-monotonic*. Its map depends on where the pixel is, so the median curve zig-zags; two pixels of the same input brightness come out at different levels depending on their neighbours. That is the noise amplification, drawn. * CLAHE tracks the oracle closest in the shadows and gives up at the top.
---

Code and full results on GitHub (code private)
Every number is read from the file the run produced. github.com/hammasbuilds · kaggle.com/muhammadhammas13