start
This commit is contained in:
1 parent
6a056262a8
commit
a55dca5fb6
11 files changed
+132
-25
No files matched your search
@@ -1,4 +1,5 @@
|
||||
import numpy as np
|
||||
from scipy import ndimage as ndi
|
||||
from shapely.geometry import box
|
||||
|
||||
from leonida.annotations import (Annotation, AnnotationList, Grid, annotation_mask, candidates, grid_mask,
|
||||
@@ -6,7 +7,7 @@ from leonida.annotations import (Annotation, AnnotationList, Grid, annotation_ma
|
||||
from leonida.classify import CLASSES, classify
|
||||
|
||||
PARK, ROAD, URBAN = (192, 216, 128), (80, 80, 80), (216, 216, 216)
|
||||
WHITE, OUTLINE = (248, 248, 248), (80, 88, 96)
|
||||
WHITE, OUTLINE, BUILDING = (248, 248, 248), (80, 88, 96), (176, 176, 176)
|
||||
|
||||
|
||||
def picture(h=200, w=300, colour=URBAN):
|
||||
@@ -154,6 +155,24 @@ def test_the_grid_is_closed_before_anything_is_rebuilt():
|
||||
assert removal.grid_lines == 7 # Spalten 0, 100, 200, 300 und Zeilen 0, 100, 200
|
||||
|
||||
|
||||
def test_a_grid_line_through_an_entry_leaves_no_strip_in_it():
|
||||
img = picture(colour=PARK)
|
||||
img[:, 98:102] = ROAD # Gitterlinie, als Straße gelesen, quer durch den Schriftzug
|
||||
letter(img, (80, 120), (60, 140))
|
||||
annotations = AnnotationList([entry("text_white", (60, 141), (40, 161))], grid=Grid(100, 6))
|
||||
removal = remove_annotations(img, classify(img), annotations)
|
||||
assert (removal.labels == CLASSES["land"]).all() # erst danach aufgebaut, liefe dort ein Straßenstreifen
|
||||
|
||||
|
||||
def test_a_thin_mask_takes_the_nearest_class_and_leaves_no_slit():
|
||||
img = picture()
|
||||
img[60:140, 100:200] = BUILDING
|
||||
line = entry("region", (99, 102), (90, 211), name="Zeigerlinie") # 3 m breit, quer über das Gebäude
|
||||
removal = remove_annotations(img, classify(img), AnnotationList([line]))
|
||||
assert (removal.labels[60:140, 100:200] == CLASSES["gebaeude"]).all()
|
||||
assert (removal.labels[99:102, 90:100] == CLASSES["stadt"]).all()
|
||||
|
||||
|
||||
def test_entries_sharing_one_mask_are_reported_together():
|
||||
img = picture()
|
||||
img[:, 140:160] = ROAD
|
||||
@@ -165,6 +184,37 @@ def test_entries_sharing_one_mask_are_reported_together():
|
||||
assert "#2 Rechts · A1 · Maske" in report and "gemeinsam mit #1" in report
|
||||
|
||||
|
||||
class ReversedComponents:
|
||||
"""scipy.ndimage für annotations.py, nur nummeriert label() die Flächen rückwärts."""
|
||||
|
||||
def __getattr__(self, name):
|
||||
return getattr(ndi, name)
|
||||
|
||||
@staticmethod
|
||||
def label(image, structure=None):
|
||||
numbers, count = ndi.label(image, structure=structure)
|
||||
return np.where(numbers > 0, count + 1 - numbers, 0), count
|
||||
|
||||
|
||||
def test_added_buildings_do_not_depend_on_the_order_of_the_masks(monkeypatch):
|
||||
img = picture(300, 400)
|
||||
img[20:40, :] = ROAD
|
||||
img[260:280, :] = ROAD
|
||||
img[:, 20:40] = ROAD
|
||||
img[:, 360:380] = ROAD
|
||||
for top in (60, 100, 140, 180):
|
||||
for left in (60, 120):
|
||||
img[top:top + 20, left:left + 30] = BUILDING # links sichtbar bebaut
|
||||
letter(img, (43, 257), (180, 190)) # Kontur in Straßenfarbe teilt den Block bis zum Aufbau
|
||||
annotations = AnnotationList([entry("text_white", (30, 271), (165, 206), index=1, name="Balken"),
|
||||
entry("region", (60, 241), (220, 341), index=2, name="Rest")])
|
||||
forward = remove_annotations(img, classify(img), annotations)
|
||||
monkeypatch.setattr("leonida.annotations.ndi", ReversedComponents())
|
||||
backward = remove_annotations(img, classify(img), annotations)
|
||||
assert forward.generated # im verdeckten Teil rechts entstehen Gebäude
|
||||
assert (forward.labels == backward.labels).all()
|
||||
|
||||
|
||||
def test_buildings_mostly_inside_added_rectangles_are_marked():
|
||||
heights = [{"height": 9.0, "source": "district"}, {"height": 12.0, "source": "district"}]
|
||||
marked = mark_generated([box(1, 1, 9, 9), box(6, 0, 16, 10)], heights, [box(0, 0, 10, 10)])
|
||||
|
||||
Reference in new issue
Block a user