Как уже упоминалось @RickM, для анализа вашего изображения доступны различные цветовые пространства.Поскольку вы сосредоточены на удалении тени / тени, вам необходимо сосредоточиться на каналах, которые содержат информацию о яркости, и оставить в стороне цветовые каналы.
В этом случае цветовое пространство LAB оказалось полезным.Канал яркости выразил много информации о количестве яркости в изображении
img = cv2.imread('4.png')
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
l, a, b = cv2.split(lab)
cv2.imshow('Luminance', l)
Затем я получил порог и замаскировал результат с помощьюисходное изображение, чтобы получить mask1
:
ret2, th = cv2.threshold(l, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
mask1 = cv2.bitwise_and(img, img, mask = th)
cv2.imshow('mask1', mask1)
Но теперь фон не тот, который вы предполагали.Я создал изображение с белыми пикселями того же размера (white
) и замаскировал им перевернутое пороговое изображение, чтобы получить mask2
:
white = np.zeros_like(img)
white = cv2.bitwise_not(white)
mask2 = cv2.bitwise_and(white, white, mask = cv2.bitwise_not(th))
cv2.imshow('mask2', mask2)
После добавления обоих этих изображений вы получите желаемое изображение:
cv2.imshow('fin_img', mask2 + mask1)
Имейте в виду, что это будет работать только для аналогичныхИзображения предоставлены в вопросе.