About this tool
A photo has millions of colours; a monochrome OLED has two. Squeezing one into the other is a real image processing problem, and no single method wins for every picture. This converter therefore tries dozens of methods at once - simple thresholds, adaptive thresholds and dithering - scores each result, and shows you the best ones side by side so you can pick with your own eyes.
Your image is processed inside your browser and is not uploaded. Open the sections below to see how to use it and what each method actually does.
Before any black-and-white decision, the image is turned into shades of grey and cleaned up:
| Control | What it does | Reach for it when |
|---|---|---|
| Brightness | Adds or removes the same amount of light everywhere | The whole picture is too dark or too light |
| Contrast | Pushes greys away from the middle, towards black or white | The subject is washed out and hard to separate from the background |
| Gamma | Brightens or darkens the mid-greys while keeping pure black and white fixed | Faces or shadows lose detail but the highlights are fine |
| CLAHE | Evens out contrast region by region instead of across the whole image | One part of the photo is in shadow and another in bright light |
| Median kernel | Replaces each pixel with the middle value of its neighbours, removing speckles | A noisy or low-light photo produces scattered dots |
| Unsharp mask | Exaggerates edges by subtracting a blurred copy | Outlines come out soft or broken |
CLAHE stands for contrast-limited adaptive histogram equalisation. The image is split into tiles, each tile's contrast is stretched on its own, and the clip value limits how far, so flat areas do not turn into noise.
A threshold compares every grey pixel with a cut-off value: brighter becomes on, darker becomes off. Grey values run from 0 (black) to 255 (white). The converter tries several ways of choosing that cut-off:
Each of these can also be cleaned with a morphological open (removes isolated specks) or close (fills small gaps), and those versions are scored too.
A threshold throws away every shade of grey. Dithering keeps the impression of grey by varying how many pixels are lit in an area, just as a newspaper prints photos with dots. It suits photos and gradients; it does not suit small text, which it makes fuzzy.
The image is processed pixel by pixel. Each pixel is set to black or white, and the difference between the grey it wanted and what it got - the error - is passed on to neighbours not yet processed.
Instead of spreading error, each pixel is compared with a value from a small repeating grid of thresholds, the Bayer matrix. A 2×2 grid gives 4 levels of grey, 4×4 gives 16, and 8×8 gives 64. The result is a regular cross-hatch texture. Because each pixel's decision depends only on its own grey value and position, a small change in the picture changes only a few pixels - so ordered dithering tends to flicker less than error diffusion in animations.
Every variant gets a score between 0 and 1, built from four measurements:
| Measure | Weight | What it rewards |
|---|---|---|
| Coverage | 0.34 | A share of lit pixels close to the Target Coverage slider |
| Edges | 0.32 | Outlines that line up with the edges in the grey image |
| Speckle | 0.18 | Few tiny isolated blobs of pixels |
| Continuity | 0.16 | Shapes of a sensible size, rather than dust or one huge block |
The weights add up to 1. The score is a guide, not a verdict: it cannot know that you care more about a face than the background. Look at the top few and trust your eyes, and if everything looks too dark or too light, move the Target Coverage slider and generate again.
| Your picture | Try first |
|---|---|
| Logo or icon with flat colours | Fixed threshold or Otsu, then tidy in the editor |
| Photo of a person or scene | Floyd-Steinberg or Atkinson |
| Photographed page or sign with text | Adaptive Gaussian or Sauvola |
| Frames for an animation | Bayer 4×4 or a threshold, to avoid flicker |
Crop tightly before converting. At 128 × 64 there is no room for background, so the subject should fill the frame.
Next steps: tidy the result in the Pixel Editor, or turn a clip into frames with Video to Animation.