Как удалить тени из видео со статическим фоном? - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь обнаружить движущийся объект и удалить тень от видео со статическим фоном. Я использую метод Mixture of Gaussians (MOG) для обнаружения движущихся объектов. Я использую opencv3 и python 3.5. Как я могу удалить тени от видео и маски переднего плана? Я использовал эрозию и расширение для уменьшения шума. Но это не удаляет тени.

import cv2
import numpy as np

cap = cv2.VideoCapture('TownCentreXVID.avi')
fgbg = cv2.createBackgroundSubtractorMOG2()

while(1):

    _, frame = cap.read()
    mask = fgbg.apply(frame)



    kernel = np.ones((5,5),np.uint8)
    opening = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
    closing = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)

    window = cv2.namedWindow('Original', cv2.WINDOW_NORMAL| cv2.WINDOW_KEEPRATIO )
    window = cv2.namedWindow('Mask', cv2.WINDOW_NORMAL| cv2.WINDOW_KEEPRATIO)
    window = cv2.namedWindow('Opening', cv2.WINDOW_NORMAL| cv2.WINDOW_KEEPRATIO )
    #window = cv2.namedWindow('Closing', cv2.WINDOW_NORMAL| cv2.WINDOW_KEEPRATIO)

    cv2.imshow('Original',frame)
    cv2.imshow('Mask',thresh)
    cv2.imshow('Opening',opening)
    #cv2.imshow('Closing',closing)

    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break

cv2.destroyAllWindows()
cap.release()

1 Ответ

0 голосов
/ 25 апреля 2019

Фоновый вычитатель возвращает маску, в которой объект переднего плана - белый, а тени - серый.
Вы можете использовать thresholding , чтобы создать новую маску без тени или только с тенью.
Используйте маску без теней, чтобы получить только передний план.
Используйте маску только с тенью, чтобы заменить тень на фоне (опорным фоновым изображением).

Результат:
enter image description here

Код:

import cv2
import numpy as np
# load image / mask
mask = cv2.imread("mask.png",0)
#threshold mask
ret, foreground = cv2.threshold(mask, 200, 255, cv2.THRESH_BINARY)
ret, shadow = cv2.threshold(mask, 200, 255, cv2.THRESH_TOZERO_INV)
# stack images vertically
res = np.concatenate((mask,foreground,shadow),axis=0)
#show image
cv2.imshow("Result",res)
cv2.waitKey(0)
cv2.destroyAllWindows()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...