import cv2 import numpy as np from cv_analysis.utils.common import find_contours_and_hierarchies def detect_large_coherent_structures(image: np.array): """Detects large coherent structures in an image. Expects an image with binary color space (e.g. threshold applied). Args: image (np.array): Image to look for large coherent structures in. Returns: list: List of contours. References: https://stackoverflow.com/questions/60259169/how-to-group-nearby-contours-in-opencv-python-zebra-crossing-detection """ assert len(image.shape) == 2 # FIXME: Parameterize via factory dilate_kernel = cv2.getStructuringElement(cv2.MORPH_OPEN, (5, 5)) # FIXME: Parameterize via factory dilate = cv2.dilate(image, dilate_kernel, iterations=4) # FIXME: Parameterize via factory close_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (20, 20)) # FIXME: Parameterize via factory close = cv2.morphologyEx(dilate, cv2.MORPH_CLOSE, close_kernel, iterations=1) # TODO: Tweak iterations contours, _ = find_contours_and_hierarchies(close) return contours