Вот частичное решение. Эту проблему можно разбить на два этапа:
1) Удалите прямоугольники, удалив горизонтальные + вертикальные линии
Мы создаем вертикальные и горизонтальные ядра, а затем выполняем морфинг вблизи, чтобы обнаружитьлинии. Отсюда мы используем побитовые операции для удаления строк.
Обнаружены вертикальные линии (слева) и горизонтальные линии (справа)
![image](https://i.stack.imgur.com/xcjIm.png)
Удалены линии
![image](https://i.stack.imgur.com/nfpzV.png)
import cv2
image = cv2.imread('1.jpg')
vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,15))
remove_vertical = 255 - cv2.morphologyEx(image, cv2.MORPH_CLOSE, vertical_kernel)
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (15,1))
remove_horizontal = 255 - cv2.morphologyEx(image, cv2.MORPH_CLOSE, horizontal_kernel)
result = cv2.add(cv2.add(remove_vertical, remove_horizontal), image)
cv2.imshow('result', result)
cv2.waitKey()
2) Обнаружение / удаление кругов
Существует несколько подходов для удаления кругов
- Использование
cv2.HoughCircles()
. Вот хороший учебник по обнаружению кругов на изображениях с использованием Hough Circles - Создание ядра
cv2.MORPH_ELLIPSE
с использованием cv2.getStructuringElement()
, затем выполнение морфологических операций для выделения контуров окружности - Используйте простое обнаружение формы с аппроксимацией контура и фильтрацией контура для обнаружения окружностей. Этот метод использует
cv2.arcLength()
и cv2.approxPolyDP()
для аппроксимации контура. Одним из недостатков этого метода является то, что он работает только с «идеальными» формами. Взгляните на обнаружение простых геометрических фигур и обнаружение формы opencv