import numpy as np from PIL import Image from shapely.geometry import box import find_annotations as fa from leonida.annotations import Annotation, AnnotationList, Keep, parse_annotations URBAN, WHITE, MAGENTA = (216, 216, 216), (248, 248, 248), (200, 0, 200) WATER, COAST = np.array([48, 144, 192]), np.array([0, 200, 240]) def picture(): img = np.zeros((200, 300, 3), dtype=np.uint8) img[:] = URBAN img[40:70, 30:120] = WHITE # Schriftzug for left in range(40, 100, 12): img[120:140, left:left + 4] = MAGENTA # Markerschrift, harte Kanten for offset in range(80): # weicher Küstenverlauf weight = 1 - abs(offset - 40) / 40 img[:, 200 + offset] = np.round(WATER * (1 - weight) + COAST * weight).astype(np.uint8) return img def test_scan_finds_text_and_markers_but_not_a_soft_coast_gradient(): spots = fa.scan(picture()) assert sorted(s.kind for s in spots) == ["marker", "text_white"] assert all(s.cols[1] <= 200 for s in spots) text = next(s for s in spots if s.kind == "text_white") assert (text.rows, text.cols) == ((40, 70), (30, 120)) assert text.chunk == "A1" def test_uncovered_respects_annotation_and_keep_frames(): spots = fa.scan(picture()) text = next(s for s in spots if s.kind == "text_white") marker = next(s for s in spots if s.kind == "marker") covering = Annotation(1, "Text", "text_white", box(*text.centre, *text.centre).buffer(5).bounds, None) keep = Keep(1, box(*marker.centre, *marker.centre).buffer(5).bounds, "echt") assert fa.uncovered(spots, AnnotationList([covering], [keep])) == [] assert fa.uncovered(spots, AnnotationList([covering])) == [marker] def test_proposal_is_a_valid_list_with_padded_frames(): spots = fa.scan(picture()) parsed = parse_annotations(fa.propose_toml(spots)) assert [a.kind for a in parsed.annotations] == [s.kind for s in spots] text = next(a for a in parsed.annotations if a.kind == "text_white") assert text.box == (-980.0, 2421.0, -871.0, 2470.0) # Pixel 30–119 / 40–69 plus 10 m Luft def test_review_writes_one_page_per_entry_and_an_overview(tmp_path): img = picture() entry = Annotation(1, "Text", "text_white", (-980.0, 2420.0, -870.0, 2470.0), None) written = fa.review(img, AnnotationList([entry]), Image.fromarray(img), tmp_path) assert [p.name for p in written] == ["001-Text.png"] assert (tmp_path / "uebersicht.png").exists()