Простой подход заключается в использовании порога Оцу или адаптивного порога для автоматического определения порогового значения. Идея состоит в том, чтобы размытие по Гауссу , порог для получения двоичного изображения, затем найти контуры и выделить контур с помощью cv2.drawContours
. Возможно, вам придется настроить параметры, чтобы получить желаемый результат. Результаты:
Входные данные (снимок экрана) ->
Выходные данные
import cv2
import numpy as np
# Load image, grayscale, Gaussian blur, Adaptive threshold
image = cv2.imread('2.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (9,9), 0)
thresh = cv2.adaptiveThreshold(blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV,23,3)
# Find contours and filter using contour area
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
area = cv2.contourArea(c)
if area > 10:
cv2.drawContours(image, [c], -1, (36,255,12), 1)
cv2.imshow('thresh', thresh)
cv2.imshow('image', image)
cv2.waitKey()