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:
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():
|
def test_mainland_is_never_dropped():
|
||||||
"""Die groesste Nicht-Wasser-Komponente bleibt immer, auch voellig ohne Gruen und Sand."""
|
"""Die groesste Nicht-Wasser-Komponente bleibt immer, auch voellig ohne Gruen und Sand."""
|
||||||
labels = np.full((200, 200), CLASSES["wasser"], dtype=np.uint8)
|
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)
|
out = drop_map_labels(labels)
|
||||||
assert (out[10:190, 10:100] == CLASSES["stadt"]).all()
|
assert (out[10:190, 10:100] == CLASSES["stadt"]).all()
|
||||||
```
|
```
|
||||||
@@ -1598,6 +1598,12 @@ from scipy import ndimage as ndi
|
|||||||
|
|
||||||
NATURAL_CLASSES = ("gruen", "sand", "land")
|
NATURAL_CLASSES = ("gruen", "sand", "land")
|
||||||
LABEL_MAX_NATURAL = 0.02 # Anteil natuerlicher Merkmale, ab dem eine Flaeche als echt gilt
|
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:
|
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
|
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-
|
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
|
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"]
|
solid = labels != CLASSES["wasser"]
|
||||||
if not solid.any():
|
if not solid.any():
|
||||||
return labels
|
return labels
|
||||||
components, count = ndi.label(solid, structure=np.ones((3, 3)))
|
components, count = ndi.label(solid, structure=np.ones((3, 3)))
|
||||||
sizes = ndi.sum(solid, components, range(1, count + 1))
|
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)
|
natural = np.zeros(labels.shape, dtype=bool)
|
||||||
for name in NATURAL_CLASSES:
|
for name in NATURAL_CLASSES:
|
||||||
natural |= labels == CLASSES[name]
|
natural |= labels == CLASSES[name]
|
||||||
|
|||||||
Reference in new issue
Block a user