VisualToPrompt

Twenty-nine cut points decide the words in a prompt

A generated prompt is a chain of comparisons, and there are 33 of them. Thirty-two are written as separate expressions in the source; one of those expressions compares two numbers at once, which is where the extra comparison comes from. They resolve to 29 distinct cut points, and the table below turns those into 32 rows because three cuts decide two different phrases each. Set against 40 real photographs, 10 of those rows have a file within 1% of the cut, 3 have one within 0.5%, and the closest file in the whole set sits 0.053 from a cut — 0.06% — which is the 95 cut inside the mood ladder.

What these numbers are. Forty real files — 39 photographs at 640 × 360 and one code screenshot at 800 × 450 — decoded on this machine, box-downsampled to the 192 × 192 grid the live tool measures on (36,864 cells whatever the file size), and read by the same describe function the site runs. The cut values are constants in that source, quoted as written, including which of them accept equality. The flip tests in the third section are pixel edits on those same grids, re-measured by the same code. No model was called and no image was generated.

Thirty-three comparisons, twenty-nine cut points

Nine slots of a prompt are filled by nine ladders of if and else if. A ladder has one rung per band, and each rung is a comparison against a fixed number. Read the table down the left column and you have the vocabulary the tool can produce; read the middle columns and you have the exact value at which one phrase becomes another.

Three of the rows deserve a note before you read them. The monoRatio cut at 0.85 appears twice, because it decides the saturation phrase and the subject phrase separately — one comparison, two words in the output. The stdL cut at 68 and the temperature cut at −5 also appear twice each, once in their own slot and once inside the mood ladder. And the mood ladder is the only place where two numbers are needed at once: bright and uplifting requires meanL > 150 and dt > 5, which is the expression that carries two comparisons.

Every cut in describe.js against the 40 files, one row per phrase it decides. “Below” and “above” are the phrases each side of the cut produces. The count is files, not sentences. The last column is the closest file to that cut and its distance from it.
SlotComparisonBelow the cutAbove the cutFiles below / aboveNearest file (gap)
framingar ≥ 2.2widescreen 16:9ultra-wide panoramic40 / 0p101 · 1.778 (0.422)
framingar ≥ 1.7landscape 3:2widescreen 16:90 / 40p101 · 1.778 (0.078)
framingar ≥ 1.4near-square 4:3landscape 3:20 / 40p101 · 1.778 (0.378)
framingar ≥ 1.15square 1:1near-square 4:30 / 40p101 · 1.778 (0.628)
framingar ≥ 0.9portrait 3:4square 1:10 / 40p101 · 1.778 (0.878)
framingar ≥ 0.7portrait 2:3portrait 3:40 / 40p101 · 1.778 (1.078)
framingar ≥ 0.55tall vertical 9:16portrait 2:30 / 40p101 · 1.778 (1.228)
exposuremeanL > 175well-lit, balanced exposurebright, high-key lighting34 / 6p268 · 179.949 (4.949)
exposuremeanL > 130moderate, slightly dim lightingwell-lit, balanced exposure25 / 15p448 · 131.168 (1.168)
exposuremeanL > 80dark, low-key lightingmoderate, slightly dim lighting9 / 31q845 · 76.921 (3.079)
contraststdL > 68medium contrasthigh contrast33 / 7q670 · 68.351 (0.351)
contraststdL > 38soft, low contrastmedium contrast5 / 35p501 · 38.418 (0.418)
satmono > 0.85meanSat branchmonochrome, black and white36 / 4p326 · 0.778 (0.072)
satsat > 0.45moderately saturated colourvivid, saturated colour35 / 5q793 · 0.404 (0.046)
satsat > 0.22muted, desaturated tonesmoderately saturated colour18 / 22q634 · 0.215 (0.005)
tempdt > 14slightly warm tonewarm golden colour temperature28 / 12p448 · 13.898 (0.102)
tempdt > 5neutral colour temperatureslightly warm tone21 / 19p187 · 6.336 (1.336)
tempdt < −14cool blue colour temperatureslightly cool tone7 / 33p15 · −13.747 (0.253)
tempdt < −5slightly cool toneneutral colour temperature11 / 29q634 · −1.934 (3.066)
detailedge > 15moderate detail and texturehighly detailed with intricate texture18 / 22p357 · 14.958 (0.042)
detailedge > 7clean and minimal, smooth surfacesmoderate detail and texture4 / 36q845 · 6.949 (0.051)
distcb > 1.18evenly litlight falling on the centre with darker edges25 / 15q916 · 1.187 (0.007)
distbc > 1.18evenly litbrighter edges with a darker centre36 / 4q1004 · 1.174 (0.006)
verttb > 1.2nonebrighter upper half18 / 22q952 · 1.194 (0.006)
vertbt > 1.2nonebrighter lower half34 / 6p535 · 1.337 (0.137)
subjectmono > 0.85nullblack and white photograph36 / 4p326 · 0.778 (0.072)
hintgreen > 0.45other hint branchesgreen-dominant (inferred)38 / 2p15 · 0.475 (0.025)
hintblue > 0.45other hint branchesblue-dominant (inferred)33 / 7q1004 · 0.444 (0.006)
moodmeanL > 150later mood branchesbright and uplifting (with dt > 5)28 / 12q634 · 151.955 (1.955)
moodmeanL < 95later mood branchesmoody and dramatic (or stdL > 68)12 / 28p15 · 95.053 (0.053)
moodstdL > 68later mood branchesmoody and dramatic (or meanL < 95)33 / 7q670 · 68.351 (0.351)
mooddt < −5balanced, natural atmospherecalm and cool atmosphere11 / 29q634 · −1.934 (3.066)

