Releases: luxgrain/GALOSH
Release list
GALOSH v0.6.0 — the chroma knob means what you think it means + Linux one-command setup
The chroma knob now means what you think it means — plus Linux became a first-class citizen.
Highlights
- Hybrid chroma strength (semantics change; defaults bit-unchanged). The old knob only tuned the ridge stiffness of the Y-guided chroma regression — on content where the projection saturates it was nearly inert, and
0didn't mean "off" (an un-ridged regression, measured below noisy on Set8 s20). New: one monotone dial on every engine —0= true bypass (chroma planes pass through bit-exactly),0–1= dry/wet mix (the July variant-Q interior optimum reappears: Set8 s20 Cr, c=0.5 beats c=1 by +0.30 dB),1= canonical (byte-identical to v0.5.1),>1= the legacy ridge scaling (still real gains on heavy noise: CRVD ISO25600 +0.22 dB at c=2). Reported via GALOSH-frameserver #1. - Linux one-command setup:
./install_linux.shbuilds the CLIs, creates a private.venv, and generates./galosh-dng/./galosh-pnglaunchers;docs/QUICKSTART_LINUX.mdassumes zero Python knowledge. Verified flow on Ubuntu 24.04; output matches the Windows build to ~139 dB PSNR. - exiftool is optional now: the DNG/PNG wrappers warn and continue without it (the DNG skeleton renders on its own),
--no-exiftoolskips the metadata overlay on purpose, and raw sources beyond DNG (CR3/CR2/NEF/ARW — any Bayer LibRaw reads) are documented. Every CLI's size-mismatch error now explains the raw float32 contract.
Downloads
GALOSH_YUV_win64.zip— sRGB PNG in → denoised PNG out (drag & drop or CLI). Rebuilt: the bundled CLI carries the new chroma dial; READMEs document it.GALOSH_RAW_win64.zip— DNG in → denoised DNG out (unchanged from v0.3.0).
SHA256:
8e1f3cd09f965f50344f348cfcb65c201571b538b2776fe75a171b855bbaf76b GALOSH_YUV_win64.zip
99730d51aae71bcb5d3e08f480a03f9874b31a39c4844d788149c177ba2a2573 GALOSH_RAW_win64.zip
See CHANGELOG.md for the complete list.
GALOSH v0.5.1 — 4:2:0 adaptive chroma radius revived: sigma_C-driven + one-sided ridge
Bugfix release. The 4:2:0 noise-adaptive chroma radius introduced in v0.4.x had silently died in v0.5.0: its input readout collapsed to the estimator's read floor after the envelope switch, leaving the radius stuck at R=2 on every engine. v0.5.1 revives the adaptation by measuring chroma noise where it lives.
Highlights
- sigma_C-driven chroma radius: the 4:2:0 half-res chroma LOESS radius is now keyed to a blind Laplacian-MAD measured directly on the native half-res Cb/Cr planes (blind-vs-oracle correlation 0.984–0.992), threshold recalibrated on the original crossover material (T_C = 0.020). A/B: CRVD real noise +0.165 dB, LPIPS flat.
- One-sided MAP-ridge eps (new, default ON):
strength_eff = strength_c * clamp(sigma_C / 0.012, 1, 4)— never weaker than the shipped ridge, it only stiffens the chroma regression on noisy content (+0.055 dB / −0.001 LPIPS over 27 cells). - Exact cross-engine agreement: CPU, OpenCL and Vulkan compute sigma_C host-side with identical arithmetic, so radius/eps decisions match everywhere. Vulkan keeps its zero-mid-frame-readback design (host-decided radius via a widened push constant).
- Byte-exact escape hatch:
GALOSH_YUV420_RADIUS_SRC=lin+GALOSH_YUV420_EPS_SRC=constreproduces v0.5.0 byte-identically (verified against v0.5.0 reference builds on CPU and Vulkan). - Bench (420 GALOSH rows, AWGN / PG-core / PG-cmp / CRVD): PSNR, SSIM and LPIPS improve on essentially every track × variant; gains concentrate at high noise (CRVD ISO25600 +0.26 dB, PG-core ISO12800 +0.14 dB); low-noise cells unchanged by design. The 444 lanes and the RAW pipelines are completely untouched.
Downloads
GALOSH_YUV_win64.zip— sRGB PNG in → denoised PNG out (drag & drop or CLI). Rebuilt: the bundled CLI (bin/galosh_yuv_cpu.exe) carries the 4:2:0 fix; the PNG drag & drop path is byte-identical to v0.5.0.GALOSH_RAW_win64.zip— DNG in → denoised DNG out (unchanged from v0.3.0).
SHA256:
473879aa75f8964beec2f252ba0bed6096b8649a48507394b7aebb9e186b26c1 GALOSH_YUV_win64.zip
99730d51aae71bcb5d3e08f480a03f9874b31a39c4844d788149c177ba2a2573 GALOSH_RAW_win64.zip
See CHANGELOG.md for the complete list.
GALOSH v0.5.0 — YUV blind estimation fixed: the envelope estimator lands
The headline is a correction. The YUV pipeline's blind (α, σ²) noise fit had been a simplified global-Laplacian-MAD + synthetic α since an early rewrite — not the lower-envelope estimator the paper describes as shared with the RAW pipeline. The simplification was never recorded or validated; it shipped by mistake. v0.5.0 restores the canonical estimator across CPU, OpenCL and Vulkan, and corrects the record.
Highlights
- Canonical envelope estimator for YUV: a single-plane variant of the RAW lower-envelope fit (16×16 block stats, exact rank-n/2 Laplacian medians, 32-bin p5–p20 lower envelope, Huber-WLS ×5, dark-pixel σ² refinement), one shared switch for every YUV route. Legacy MAD stays available as
GALOSH_YUV_NOISE_EST=mad(output-identical to v0.4.0). - Validated twice: ablation (54 cells × 8 lanes) = +0.39 dB / −0.056 LPIPS vs MAD, beating even oracle variance-fit injection; full bench rerun (1,656 cells) = AWGN-420 +1.19 dB, PG +0.11–0.24 dB, CRVD +0.32/+0.36 dB, LPIPS improves on all 32 track × variant rows. CRVD-444 ISO25600 vs σ-oracle BM3D widens from +3.2 to +3.9 dB.
- Two v0.4.0 GPU bugs fixed (found by the parity work): the 420 re-encode adapter's [0,1] clip destroyed sub-black/super-white noise excursions (dark-frame blind σ collapsed 0.0266 → 0.0142 → chroma under-denoise), and the OpenCL 420 chroma lane was missing the noise-adaptive LOESS radius.
- Three-engine parity on Intel Arc A310 / RTX 4070 Ti / AMD gfx1036 (estimates bit-near ≤0.3 %; the degenerate→MAD fallback fires identically; Vulkan resolves it on-device to keep zero mid-frame readbacks). 4K fit: OpenCL −6 ms, Vulkan +6 ms; hold frames untouched — every v0.4.0 video speed number stands. RAW pipelines completely unchanged.
Downloads
GALOSH_YUV_win64.zip— sRGB PNG in → denoised PNG out (drag & drop or CLI). Rebuilt with the envelope estimator; README now documents the measured strength guidance (-l 0.7for light-to-moderate noise, default 1.0 for high-ISO).GALOSH_RAW_win64.zip— DNG in → denoised DNG out (unchanged from v0.3.0).
SHA256:
f04cea42368bb9bd633b149ab5541b1ab3d373f59eabb54ed94ea55d53c85fb3 GALOSH_YUV_win64.zip
99730d51aae71bcb5d3e08f480a03f9874b31a39c4844d788149c177ba2a2573 GALOSH_RAW_win64.zip
See CHANGELOG.md for the complete list.
GALOSH v0.4.0 — GALOSH-420: planar YCbCr containers + Vulkan YUV engine
GALOSH-420: planar YCbCr video containers + a Vulkan YUV engine with real-time 4K.
Highlights
- GALOSH-420 planar front-end on all three backends (CPU / OpenCL / Vulkan): feed 4:2:0 / 4:2:2 / 4:4:4 / 4:0:0 integer containers directly —
--pix --depth=8..16 --range=full|limited --matrix=bt601|bt709|bt2020|custom:Kr,Kb --eotf=srgb|g22|g24|bt709|hlg|pq|linear --siting=center|left|topleft— format-preserving in/out. DVD, Blu-ray, HDR10 (PQ 10-bit top-left), HLG and JPEG profiles covered. One shared header (standalone/galosh_yuv420.h) serves every backend, so flag vocabulary and chroma-siting phases cannot drift. - Design locked by experiment (SIDD 80 scenes × 3 sitings × 2 matrices): chroma is denoised at its native half-resolution lattice with a siting-phased downsampled-luma guide — beats upsample-to-444-first by +0.3–0.5 dB Cb/Cr at ~4× lower chroma cost. Siting itself does not affect denoise quality; only a guide-phase mismatch costs (−0.13/−0.19 dB), and the phase-matched guide is machine-verified by a built-in affine-field selftest (
--selftest-phase). Spec:docs/yuv420_frontend_spec.md. - New Vulkan YUV engine (
standalone/vk/galosh_yuv_vk.exe): FP16 inter-phase storage, zero mid-frame readbacks, watchdog-safe banded submissions; the heavy shrinkage / inverse-LUT shaders are shared verbatim with the raw engine. Parity 67.3 dB vs the CPU FP32 reference on NVIDIA / Arc / AMD iGPU, 95 dB cross-GPU agreement. - Video amortization ported to YUV:
--noise=hold|every:N+ state file + 32 KB LUT sidecar. A held frame skips both exact-median noise estimators and is bit-identical to a fit frame for the same model.
Measured speed (GPU time, ms (fps), fit → hold)
| GPU | Mode | 1080p | 4K | 8K |
|---|---|---|---|---|
| NVIDIA RTX 4070 Ti | 444 | 38.2 → 2.7 (376) | 50.4 → 11.0 (91) | 98.3 → 45.1 (22.2) |
| 420 | 54.4 → 2.6 (391) | 130 → 10.2 (98) | 316 → 105 (9.5) | |
| Intel Arc A310 | 444 | 139 → 34.7 (28.8) | 258 → 149 (6.7) | 754 → 625 (1.6) |
| 420 | 196 → 37.5 (26.7) | 416 → 158 (6.3) | 857 → 609 (1.6) | |
| AMD Radeon iGPU | 444 | 244 → 124 (8.1) | 593 → 499 (2.0) | 2116 → 1996 (0.5) |
| 420 | 252 → 118 (8.5) | 732 → 470 (2.1) | 2123 → 1881 (0.5) |
4:2:0 video steady state clears 4K60 with headroom on the 4070 Ti (98 fps) in the quality configuration. OpenCL (kept as the FP32 portable reference, same --pix front-end): NVIDIA 4K 444 = 79 ms — Vulkan is 1.6× faster fitting and ~7× at video steady state.
Downloads
GALOSH_YUV_win64.zip— sRGB PNG in → denoised PNG out (drag & drop or CLI). Rebuilt with the v0.4.0 engine (the bundled CLI exe also accepts the new--pixplanar container flags).GALOSH_RAW_win64.zip— DNG in → denoised DNG out (unchanged from v0.3.0).
SHA256:
e6aee6c7062b3c18e7d3d12d2f387a0a4f28d74815ca72e758eebeb5ff547e91 GALOSH_YUV_win64.zip
99730d51aae71bcb5d3e08f480a03f9874b31a39c4844d788149c177ba2a2573 GALOSH_RAW_win64.zip
See CHANGELOG.md for the complete list.
GALOSH v0.3.0 — V2 engine: Vulkan compute, video modes, cross-vendor GPU
V2 engine release: Vulkan compute port, video modes, and cross-vendor GPU support.
Highlights
- New Vulkan compute port (
standalone/vk/): the full raw pipeline as one vendor-agnostic shader set — verified on NVIDIA RTX 4070 Ti, Intel Arc A310 and an AMD Radeon iGPU at 69.7–70.6 dB vs the CPU FP32 reference, with FP16 inter-phase storage, Windows-watchdog-safe banded execution at any resolution, and a subgroup-cooperative 8×8 WHT kernel that makes the quality configuration 4–18× faster than a literal port. - Video modes:
--noise=hold|every:N|ema:Bamortizes the blind noise fit across frames (held frames bit-identical to fit frames);--wht=4/--upsample=fastspeed options with measured per-flag quality labels (standalone/README.md). - OpenCL is now cross-vendor too: FP64 eliminated (compensated FP32) so the kernels build on Intel Arc, and a silent AMD workgroup-size failure was root-caused and fixed — all three GPUs now match the CPU reference at 70.55 dB. OpenCL remains the portable reference; Vulkan is the performance path.
Measured speed (full pipeline, ms (fps))
quality = 8×8 WHT + jinc (paper configuration), fast = --wht=4 --upsample=fast. hold = video steady state; fit = fully blind on every frame.
| GPU | Res | quality hold | fast hold | quality fit | OpenCL quality fit | VK/CL |
|---|---|---|---|---|---|---|
| NVIDIA RTX 4070 Ti | 1080p | 2.81 (356) | 1.33 (752) | 4.17 (240) | 11.8 (85) | 2.8× |
| 4K | 10.9 (91.7) | 4.63 (216) | 14.9 (67.0) | 39.3 (25) | 2.6× | |
| 8K | 44.4 (22.5) | 18.7 (53.4) | 59.4 (16.8) | 150 (6.7) | 2.5× | |
| Intel Arc A310 | 1080p | 34.3 (29.2) | 12.1 (82.5) | 39.4 (25.4) | 748 (1.3) | 19× |
| 4K | 142 (7.0) | 50.3 (19.9) | 158 (6.3) | 2858 (0.3) | 18× | |
| 8K | 585 (1.7) | 214 (4.7) | 654 (1.5) | — | — | |
| AMD Radeon iGPU | 1080p | 110 (9.1) | 41.0 (24.4) | 121 (8.3) | 256 (3.9) | 2.1× |
| 4K | 446 (2.2) | 170 (5.9) | 487 (2.1) | 1029 (1.0) | 2.1× | |
| 8K | 1821 (0.5) | 716 (1.4) | 1982 (0.5) | — | — |
The quality configuration clears 4K60 on the 4070 Ti (91.7 fps hold, 67 fps fully-blind per-frame). OpenCL 8K on the two slower GPUs is not run (single kernels exceed the ~2 s Windows GPU watchdog; the banding mitigation is Vulkan-host-only). Full table with the intermediate option columns is in the README.
Downloads
GALOSH_RAW_win64.zip— DNG in → denoised DNG out (drag & drop or CLI). Rebuilt:--gpu(OpenCL) now works on NVIDIA / Intel Arc / AMD;--wht 4/--upsample fastwrapper flags included.GALOSH_YUV_win64.zip— sRGB PNG in → denoised PNG out (unchanged from v0.2.0, CPU engine).
See CHANGELOG.md for the complete list.
GALOSH v0.2.0 — Windows standalone denoisers (RAW DNG / sRGB PNG)
Standalone Windows builds of the GALOSH blind, training-free denoiser — no installation, no Python, no noise profiles. Drag & drop your files onto the exe.
日本語の使い方は各 ZIP 内の README_ja.txt にあります。
Downloads
| ZIP | Input → Output | Size |
|---|---|---|
GALOSH_RAW_win64.zip |
DNG → denoised DNG | 83 MB |
GALOSH_YUV_win64.zip |
sRGB PNG → denoised PNG | 39 MB |
Usage
- Drag & drop DNG/PNG files onto
galosh_raw.exe/galosh_yuv.exe(defaultsl=1 c=1), or:
galosh_raw.exe -l 0.8 -c 1.2 photo.dng
galosh_raw.exe --gpu photo.dng (OpenCL fast path)
galosh_yuv.exe -l 1 -c 1.2 photo.png
- Output is written next to the original as
<name>_GALOSH_l<L>_c<C>.dng/.png; the original is never modified. -l= luminance strength (lower to keep grain),-c= chrominance strength (raise if color blotches remain).
Highlights
- Fully blind: per-image Poisson–Gaussian noise fit — no noise profile, no training data, any camera.
- Any 2×2 Bayer CFA DNG (RGGB/GRBG/GBRG/BGGR); convert native raws (NEF/CR3/ARW…) to DNG first. X-Trans / monochrome / linear DNGs are rejected with a clear error.
- Metadata fully copied from the original via bundled ExifTool — EXIF, GPS, MakerNotes, XMP, ICC, and the DNG color-calibration tags (ColorMatrix1/2, dual-illuminant calibration, AsShotNeutral, lens opcodes), so raw converters render the same colors as the original. Deliberately not copied:
NoiseProfile(no longer true after denoising) andLinearizationTable(output is already linearized). - PNG: RGB / RGBA / grayscale, alpha preserved untouched; 16-bit inputs are processed at 8-bit precision (with a notice).
SHA256
c6e6192f6f46837611f5c54221d2cef84261e853528ad658fb18eca235642b30 GALOSH_RAW_win64.zip
c91bcdc72d6d5b4db34d2c3ab3bb630316d7e0f83cefe04047c51783de482b6a GALOSH_YUV_win64.zip
Links
- Paper: arXiv:2607.03768 (condensed letter under review at IEEE Signal Processing Letters)
- Interactive comparison viewer: https://luxgrain.github.io/GALOSH/
- Wrapper sources:
tools/dist/
GALOSH is Apache-2.0; bundled third-party components are listed in THIRD_PARTY_LICENSES.txt inside each ZIP.
GALOSH v0.1.0 — first public release
Blind, training-free denoising of raw Bayer and sRGB/YUV images by parallel-friendly local shrinkage.
Paper: arXiv:2607.03768 · Interactive comparison viewer · Zenodo DOI 10.5281/zenodo.21187219
- Canonical standalone implementation: CPU FP32 / CPU INT32 (Q11.20 fixed-point) / GPU FP32 (OpenCL) / GPU INT16 streaming
- Full benchmark harness: SIDD Medium + RawNIND, raw and sRGB domains, all-blind protocol
- Manuscript PDFs attached (English + Japanese translation)
Licenses: code Apache-2.0, paper CC BY 4.0. See CHANGELOG.md for details.