Which Images Does an Image to Prompt Tool Handle Badly?
Three kinds. All three fail for one reason: the tool measures the frame, never the subject.
A small subject in a big frame. The palette is a pixel count, so it names whatever covers the most cells. In the night fireworks sample the sky takes 27,433 of 36,864 grid cells (74.4%) and the top four colours cover 94.90% of the frame. Everything at luminance 100 or above — the fireworks — is 12.99%. The prompt describes the sky.
A frame split between blown highlights and crushed blacks. One average is taken over the whole image. The backlit meadow has 13.38% of cells at luminance 200 or above and 13.56% at 5 or below, in the same frame. The average lands at meanL 73.95, which sits under the 80 threshold, so the output says dark, low-key lighting about a picture with the sun in it. It misses the flip by 6.05 — 874 cells out of 36,864.
An image whose meaning is carried by detail rather than by colour. The code screenshot scores an edge density of 5.14 against a threshold of 7, so it is written up as clean and minimal, smooth surfaces. 91.67% of its cells sit inside one 40-point luminance band. And the fourth colour in its “dominant palette” is grey, which is 5 cells out of 36,864.
Why all three fail the same way: there is no subject detection. Across the whole library, d.subject is assigned exactly once, in src/describe.js, and the value is 'black and white photograph'. For these three images it is null. The scene hint is computed too — blue-dominant (inferred), no dominant hue (measured) — and then dropped: of the 36 prompts these three images generate, 0 contain the hint and 0 contain a subject.
Every number below comes from running the library behind this tool over the three sample images the site uses, on the 192 × 192 grid the live tool measures on. The measurement is arithmetic over pixels — no model, no network, no classification — which is exactly why it fails the way it does.
The three samples, measured
| Sample | meanL | stdL | edge | top–bottom L | ≥200 | ≤5 | What it is |
|---|---|---|---|---|---|---|---|
| night-fireworks | 34.51 | 46.93 | 22.50 | 43.23 / 25.50 | 0.51% | 6.26% | night sky with fireworks |
| strong-backlight | 73.95 | 80.36 | 13.02 | 135.77 / 19.39 | 13.38% | 13.56% | backlit meadow, sun in frame |
| text-screenshot | 35.95 | 13.68 | 5.14 | 35.98 / 34.30 | 0.00% | 0.00% | code editor screenshot |
Three completely different pictures. Here is what the tool wrote for all three, in the same format:
night-fireworks widescreen 16:9 composition, dark, low-key lighting, dominant palette
of navy, grey, slate, silver, vivid, saturated colour, cool blue
colour temperature, medium contrast, highly detailed with intricate
texture, light falling on the centre with darker edges --ar 16:9
strong-backlight widescreen 16:9 composition, dark, low-key lighting, dominant palette
of black, charcoal, silver, white, vivid, saturated colour, slightly
warm tone, high contrast, moderate detail and texture, brighter edges
with a darker centre --ar 16:9
text-screenshot widescreen 16:9 composition, dark, low-key lighting, dominant palette
of charcoal, forest green, slate, grey, moderately saturated colour,
slightly cool tone, soft, low contrast, clean and minimal, smooth
surfaces, evenly lit --ar 16:9
1. A small subject in a big frame
Colour is reported by counting. Each pixel is dropped into a 12-bit bucket, buckets within a distance of 52 are merged, and the top five are named from a list of 35 names. Nothing in that process knows which pixels are the subject.
So the ranking is a ranking by area:
| Sample | Named colour | Grid cells (of 36,864) | Share |
|---|---|---|---|
| night-fireworks | navy | 27,433 | 74.42% |
| night-fireworks | grey | 3,195 | 8.67% |
| night-fireworks | slate | 3,076 | 8.34% |
| night-fireworks | silver | 1,279 | 3.47% |
| text-screenshot | charcoal | 33,896 | 91.95% |
| text-screenshot | forest green | 2,563 | 6.95% |
| text-screenshot | slate | 400 | 1.09% |
| text-screenshot | grey | 5 | 0.01% |
The night frame is 68.60% below luminance 20. The fireworks occupy the top end: 8.65% of cells between 100 and 150, 3.83% between 150 and 200, 0.51% above 200. Put together that is 12.99%, and none of it is identifiable as a subject, because nothing in the pipeline has a slot for “the bright thing”. What you get instead is a colour list headed by the sky and the phrase highly detailed with intricate texture, produced by an edge density of 22.50 — a number the firework streaks and the noise in the dark sky both feed.
The practical test is area. If what you care about covers less than roughly a quarter of the frame, expect the palette line to name the background, and plan to rewrite that line by hand.
2. Blown highlights and crushed blacks in one frame
Exposure is one number: the mean luminance over all 36,864 cells, compared against 175, 130 and 80. The backlit meadow returns 73.95, so it falls into the last branch and comes out as dark, low-key lighting.
That verdict is 6.05 away from being moderate, slightly dim lighting. In grid terms: 874 cells out of 36,864 — 2.37% — would have to go from black to white to move it. Which is another way of saying the number is real and the word is wrong, because the frame is not dim, it is divided:
- 13.38% of cells at luminance 200 or above, and 929 of them fully clipped at 250 or above.
- 13.56% of cells at 5 or below — 5,000 cells crushed to black.
- Top half of the frame means 135.77; bottom half means 19.39. A ratio of 7.00, against a 1.20 threshold for reporting it.
More than a quarter of the frame sits at the two extremes, and the tool reports the middle. It does catch the split, partly — brighter edges with a darker centre comes from centreL 54.14 against borderL 77.75, and brighter upper half from the 7.00 ratio — but those two phrases sit in the middle of the list while dark, low-key lighting sits near the front, and the generator reads the whole list.
Any image with the sun, a window, a stage light or a headlight inside the frame is a candidate for this. So is any image that is mostly shadow around one bright object.
3. Meaning carried by detail, not colour
Detail is a mean gradient magnitude over the interior of the grid. Above 15 it says highly detailed with intricate texture; above 7, moderate detail and texture; below that, clean and minimal, smooth surfaces. The code screenshot returns 5.14 — 73.4% of the threshold — and is therefore described as smooth and minimal.
The image is a dense code editor. Three measured facts say so, and none of them is legible to this pipeline:
- 91.67% of cells sit between luminance 20 and 60 — the dark editor background. Standard deviation is 13.68, giving soft, low contrast.
- Only 0.71% of cells are above 100. That is the text, and it is 0.71% of the frame.
- There is no text recognition anywhere in the library. Searching every source file, tool, data file and doc for OCR, glyph or character handling returns zero hits.
So the failure here is not a wrong threshold. It is a category error: the information in the image is not the kind this tool measures. A screenshot, a diagram, a page of text, a UI mockup — nothing about them survives a colour histogram and a gradient mean. Type the prompt instead.
Worth knowing where the same threshold bites in the other direction. An image does not have to be genuinely detailed to pass 7; it only has to have enough local contrast. And because the measurement happens after the frame is reduced to 192 × 192, fine one-pixel structure is averaged before it is ever counted.
Why all three fail the same way
The description is nine slots, and each slot is a plain number comparison in src/describe.js. Counting the branches: framing 8, exposure 4, saturation 4, colour temperature 5, contrast 3, detail 3, light distribution 3, vertical balance 3, mood 4. Nine slots with those sizes give at most 207,360 distinct phrase combinations before you even reach the 35 colour names.
Which is why three unrelated pictures can share a spine. Comparing the nine slots across the three samples:
| Pair | Identical slots | Which |
|---|---|---|
| night-fireworks / strong-backlight | 5 of 9 | framing, exposure, saturation, vertical balance, mood |
| night-fireworks / text-screenshot | 3 of 9 | framing, exposure, mood |
| strong-backlight / text-screenshot | 3 of 9 | framing, exposure, mood |
The two missing pieces are deliberate, and both are visible in the source. d.subject is set in exactly one branch of describe.js, when monoRatio is above 0.85, and the string it sets is 'black and white photograph'. It is the only noun the tool will ever produce about your image. The scene hint is the other: it is computed on every run — green-dominant above a green ratio of 0.45, blue-dominant above a blue ratio of 0.45, “no dominant hue” otherwise — and compose.js never reads it. Running all four target formats at all three lengths over the three samples gives 36 prompts; the hint appears in none of them.
This is what the measured share of the output looks like: of the Flux long prompt, 219 of 273 characters come from measured phrases for the fireworks, 193 of 247 for the meadow, 184 of 238 for the screenshot. Around four fifths of the string is genuinely read off your image. The failure is not that the tool invents things — it is that the things it can read are not the things you meant.
How to tell before you paste
- Estimate the subject’s share of the frame. Under roughly a quarter and the palette names the background. Check the share printed next to each colour: if the first one is above 70%, you are looking at a backdrop.
- Look for both extremes at once. Blown highlights and crushed shadows in the same frame mean the single average will describe neither half. If the reported exposure contradicts what you see, delete that phrase and write it yourself.
- Ask whether colour and gradient carry your image. Screenshots, diagrams, text and UI are not measurable this way. There is nothing to fix in the output — write the prompt.
- Add the hint yourself. It is computed and discarded. If your frame really is blue- or green-dominant, one word in the palette line does more than any edit to the rest of the list.
The palette line is easy to swap because it is one contiguous phrase: compose.js splices it into the list at position three, and the same four names appear in the same order in all four target formats. Replace it with the colour of your subject, chosen from the same 35 names, and the most area-biased part of the prompt is gone.
Three samples make an argument; forty files make a rate. Sorted into four kinds of picture by the cut points the library already applies, 68.2% of a monochrome line turns out to be the same for every monochrome file — and that share is the part of your prompt this tool would have produced for any other picture of the same kind.
For what the thirteen measured fields are and how each one becomes a phrase, see what an image to prompt tool measures. For the order to work in when the output is wrong, see fixing a wrong image to prompt output, and for turning a picture into something you can paste into a generator, see getting a usable AI image prompt from any picture.