25 of the 32 rows have files on both sides. The other 7 are all in the framing ladder, and they are not an accident of sampling: every one of the 40 files is 640 × 360, so every one of them lands in the same band. That is the fourth section.

Two slots have more bands than the rest. Exposure has 4 bands over 3 cuts, temperature has 5 bands over 4 cuts, and framing has 8 bands over 7 cuts. Everything else — contrast, saturation, detail, light distribution, vertical lighting, subject — has three bands or fewer, which is why the prompt repeats the same handful of adjectives across very different photographs.

The palette is the one part of the line that is not in this count. It is not a ladder of cuts but a clustering step: buckets of 12-bit colour are merged while the distance between them is under 52, then the five largest clusters are named, then the first four distinct names are written into the line. Those are three constants, not comparisons, so they stay out of the 29 — and the palette is the only slot whose words come from a list of colour names rather than from a band of a measured value.

Seven comparisons accept the boundary value, twenty-six do not

The framing ladder is written with >=. Every other ladder is written with a strict > or <. That single character decides what happens to a file that lands exactly on a cut, and files do land there: 640 × 360 is 1.7778, and the cut above it is 1.7.

To test it without arguing, the same photograph was given two file sizes straddling each framing cut by one thousandth, and the framing phrase was read back at both. At 2.199 the phrase is widescreen 16:9; at 2.200 it is ultra-wide panoramic. The boundary value belongs to the upper band on all seven cuts.

The same photograph at two sizes around each framing cut, measured through the same function. “Just below” is one thousandth under the cut, “at the cut” is the cut itself.
CutJust belowPhraseAt the cutPhrase
2.22199/1000 = 2.199widescreen 16:92200/1000 = 2.2ultra-wide panoramic
1.71699/1000 = 1.699landscape 3:21700/1000 = 1.7widescreen 16:9
1.41399/1000 = 1.399near-square 4:31400/1000 = 1.4landscape 3:2
1.151149/1000 = 1.149square 1:11150/1000 = 1.15near-square 4:3
0.9899/1000 = 0.899portrait 3:4900/1000 = 0.9square 1:1
0.7699/1000 = 0.699portrait 2:3700/1000 = 0.7portrait 3:4
0.55549/1000 = 0.549tall vertical 9:16550/1000 = 0.55portrait 2:3

The other ladders do the opposite. A file measuring exactly 80.000 for meanL is still dark, low-key lighting, because the test is > 80 and not >= 80; the measured flip below sits at 79.988 on one side and 80.005 on the other. The same holds at 130, at 175, at both contrast cuts, at both detail cuts, and at every ratio cut: the band you are in is the band whose comparison is strictly true.

