Frozen In Flames Deblur

Classical deblurring in your browser. No AI, no trained models, no server. Drop in any blurred photo and get the restored photo back.

Your photo stays on your device

The image never leaves your device. There is no server and no upload. This page downloads a Python engine once, then runs the exact same deblur code that ships in this project, inside your browser, on your machine. Nothing about your photo is sent anywhere, and the run report below is written by the engine itself.

First load is heavy. The engine (Pyodide, which is Python running on WebAssembly, plus the OpenCV and scikit-image libraries) is about 65 MB to download. On a slow connection that can take a minute or more. After the first load your browser caches it, and later visits start much faster.

How a run works. The blur is identified on a working copy capped at 900 pixels on its long side, because browser math is slow. The winning settings are then applied once, at full size, to your original photo. Restoration of a large photo can still take a while. The stage line under the button always shows what the engine is doing. Two settings skip the working copy and run their full analysis at full size, so they are slower still: noise (strong denoise, no deconvolution, for grain with no blur to remove; auto can also choose it when grain is what the photo actually has) and segmented (the photo is sorted into foreground and background by an edge mask, each region's blur is measured and removed separately, and the two restorations are blended at the mask edge).

Honest limits. Classical processing sharpens and clarifies what is in the image. It cannot invent real detail that heavy blur destroyed. Segmented mode handles two regions, foreground and background, at tile resolution; blur that varies smoothly or in more than two ways is only partly helped. Very flat or very noisy photos can leave the estimator little to measure, and the run report says what it found either way. Photos over 40 megapixels are refused with a message instead of being allowed to crash the tab.

Live view: clarify what the camera sees, as it happens

For camera glasses and phone cameras there is a companion page: the live clarify view. It runs a fast clarity chain on the camera feed, on your device (temporal noise reduction, contrast, a measured de-smear, sharpening that follows the zoom), with a big toggle so the raw view is always one tap away, and a capture button that freezes a frame and hands it to the full engine on this page. It is a clarify chain, not this engine; the honest split between the two speeds is written up in the project's glasses architecture note (docs/glasses.md in the repository).

1. Pick a blurred photo

Drop an image here, or tap to choose one

JPG, PNG, WebP and most other image formats the browser can open.

No file chosen yet.

Download result (PNG)
Loading the engine. This is the heavy first load.

About this page

This is the browser front end for the Frozen In Flames Deblur toolkit. The engine is the project's own Python package, copied file for file from the deblur/ folder of the repository and run under Pyodide 0.29.5 (Python 3.13 on WebAssembly), with numpy, scipy, OpenCV and scikit-image from the Pyodide package set. It is not a reimplementation in another language: the same sweep, the same scoring, the same deconvolution.

Two staging choices exist only because a browser is slow: blur estimation runs on the capped working copy described above (except the noise and segmented settings, which analyze at full size exactly as the command line does), and denoising is skipped with a note in the run report if the OpenCV build in your browser lacks it (the pinned build has it). No engine math changes.

Prefer the command line, or want to read the code? The repository is at github.com/Frozen-In-Flames/frozen-in-flames-deblur. License: Apache-2.0, Copyright 2026 Aries Hilton.