How to remove shadow of moving object from image using opencv (python)?

352 Views Asked by At

I am trying to do background subtraction using MOG2, It was working fine, but when there is deep shadow of a moving object then the shadow is considered as foreground object and I don't want that shadow as foreground object (I'm running MOG2 for 13 images). How can I remove these shadow so that it does not come in foreground?

Here is a sample image...

original img

image after applying MOG2

here is my sample code...

import os
import numpy as np
import cv2
import glob
import imutils
i=0
bg_flag = 0
image_list = []
bgs_list = []
#bgsfinal function
def detection(image_list):
    global i
    global bg_flag
    bgs3_img = None
    backsub = cv2.createBackgroundSubtractorMOG2(128, cv2.THRESH_BINARY, 1)
    print("start2")
    for k in range(len(image_list)):
        frame = image_list[k]
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        cv2.imwrite('./gray/'+str(k)+'.jpg', frame)
        #blur = cv2.medianBlur(frame, 21)
        blur = frame
        bgs_list.append(blur)
    for bg in range(len(bgs_list)):
        rects = []
        #start_time = time.time()
        frame_blur = bgs_list[bg]
        img = image_list[bg].copy()
        s_frame = image_list[bg]
        new_frame = s_frame.copy()
        fgmask = backsub.apply(frame_blur)
        cv2.imwrite("./bgs/"+str(i)+".jpg", fgmask)
        fgmask[fgmask==127] = 0
        cv2.imwrite("./dilate/"+str(i)+".jpg", fgmask)
        thresh = cv2.threshold(fgmask, 128, 255, cv2.THRESH_BINARY)[1]
        thresh = cv2.erode(thresh, None, iterations = 1)
        thresh = cv2.dilate(thresh, None, iterations=1)
        cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        cnts = imutils.grab_contours(cnts)
        for c in cnts:
            #M = cv2.moments(c)
            A = cv2.contourArea(c)
            (x, y, w, h) = cv2.boundingRect(c)
            
            cv2.rectangle(new_frame, (x, y), (x + w, y + h), (0,0, 255), 1)
            cv2.putText(new_frame, str(A), (x - 10, y - 10), 
                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)
            cv2.imwrite("./area/"+str(i)+".jpg", new_frame)
            cv2.rectangle(thresh, (x, y), (x + w, y + h), (255,255, 255), 1)
            cv2.putText(thresh, str(A), (x - 10, y - 10), 
                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1)
            cv2.imwrite("./area_bgs/"+str(i)+".jpg", thresh)
        i+=1
    print("Done!")
#this folder contains 13 continuous images 
images = glob.glob('./inci4/*.jpg')

for j in range(len(images)):
    img = cv2.imread(images[j])
    img = cv2.resize(img, (360, 640))
    image_list.append(img)

detection(image_list)


0

There are 0 best solutions below