The two dims stopped stacking, and centre court's crowd is graded off a lifted target

Oliver: "it is too dim to see anything on the centre court and the dark court."
Both were the same mistake — standBack was ADDED to a court's own dim instead of
being the default it falls back to. Centre court's crowd sheet is a night-lit
navy that is dark to begin with, and the night court dims the hard-court sheet
on top of that, so the pair of them went to mud.

standDim is now court.dim ?? TUNE.standBack, plus the rot. Centre court carries
a 0.06 of its own, the night court comes down 0.62 -> 0.5 (it no longer has the
base added to it), and clay and hard keep the 0.22 that was approved.

Centre court's sheet is also graded off a LIFTED target now — the old crowd it
matches sat at a mean luminance of 39 against clay's 96, dark enough to throw
the new roll's detail away before any dim ran. A 0.72 gamma on the target brings
the sheet to 60 and the faces come back.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Opus 5 committed 2026-08-21 14:12:07 +02:00
1 parent 0250e9bd20
commit eab0a4e837
5 files changed
+29 -15

No files matched your search

+11 -3
View File
@@ -55,7 +55,12 @@ PAL = 128 # colours a sheet is quantised to on save
# HEAD, so re-running the tool after installing its own output cannot drift the palettes.
GRADE_REF = '76ea1d0'
COURTS = [('x_crowd', 'x_crowd2'), ('x_crowd_c', 'x_crowd_c2'), ('x_crowd_h', 'x_crowd_h2')]
# sheet -> how much its grade TARGET is lifted before the histogram match (a gamma; 1.0 is the old
# sheet as it was). Centre court's old crowd sat at a mean luminance of 39 against clay's 96 — dark
# enough that the detail in the new roll was being thrown away, and then dimmed on top of that:
# Oliver, "it is too dim to see anything on the centre court and the dark court". The night court
# borrows the hard-court sheet and does its own dimming in `COURTS.dim`, so it is fixed there.
COURTS = [('x_crowd', 0.72), ('x_crowd_c', 1.0), ('x_crowd_h', 1.0)]
MIN_AREA, MAX_AREA = 150, 3000 # an arm blob: one pair of raised arms, or one arm
ARM_H, ARM_W = (10, 70), (8, 90) # ...and its shape, in px of the 1408x768 sheet
@@ -199,8 +204,11 @@ def main(review):
print(f'{len(rows)} spectators can move, {both} of them with both poses (a real clap)')
stack = np.concatenate(frames, 0)
for a_name, _ in COURTS:
lut = grade(A, old_sheet(a_name)) # the LOOK is judged on the seated frame...
for a_name, lift in COURTS:
ref = old_sheet(a_name)
if lift != 1.0:
ref = (255 * (ref / 255.0) ** lift).astype(np.uint8)
lut = grade(A, ref) # the LOOK is judged on the seated frame...
pa = os.path.join(REFCHECK if review else HERE, a_name + ('_new.png' if review else '.png'))
# ...and applied to the whole stack at once, so the frames cannot drift apart in colour
Image.fromarray(lut(stack)).quantize(colors=PAL, method=Image.MEDIANCUT).save(pa, optimize=True)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB