composite: add unsharp mask after Lanczos resize to restore crater crispness
Lanczos downsampling (NASA 2048 px → 756 px output) anti-aliases fine crater rims and mare boundaries to a blur of ~1-2 px. Apply Pillow's UnsharpMask(radius=2, percent=160, threshold=2) immediately after resize in both composite_full_moon and render_phase_closeup. This restores the perceived sharpness to match what the NASA source actually contains, and brings crater detail in line with what a 52x optical zoom camera shows on a clear night from the same location. No AI or upscaling involved. https://claude.ai/code/session_01HuJ83KvMvshiY6HxJbtMsc
This commit is contained in:
+6
-3
@@ -250,6 +250,9 @@ def composite_full_moon(
|
|||||||
target_size = int(round(output_size[1] * moon_height_pct))
|
target_size = int(round(output_size[1] * moon_height_pct))
|
||||||
target_size += target_size % 2 # even
|
target_size += target_size % 2 # even
|
||||||
ref_resized = ref.resize((target_size, target_size), LANCZOS)
|
ref_resized = ref.resize((target_size, target_size), LANCZOS)
|
||||||
|
ref_resized = ref_resized.filter(
|
||||||
|
ImageFilter.UnsharpMask(radius=2, percent=160, threshold=2)
|
||||||
|
)
|
||||||
|
|
||||||
# ── Phase shadow (skip when essentially full) ──
|
# ── Phase shadow (skip when essentially full) ──
|
||||||
illum = moon_phase.illumination(when_utc)
|
illum = moon_phase.illumination(when_utc)
|
||||||
@@ -260,9 +263,6 @@ def composite_full_moon(
|
|||||||
|
|
||||||
# ── Parallactic-angle rotation ──
|
# ── Parallactic-angle rotation ──
|
||||||
par = moon_phase.parallactic_angle(when_utc)
|
par = moon_phase.parallactic_angle(when_utc)
|
||||||
# PIL rotates counter-clockwise for positive angles; we want celestial
|
|
||||||
# north to end up "up" in the camera image. Negate so the rotation
|
|
||||||
# direction matches image-space y-down convention.
|
|
||||||
ref_rot = ref_resized.rotate(-par, resample=BICUBIC, expand=False)
|
ref_rot = ref_resized.rotate(-par, resample=BICUBIC, expand=False)
|
||||||
|
|
||||||
# ── Composite with feathered circular mask ──
|
# ── Composite with feathered circular mask ──
|
||||||
@@ -311,6 +311,9 @@ def render_phase_closeup(
|
|||||||
target = int(round(output_size[1] * moon_height_pct))
|
target = int(round(output_size[1] * moon_height_pct))
|
||||||
target += target % 2
|
target += target % 2
|
||||||
moon_resized = moon.resize((target, target), LANCZOS)
|
moon_resized = moon.resize((target, target), LANCZOS)
|
||||||
|
moon_resized = moon_resized.filter(
|
||||||
|
ImageFilter.UnsharpMask(radius=2, percent=160, threshold=2)
|
||||||
|
)
|
||||||
|
|
||||||
# Rotate by parallactic angle so "up" on the moon matches east's sky
|
# Rotate by parallactic angle so "up" on the moon matches east's sky
|
||||||
if when_utc is not None:
|
if when_utc is not None:
|
||||||
|
|||||||
Reference in New Issue
Block a user