How to apply opencv background subtraction to an image

Question:

I am trying to apply cv2.createBackgroundSubtractorMOG() to this Image:

enter image description here

to eliminate all background brightness and only leave the two bright objects in the middle for further analysis. Is this the right approach for this task? If not, how would I do that?

import cv2

img = cv2.imread('image.png')
sharp_img = cv2.createBackgroundSubtractorMOG().apply(img)

Output:

Traceback (most recent call last):
  File "/home/artur/Desktop/test.py", line 4, in <module>
    sharp_img = cv2.createBackgroundSubtractorMOG().apply(img)
AttributeError: module 'cv2.cv2' has no attribute 'createBackgroundSubtractorMOG

Edit:

MOG does not seem to work.

Code:

import cv2
img = cv2.imread('image.png')
sharp_img = cv2.bgsegm.createBackgroundSubtractorMOG().apply(img)
cv2.imwrite('image2.png', sharp_img)

Output:

Traceback (most recent call last):
  File "/home/artur/Desktop/test.py", line 4, in <module>
    sharp_img = cv2.bgsegm.createBackgroundSubtractorMOG().apply(img)
AttributeError: module 'cv2.cv2' has no attribute 'bgsegm'

MOG2 seems to work but with no satisfying result:

Code:

import cv2
img = cv2.imread('image.png')
sharp_img = cv2.createBackgroundSubtractorMOG2().apply(img)
cv2.imwrite('image2.png', sharp_img)

Output Image:

enter image description here

I tried to play around with the args of the MOG2 Method from the docs but with no change.

Answers:

from the docs, try this:

sharp_img = cv.bgsegm.createBackgroundSubtractorMOG().apply(img)

or

sharp_img = cv2.createBackgroundSubtractorMOG2().apply(img)
Answered By: vencaslac
import cv2
img = cv2.imread('image.png')

max,min = img.max(),imgg.min()
print(max,min)  #helps in giving thresholding values 

threshold_img = cv2.threshold(blurred, 127, 255,cv2.THRESH_BINARY) #good starting point to give t1 value as half of max value of image

cv2.imshow(threshold_img)

This approach is a good starting point in your case, as you have two bright peaks that you want to separate from the noise. Once you have identified the required threshold limits, you should be able to isolate the two spots from the noise in the background. You can further use cv2.erode and cv2.dilate if needed to remove further noise.

Answered By: Shonith
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.