docs: Widerspruch in Task 6b auflösen (MAINLAND_MIN_SIZE)

Mein Step-3-Code scheiterte an meinem eigenen Step-1-Test: in einer Szene
mit nur einer Komponente erklärt argmax genau diese zum Festland, also
auch einen einzelnen Schriftzug. Der Implementer hat das gefunden und
MAINLAND_MIN_SIZE ergänzt; der Plan zieht nach, samt Begründung des
Werts und des zweigeteilten Befunds an echten Daten.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
knsoandClaude Opus 5 committed 2026-09-12 18:02:13 +02:00
1 parent f3abb5e803
commit 4289378561
1 file changed
+15 -3
@@ -1580,7 +1580,7 @@ def test_real_island_survives():
def test_mainland_is_never_dropped():
"""Die groesste Nicht-Wasser-Komponente bleibt immer, auch voellig ohne Gruen und Sand."""
labels = np.full((200, 200), CLASSES["wasser"], dtype=np.uint8)
labels[10:190, 10:100] = CLASSES["stadt"]
labels[10:190, 10:100] = CLASSES["stadt"] # 16.200 px, ueber MAINLAND_MIN_SIZE
out = drop_map_labels(labels)
assert (out[10:190, 10:100] == CLASSES["stadt"]).all()
```
@@ -1598,6 +1598,12 @@ from scipy import ndimage as ndi
NATURAL_CLASSES = ("gruen", "sand", "land")
LABEL_MAX_NATURAL = 0.02 # Anteil natuerlicher Merkmale, ab dem eine Flaeche als echt gilt
# Ab dieser Groesse gilt die groesste Komponente als Festland und ist von der Pruefung
# ausgenommen. Ohne die Schwelle waere in einer Szene mit nur einer Komponente immer genau
# diese das "Festland" — ein einzelner Schriftzug im Wasser bliebe damit stehen. Am echten
# Mosaik aendert der Wert nichts: das Festland hat 5.852.263 px, der groesste Schriftzug
# 14.760 px, und ausgenommen wird ohnehin nur die groesste Komponente.
MAINLAND_MIN_SIZE = 15_000
def drop_map_labels(labels: np.ndarray) -> np.ndarray:
@@ -1607,14 +1613,20 @@ def drop_map_labels(labels: np.ndarray) -> np.ndarray:
sind farblich von echten Flaechen nicht zu unterscheiden. Trennbar sind sie erst als
Region: ein Schriftzug im Wasser bildet eine eigene, vom Festland getrennte Nicht-Wasser-
Komponente ohne jedes natuerliche Merkmal, waehrend eine echte Insel Gruen oder Sand
traegt. Die groesste Komponente ist immer das Festland und bleibt unangetastet.
traegt. Am echten Mosaik ist die Trennung zweigeteilt ohne Zwischenstufe: jede Komponente
hat entweder mindestens 37 % natuerliche Merkmale oder exakt 0 %.
Die groesste Komponente gilt als Festland und bleibt unangetastet, sofern sie ueberhaupt
gross genug dafuer ist (MAINLAND_MIN_SIZE) — sonst wuerde in einer Szene aus einem
einzigen Schriftzug genau dieser zum Festland erklaert.
"""
solid = labels != CLASSES["wasser"]
if not solid.any():
return labels
components, count = ndi.label(solid, structure=np.ones((3, 3)))
sizes = ndi.sum(solid, components, range(1, count + 1))
mainland = int(np.argmax(sizes)) + 1
largest = int(np.argmax(sizes)) + 1
mainland = largest if sizes[largest - 1] >= MAINLAND_MIN_SIZE else 0
natural = np.zeros(labels.shape, dtype=bool)
for name in NATURAL_CLASSES:
natural |= labels == CLASSES[name]