34 lines
1.1 KiB
Python
34 lines
1.1 KiB
Python
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
|