lillian locarnini 95cab33f19 Pull request #29: Evaluate layout detection
Merge in RR/cv-analysis from evaluate_layout_detection to master

Squashed commit of the following:

commit 8ec2f69fc61d1e15bd502b0a2c1f720cbec2b34e
Author: llocarnini <lillian.locarnini@iqser.com>
Date:   Tue Aug 23 15:07:21 2022 +0200

    repaired is_not_included() logic (did drop the outer rectangle, not the included)

commit 97be081d1e60989313924ceac0bfb3062229411e
Merge: 2c28fa2 2b5c4f1
Author: llocarnini <lillian.locarnini@iqser.com>
Date:   Tue Aug 23 14:28:14 2022 +0200

    Merge branch 'master' of ssh://git.iqser.com:2222/rr/cv-analysis into evaluate_layout_detection

commit 2c28fa280b7eff922c715245fffe69702c7e6742
Author: llocarnini <lillian.locarnini@iqser.com>
Date:   Tue Aug 23 13:50:17 2022 +0200

    del print statements

commit c60121fc4faebc5de556ec0ab7a3af4f815f7ce1
Author: llocarnini <lillian.locarnini@iqser.com>
Date:   Mon Aug 22 10:51:52 2022 +0200

    few changes to connect_rects.py

commit a99719905d58cbe856fa020177abd7e317c1d072
Author: llocarnini <lillian.locarnini@iqser.com>
Date:   Thu Aug 18 08:37:12 2022 +0200

    layout parsing improved with connect_rects.py

commit d693688a0f0d63395cfd36645de7b3417f64de30
Author: llocarnini <lillian.locarnini@iqser.com>
Date:   Tue Aug 2 09:31:19 2022 +0200

    removed vizlogger instances
2022-08-23 15:09:51 +02:00

51 lines
1.8 KiB
Python

from collections import namedtuple
from functools import partial
from itertools import starmap, compress
from typing import Iterable
from cv_analysis.utils.structures import Rectangle
def remove_overlapping(rectangles: Iterable[Rectangle]) -> list[Rectangle]:
def overlap(a: Rectangle, rect2: Rectangle) -> float:
return a.intersection(rect2) > 0
def does_not_overlap(rect: Rectangle, rectangles: Iterable[Rectangle]) -> list:
return not any(overlap(rect, rect2) for rect2 in rectangles if not rect == rect2)
rectangles = list(filter(partial(does_not_overlap, rectangles=rectangles), rectangles))
return rectangles
def remove_included(rectangles: Iterable[Rectangle]) -> list[Rectangle]:
keep = [rect for rect in rectangles if not rect.is_included(rectangles)]
return keep
def __remove_isolated_unsorted(rectangles: Iterable[Rectangle]) -> list[Rectangle]:
def is_connected(rect: Rectangle, rectangles: Iterable[Rectangle]):
return any(rect.adjacent(rect2) for rect2 in rectangles if not rect == rect2)
rectangles = list(filter(partial(is_connected, rectangles=list(rectangles)), rectangles))
return rectangles
def __remove_isolated_sorted(rectangles: Iterable[Rectangle]) -> list[Rectangle]:
def is_connected(left, center, right):
return any([left.adjacent(center), center.adjacent(right)])
rectangles = list(rectangles)
lefts = [None, *rectangles[:-1]]
rights = [*rectangles[1:], None]
mask = starmap(is_connected, zip(lefts, rectangles, rights))
rectangles = list(compress(rectangles, mask))
return rectangles
def remove_isolated(rectangles: Iterable[Rectangle], input_unsorted=True) -> list[Rectangle]:
return (__remove_isolated_unsorted if input_unsorted else __remove_isolated_sorted)(rectangles)
def has_no_parent(hierarchy):
return hierarchy[-1] <= 0