One consequence is arithmetic rather than editorial. The pixels are 8-bit, so the smallest possible change to the temperature metric is one code value on red and one on blue, which is 2.0 in dt — larger than several of the gaps in the next table. A file 13.898 from the cut at 14 cannot be nudged by half a code value; the first step that exists takes it to 14.318.

Ten of the thirty-two rows sit within one per cent of a real photo

For each cut, the closest of the 40 files was taken and edited until its phrase changed, then the value at the moment of the change was measured. Eighteen cuts were tested this way, using one transform per metric: brightness, contrast around the mean, HSV saturation, a mix toward grey, a red-blue offset, unsharp masking, a gain on the centre square, and a gain on the top 45% of rows. 14 of the eighteen flipped within 0.005 of the cut, which is the check that the table and the code agree; the four temperature rows land between 0.019 and 0.318 past the cut, because dt moves in whole code values.

Eighteen cuts, the nearest file, and the edit that flipped it. “Value” is the measured metric before and at the flip; the transform column is the parameter that produced the flip, where 1.0 means the untouched image for a gain and 0 means untouched for an offset or a mix.
SlotFileValue at the flipTransformPhrase before → after
exposurep268179.949 → 174.997bright 0.973bright, high-key lighting → well-lit, balanced exposure
exposurep448131.168 → 129.995bright 0.991well-lit, balanced exposure → moderate, slightly dim lighting
exposureq84576.921 → 80.005bright 1.045dark, low-key lighting → moderate, slightly dim lighting
contrastq67068.351 → 67.998contrast 0.995high contrast → medium contrast
contrastp50138.418 → 37.999contrast 0.989medium contrast → soft, low contrast
satp3260.778 → 0.85mono 0.535muted, desaturated tones → monochrome, black and white
satq7930.404 → 0.45sat 1.151moderately saturated colour → vivid, saturated colour
satq6340.215 → 0.22sat 1.022muted, desaturated tones → moderately saturated colour
tempp44813.898 → 14.318temp 0.5slightly warm tone → warm golden colour temperature
tempp1876.336 → 4.864temp −0.5slightly warm tone → neutral colour temperature
tempq634−1.934 → −5.019temp −1.5neutral colour temperature → slightly cool tone
tempp15−13.747 → −14.192temp −0.5slightly cool tone → cool blue colour temperature
detailp35714.958 → 15sharp 0.011moderate detail and texture → highly detailed with intricate texture
detailq8456.949 → 7sharp 0.054clean and minimal, smooth surfaces → moderate detail and texture
distq9161.187 → 1.18centre 0.993light falling on the centre with darker edges → evenly lit
distq10041.174 → 1.18centre 0.989evenly lit → brighter edges with a darker centre
vertq9521.194 → 1.2top 1.007nothing → brighter upper half
vertp5351.337 → 1.2top 1.116brighter lower half → nothing

The sizes of those edits are the useful part. To move a dark photograph into the next exposure band takes a brightness gain of 1.045 — under five per cent. To move a borderline detail phrase takes unsharp masking at 0.011, about one per cent. To move the light distribution phrase takes a centre gain of 0.993, under one per cent. Across all 32 rows the median gap between the nearest file and its cut is 3.85%, and the ten tightest are these:

The ten cuts with a file closest to them, as a percentage of the cut value. A one per cent edit to the metric moves the file across the cut on all ten.
SlotComparisonNearest fileGapGap as % of the cut
exposuremeanL > 130p448 · 131.1681.1680.9%
contraststdL > 68q670 · 68.3510.3510.52%
tempdt > 14p448 · 13.8980.1020.73%
detailedge > 15p357 · 14.9580.0420.28%
detailedge > 7q845 · 6.9490.0510.73%
distcb > 1.18q916 · 1.1870.0070.62%
distbc > 1.18q1004 · 1.1740.0060.54%
verttb > 1.2q952 · 1.1940.0060.46%
moodmeanL < 95p15 · 95.0530.0530.06%
moodstdL > 68q670 · 68.3510.3510.52%

That is the honest version of “the tool reads your photo”. It does not read it; it compares it to 29 numbers, and on this corpus ten of those comparisons are decided by less than one per cent of the measured value. Two photographs that look the same to you can sit on opposite sides of a cut, and the prompt will say medium contrast for one and high contrast for the other.

