Я попытался использовать порог, выпуклый корпус, контур, чтобы сделать маску, но все они не сработали, набор данных, который у меня есть, - набор ракеток, и lo go и картины были более ярких цветов, поэтому при использовании порога бинарное не работает, а canny и contour не улавливают грани, и трудно закрыть, я хочу только маскировать форму ракетки, есть ли лучший способ решить это? спасибо
import cv2
import numpy as np
import random as rng
img =cv2.imread(r"D:\Hu_20200117\20200117160808\51-20200117160823868.bmp",cv2.IMREAD_GRAYSCALE)
img = cv2.medianBlur(img,5)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(9,9))
dilated = cv2.dilate(img, kernel)
canny = cv2.Canny(dilated, 20, 150)
th3 = cv2.adaptiveThreshold(dilated,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY_INV,11,5)
_,contours, _ = cv2.findContours(th3, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
hull_list = []
for i in range(len(contours)):
hull = cv2.convexHull(contours[i])
hull_list.append(hull)
# Draw contours + hull results
drawing = np.zeros((th3.shape[0], th3.shape[1], 3), dtype=np.uint8)
for i in range(len(contours)):
# cv2.drawContours(drawing, contours, i, (255,255,255),cv2.FILLED)
cv2.drawContours(drawing, hull_list, i, (255,255,255),cv2.FILLED)
# Show in a window
foreground = cv2.morphologyEx(drawing, cv2.MORPH_OPEN, kernel)
foreground = cv2.morphologyEx(foreground, cv2.MORPH_CLOSE, kernel)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
background = cv2.dilate(foreground, kernel, iterations=3)
cv2.imshow('drawing', drawing)
cv2.imshow('Background', background)
cv2.waitKey(0)
адаптивный порог, кажется, имеет четкий контур, но не был закрыт, не может его заполнить