Проводили ли вы какие-либо исследования, прежде чем спрашивать?Переполнение стека не предназначено для решения вашего проекта за вас.Кроме того, по моему опыту, openCV имеет довольно крутую кривую обучения.Кто-то, кто дает вам код, который делает то, что вы хотите, вы ничему не научитесь.Вы узнаете больше всего, попробовав для себя.Много.
С учетом сказанного ниже приведен код, который удаляет фон.Это очень простой и специфичный для вашего имиджа.В целом это не очень хорошо, как вы можете видеть в результате.Но так как вы новичок в opencv, возможно, вам не слишком сложно это понять.
Я бы посоветовал вам исследовать операции, выполняемые в коде, пока вы не поймете их.(прочитайте здесь , здесь и здесь ) Посмотрите на изображения до и после операций, чтобы увидеть, что они делают.Затем, когда вы готовы, вы можете создать лучший фоновый вычитатель самостоятельно, следуя этому учебнику или используя grabcut
Результат:
# load image
img = cv2.imread("animal.jpg")
# detect edges
edges = cv2.Canny(img,100,100)
# merge edges to big blob
kernel = np.ones((10,10),np.uint8)
edges = cv2.morphologyEx(edges, cv2.MORPH_CLOSE, kernel)
# detect contour of blob
im2, contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# draw filled contour on edges-img
for cnt in contours:
cv2.drawContours(edges, [cnt], 0, (255,255,255), -1)
# uses edges-img as mask to remove background
res = cv2.bitwise_and(img,img,mask=edges)
cv2.imshow("img", res)
cv2.waitKey(0)
cv2.destroyAllWindows()