diff --git a/cv_analysis/layout_parsing.py b/cv_analysis/layout_parsing.py index a5d5578..6bb9d68 100644 --- a/cv_analysis/layout_parsing.py +++ b/cv_analysis/layout_parsing.py @@ -1,15 +1,12 @@ from functools import reduce, partial -from itertools import compress -from operator import __and__ from typing import Iterable import cv2 import numpy as np -from funcy import lmap, compose, rcompose +from funcy import lmap, compose, rcompose, first, lkeep from cv_analysis.utils.connect_rects import connect_related_rects2 from cv_analysis.utils.conversion import box_to_rectangle, rectangle_to_box -from cv_analysis.utils.display import show_image from cv_analysis.utils.postprocessing import ( remove_included, has_no_parent, @@ -45,22 +42,21 @@ def prepare_for_initial_detection(image: np.ndarray): def __find_segments(image): + def to_rectangle_if_valid(contour, hierarchy): + return ( + box_to_rectangle(cv2.boundingRect(contour)) + if is_likely_segment(contour) and has_no_parent(hierarchy) + else None + ) - contours, hierarchies = find_contours(image) - likely_segments = map(is_likely_segment, contours) - without_parents = map(has_no_parent, hierarchies[0]) - valid_contours = map(__and__, likely_segments, without_parents) - contours = compress(contours, valid_contours) - - boxes = map(cv2.boundingRect, contours) - rectangles = lmap(box_to_rectangle, boxes) + rectangles = lkeep(map(to_rectangle_if_valid, *find_contours(image))) return rectangles def find_contours(image): contours, hierarchies = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) - return contours, hierarchies + return contours, first(hierarchies) def is_likely_segment(rect, min_area=100):