How much of your picture survives an image to prompt line?
Less than you would think, and the loss is not spread evenly. An image to prompt tool on this site measures your file on a 192 × 192 grid — 36,864 cells — reduces that to nine numbers, and turns those numbers into words. Each of those three steps throws something away, and the fourth loss is hidden inside the words themselves:
- Cut one, the grid. Every cell averages a small block of your pixels. Rearranging the pixels inside every one of those blocks changes a typical file by 5.85 luminance levels per pixel and leaves the grid — and all twelve output lines — byte-identical, on 40 of 40 files.
- Cut two, the numbers. Swap pixels around inside the six regions the measurement reads and eight of the nine numbers do not move at all (drift of exactly 0 on all forty files). Only the edge number moves. On 22 of 40 files you can scramble the whole grid — an average change of 50.00 levels, which is 114.5% of the picture’s own spread — and every one of the twelve lines still comes out byte-identical.
- Cut three, the words. A word is a bucket, not a reading. If you take the middle of the bucket as your best guess at the number behind it, you are off by a median of 11.41 levels on brightness — and the typical gap between two of these forty pictures is only 46.59.
- Cut four, the colours. The line gives you up to four colour names and their shares, but never where they are. Placed as well as they can be placed, they leave a per-pixel error of 17.61. Placed by share alone, which is all the line actually allows, the error is 55.17 — worse than painting the whole picture one average colour, at 43.66.
What these numbers are. Forty real files — 39 photographs at 640 × 360 and one code screenshot at 800 × 450 — were decoded on this machine, box-downsampled to 192 × 192 (the grid the live tool measures on), and composed into four output shapes at three lengths: 480 lines, twelve per file. Every number below comes from re-running that pipeline on those forty files, or from the six source files that produce it. No model was called and no image was generated. The measurements live in prep/day29-loss.json and prep/day29-b.json in this workspace.
The first cut: 36,864 cells, and everything finer than a cell
The first thing that happens to your file is a resize. The tool does not read your pixels; it reads 36,864 of its own cells, and each cell is the average of a small block of yours. For a 640 × 360 file that block is 3 × 2, 4 × 2, 3 × 1 or 4 × 1 pixels depending on where the cell falls — 6.25 of your pixels per cell on average.
That averaging is the first irreversible step, and you can measure exactly how much it costs. Take every block and shuffle the pixels inside it. Each block still has the same pixels, so each cell average is unchanged, so the grid is unchanged byte for byte, so nothing downstream can tell. What changed is your file.
| Source size | Cell footprints (pixels × cells) | Your pixels per cell | Change to your file (MAE) | As a share of the file’s own spread |
|---|---|---|---|---|
| 640 × 360 (39 files) | 3×2 × 21,504 4×2 × 10,752 3×1 × 3,072 4×1 × 1,536 | 6.25 | 5.85 median (0.79 – 28.43) | 13.2% |
| 800 × 450 (1 file) | 4×2 × 20,160 4×3 × 10,560 5×2 × 4,032 5×3 × 2,112 | 9.77 | 2.47 | 29.6% |
Read the last column rather than the one before it. A change of 5.85 levels sounds small until you set it against how much the picture itself varies: it is 13.2% of the file’s own average deviation from its mean brightness, and on the file where it bites hardest, 54.7%. That is detail at the scale of two or three pixels — texture, thin edges, the small stuff — and it is gone before a single number is computed.
The second cut: eight numbers that never move, and one that does
Inside the grid, the measurement reads nine things: mean brightness, spread of brightness, saturation, monochrome ratio, red-minus-blue, edge density, centre against border, top against bottom, and the shape of the frame. Eight of the nine are properties of the multiset of pixels. Move pixels around and they cannot tell.
So: shuffle the grid, but only within the six regions the measurement actually distinguishes — centre or border, crossed with upper, middle or lower. Every pixel stays inside its region, so the region averages hold. Then walk it: swap two randomly chosen pixels in the same region, keep the swap only if the line still comes out the same, and stop the moment a block of swaps changes any of the twelve lines. What you get is how far a picture can travel before the words notice.
| What the line already calls it | Files | Swaps accepted / rejected (median) | Grid change before any line moved (MAE) | As a share of the grid’s spread | Edge number, before → after |
|---|---|---|---|---|---|
| “clean and minimal, smooth surfaces” (edge at or below 7) | 4 | 567 / 407 | 0.51 (0.02 – 1.01) | 1.8% | 5.70 → 7.00 |
| “moderate detail and texture” (edge 7 to 15) | 14 | 1,050 / 604 | 1.70 (0.09 – 2.43) | 2.8% | 10.90 → 15.00 |
| “highly detailed with intricate texture” (edge above 15) | 22 | 119,966 / 0 | 12.01 (8.59 – 19.03) | 29.3% | 25.11 → 47.94 |
| Whole grid scrambled at once — the 22 files whose lines still came out identical | 22 | — | 50.00 (28.92 – 73.60) | 114.5% | 25.11 → 80.02 |
| Whole grid scrambled at once — the 18 files that were caught | 18 | — | — | — | 10.66 → 52.02 |
The pattern is entirely explained by one number. The edge reading is the only one of the nine that depends on pixels being next to each other — it is a mean gradient, so scattering pixels raises it. On the four files the line already calls smooth, the walk pushes edge from 5.70 up to exactly 7.00, the threshold, and the next block of swaps is caught. On the fourteen moderate files it climbs to the next threshold — a median of 15.00, with two of the fourteen stopping just short at 14.88 and 14.40. On the twenty-two files already labelled highly detailed, there is no ceiling to hit: 119,966 of 119,966 swaps were accepted, the walk ran out of attempts at 120,000 rather than being stopped, and the edge number more than doubled from 25.11 to 47.94 without a single word changing.
Here is one of those files, before and after a complete scramble of the grid. Eight numbers, printed to the precision the measurement carries, do not move at all:
q634.png, 640 x 360, measured on the 192 x 192 grid
original grid fully scrambled
meanL 151.96 151.96
stdL 89.04 89.04
edge 11.01 46.22 (the only one that moves)
meanSat 0.2150 0.2150
monoRatio 0.3894 0.3894
R - B -1.93 -1.93
centre / border 0.9120 0.9120
top / bottom 3.7849 3.7849
And here is what the twelve lines did with it. The four short lines, which never carry a detail clause, came out byte-identical. The eight longer lines differ by exactly two words:
original ... high contrast, moderate detail and texture, evenly lit, brighter upper half ... scrambled ... high contrast, highly detailed with intricate texture, evenly lit, brighter upper half ...
That is the whole of what the pipeline noticed about a picture whose every pixel moved: one clause, out of a line that also claims to know the frame, the exposure, the palette, the temperature, the contrast and where the light falls. For the twenty-two files already past the edge threshold, even that clause stays put. For the word-by-word accounting of what that finished line is actually made of — six template words and twenty-three measured ones on the median line — see what an image prompt generator puts in the line.
The third cut: the word is a bucket, not a reading
Suppose you take the opposite trip: you have the line and you want the measurement behind it. You cannot have it, because the word stands for a range. Take the middle of that range as your best guess — for a range with one open end, take the boundary plus half the width of the range next to it — and see how far off you land across the forty files.
| Measurement behind the clause | Guess error, median (min – max) | Typical gap between two pictures | Guess error as a share of that gap |
|---|---|---|---|
| Brightness (exposure) | 11.41 (0.04 – 23.57) | 46.59 | 24.5% |
| Contrast (spread of luminance) | 6.15 (0.23 – 14.65) | 15.59 | 39.4% |
| Detail (edge density) | 2.75 (0.01 – 46.84) | 9.85 | 27.9% |
| Saturation | 0.067 (0.005 – 0.404) | 0.157 | 42.8% |
| Colour temperature (R − B) | 3.43 (0 – 149.46) | 22.65 | 15.1% |
| Centre against border | 0.097 (0.003 – 0.756) | 0.296 | 32.8% |
| Top against bottom | 0.182 (0.003 – 5.687) | 0.673 | 27.1% |
The fourth column is the one that matters. On saturation, your best guess is off by 42.8% of the distance that typically separates one picture from another; on contrast, 39.4%; on centre against border, 32.8%. Read from the other end: the slice of a measurement that one word covers is a substantial fraction of the difference between two whole pictures.
The large maxima in that table are not errors in the measurement. They are the open-ended buckets: an image far past the top threshold is still described by the same word as one just past it, so a guess built from the word can be 149.46 units of colour temperature away, or 46.84 of edge. The words are honest about the range they stand for — they simply never promised a value.
Reading a line back into the photograph it came from is the same question from the other end: what a generated line brings back when you try to recover the picture from it takes these forty files the other way round, reading each line back into the eight numbers and asking how close that gets you.
The fourth cut: four colour names and no map
The palette clause is the part of the line that sounds most like it describes your picture: up to four named colours, in the order the clustering found them. What it does not carry is any statement about where those colours are. The measurement threw that away at the clustering step, which counts colours in 12-bit buckets and reports shares, never positions.
To price that, reconstruct the grid from each candidate set of information and measure the per-pixel colour error against the real thing. “Placed as well as they can be placed” means every pixel is given the nearest colour from the set — an upper bound, since it uses positions the tool did not keep. “Placed by share alone” means what the line actually entitles you to: you know the colours and their proportions, and nothing else.
| What you are given | Colour error per pixel |
|---|---|
| The five measured clusters, placed where they best fit | 11.55 |
| All 35 named colours, placed where they best fit | 13.77 |
| The 3–4 names in the line, placed where they best fit | 17.61 |
| One average colour for the whole picture | 43.66 |
| The five measured clusters, placed by share alone | 55.02 |
| The names in the line, placed by share alone | 55.17 |
The last two rows are the point of the section. Given the colours but not the map, you do worse — 55.17 against 43.66 — than if you had never been told the colours and had painted the whole frame a single average colour. Knowing the palette without the positions is not half the information; on this measure it is less than none of it, because guessing where each colour goes adds error on top of the error the coarse colours already have. Across the forty files the gap between best-placed and share-only placement is a median of 35.25 levels, and on the file where it bites hardest, 78.77.
The first two rows show where the rest of the colour went. Naming costs something — 11.55 for the measured clusters against 13.77 for the fixed table of 35 names — but cutting the list down to the four names that make the line costs more: 17.61. Naming is not the expensive part. Dropping everything but the top four is.
What is left after four cuts: nine sentences about place
After the grid, the numbers, the buckets and the palette, here is the complete set of things the line can say about where anything is. The distribution clause has three states — evenly lit, light falling on the centre with darker edges, brighter edges with a darker centre — and the vertical clause has three: nothing, brighter upper half, brighter lower half. Three times three is nine sentences, and that is the entire spatial vocabulary in src/describe.js.
Across the forty files, eight of those nine appear. Across all 480 generated lines, 104 — 21.7% — say anything at all about where the light is: light falling on the centre with darker edges in 60 lines, brighter upper half in 44, brighter edges with a darker centre in 16, brighter lower half in 12. The other 376 lines contain no statement about place at all. Nor is there any clause that could say where a colour is: of everything src/describe.js can emit, the distribution clause and the vertical clause are the only two that mention position, and both are statements about brightness.
So the honest summary of an image to prompt line is not “it describes your picture”. It is: 36,864 cells, nine numbers, a closed table of words, and nine possible sentences about place — with a measurable band at every step inside which your picture can move freely and the line will not budge. That band is not a bug in this tool; it is what any pipeline of this shape costs. What it does buy is a line you can check: every word in it traces back to a number you can measure yourself, and every number traces back to a threshold you can argue with. For the nine numbers and where each threshold sits, see what this tool measures; for the four shapes those numbers get written into, see what a Midjourney line looks like when it comes out of a photograph; and for what the finished line is made of before you start editing it, see what a picture prompt is.