The corpus fills one framing band out of eight

Here is what the 40 files actually produce, band by band, in order from the lowest band to the highest. A zero is not a bug: it is a band the vocabulary can say and this corpus never reaches.

Bands per slot, lowest to highest, with the number of the 40 files that land in each. The second column is how many bands of that ladder the corpus fills.
SlotBands filledFiles per band
framing1 / 8tall vertical 9:16 0 · portrait 2:3 0 · portrait 3:4 0 · square 1:1 0 · near-square 4:3 0 · landscape 3:2 0 · widescreen 16:9 40 · ultra-wide panoramic 0
exposure4 / 4dark, low-key lighting 9 · moderate, slightly dim lighting 16 · well-lit, balanced exposure 9 · bright, high-key lighting 6
contrast3 / 3soft, low contrast 5 · medium contrast 28 · high contrast 7
sat4 / 4monochrome, black and white 4 · muted, desaturated tones 14 · moderately saturated colour 17 · vivid, saturated colour 5
temp5 / 5cool blue colour temperature 7 · slightly cool tone 4 · neutral colour temperature 10 · slightly warm tone 7 · warm golden colour temperature 12
detail3 / 3clean and minimal, smooth surfaces 4 · moderate detail and texture 14 · highly detailed with intricate texture 22
dist3 / 3brighter edges with a darker centre 4 · evenly lit 21 · light falling on the centre with darker edges 15
vert3 / 3brighter lower half 6 · none 12 · brighter upper half 22
mood4 / 4calm and cool atmosphere 5 · moody and dramatic atmosphere 16 · balanced, natural atmosphere 14 · bright and uplifting atmosphere 5

Framing is the extreme case: 40 files in widescreen 16:9 and 7 bands empty. That is not because the tool cannot say square 1:1; it is because no file in the set is square. The phrase is chosen from the file's width and height before a single pixel is read, which makes it the one slot you can change without touching the image at all — and the one slot you cannot change by editing the image.

The other ladders are lopsided in a quieter way. Exposure puts 16 of 40 files in the middle band and only 6 at the top; saturation puts 17 in the middle and 4 in monochrome; detail puts 22 at the top and 4 at the bottom. Light distribution is lopsided the other way, 21 evenly lit against 4 with brighter edges, and vertical lighting is the only ladder with a band that writes nothing at all — none, 12 files — which still outnumbers its brighter lower half band at 6.

Three edits that move a phrase, and one that cannot

Brightness moves exposure. File q845 measures 76.921 and reads dark, low-key lighting. A gain of 1.045 takes it to 80.005 and the phrase becomes moderate, slightly dim lighting. Nothing else in the line changes, because exposure is the only slot reading meanL at that band.

Sharpening moves detail. File p357 measures 14.958, four hundredths under the cut, and reads moderate detail and texture. Unsharp masking at 0.011 carries it to 15 and the phrase becomes highly detailed with intricate texture. The same edit also raises stdL, so on a file near the contrast cut you can move two phrases with one slider.

A local gain moves the light-distribution phrase. File q916 measures a centre-to-border ratio of 1.187 and reads light falling on the centre with darker edges. A centre gain of 0.993 — slightly dimming the middle — brings the ratio to 1.18 and the phrase collapses to evenly lit.

Framing cannot be moved by editing pixels. All 40 files stay in widescreen 16:9 no matter what happens inside the frame, because the number that decides it is the file's width divided by its height. To change the phrase you change the canvas: the seven rows in the second table are that experiment. This is the cleanest example of the general rule — a phrase is a comparison, and you can only move a comparison by moving the number it reads.

Two limits are worth stating. The cut values are constants chosen by this tool, not laws of any image model: another tool with the same nine slots would put its bands somewhere else, and its prompt would be right in the same way. And a phrase is only as good as the number behind it — medium contrast at stdL 38.4 and at 67.9 are the same three words about two very different photographs, which is why the twelve signals behind the line are worth reading next to the words. If you want the vocabulary itself rather than the cuts, the nine slots and their 95 words is that page; if you want the cases where the measurement fails outright, the image types this handles badly counts them by type. And if what you need is the edit that follows, writing the prompt after the line is generated starts from the same numbers.