Этот вопрос широк. Но для данного изображения есть обходной путь. Вы можете сегментировать передний план, преобразовав изображение в другое цветовое пространство.
Обратите внимание, насколько контрастно голубое небо и облака относительно листьев на переднем плане. Применение простого порога к каналу оттенка сегментирует большую часть листьев.
Код:
import numpy as np
import cv2
im = cv2.imread('C:/Users/Jackson/Desktop/leaves.jpg', 1)
im = cv2.resize(im, (0, 0), fx = 0.5, fy = 0.5)
imhsv = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)
cv2.imshow('Hue', imhsv[:,:,0])
#--- Otsu threshold ---
ret, thresh = cv2.threshold(imhsv[:,:,0], 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
cv2.imshow('thresh',thresh)
#--- Masking with the original image ---
fin = cv2.bitwise_and(im, im, mask = thresh)
cv2.imshow('fin', fin)
Примечание:
Это не общее решение. Это характерно для этого изображения и изображений, которые имеют контрастные цвета. Для более обобщенного подхода вы можете попробовать алгоритм GrabCut, предназначенный для простых изображений.