title: background subtraction or change of background colour of contour detected in Python
body: <p>I would like to remove the black part in the <a href="https://i.stack.imgur.com/lXbzH.jpg" rel="nofollow noreferrer">background</a> or change it to a different colour as I am trying to detect dark pixel inside the contour and this does not seem to work since both are in black background and the dark pixels are black...</p>
  
  <p>This is what i have tried but please suggest any other method possible..Thanks in advance </p>
  
  <p>I have tried to extract the background which is black and change it to <a href="https://i.stack.imgur.com/DyBdA.png" rel="nofollow noreferrer">yellow</a></p>
  
  <p>Please find my code below:</p>
  
  <pre><code>import cv2
  import numpy as np
  mask_color= (0.0,0.0,1.0)
  
  #reading the image
  img= cv2.imread('notused.jpg')
  
  #convering the image into grayscale
  gray_image= cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  
  #applying threshold
  ret,thresh= cv2.threshold(gray_image,70,255,cv2.THRESH_BINARY)
  
  #finding contours on the original image
  _, contours,hierarchy =cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
  
  #creating a mask as of the image size which is a black image
  mask= np.zeros(img.shape[:2],np.uint8)
  
  #inverted to get a white image
  maskinv=cv2.bitwise_not(mask)
  
  #drawn contours on the white image
  mask_contours=cv2.drawContours(maskinv,contours,0,0,-3)
  
  #converted to 3 channels
  mask_stack= np.dstack([mask_contours]*3)
  
  
  #to get only the background and remove all the contours 
  img1=cv2.bitwise_xor(img,img,mask)
  
  #changing every pixel of the background image to yellow
  for y in range(img1.shape[0]-1): #row values
      for x in range(img1.shape[1]-1): #column values
          img1[y,x]=(0,255,255)
  </code></pre>
  
  <p>I have then taken help of this: <a href="https://stackoverflow.com/questions/29313667/how-do-i-remove-the-background-from-this-kind-of-image">How do I remove the background from this kind of image?</a></p>
  
  <p>This was to blend the original image with the background created but does not seem to work and gives out an error</p>
  
  <pre><code>mask_stack= mask_contours.astype('float32')/255.0
  img1=img1.astype('float32')/255.0
  
  masked= (mask_stack *img1)+((1-mask_stack)*mask_color)
  masked=(masked*255).astype('uint8')
  
  cv2.waitKey(0)
  cv2.destroyAllWindows()
  </code></pre>
  
  <p>This is the error message:
  <strong>Note that I have both the img1 and the mask in the same shape</strong></p>
  
  <blockquote>
    <p>Traceback (most recent call last):</p>
    
    <p>File "", line 1, in 
        runfile('C:/Users/User/Anaconda3/darkpixeldetection.py', wdir='C:/Users/User/Anaconda3')</p>
    
    <p>File
    "C:\Users\User\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py",
    line 678, in runfile
        execfile(filename, namespace)</p>
    
    <p>File
    "C:\Users\User\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py",
    line 106, in execfile
        exec(compile(f.read(), filename, 'exec'), namespace)</p>
    
    <p>File "C:/Users/User/Anaconda3/darkpixeldetection.py", line 69, in
    
        masked= (mask_stack *img1)+((1-mask_stack)*mask_color)</p>
    
    <p>ValueError: operands could not be broadcast together with shapes
    (1540,2670) (1540,2670,3)</p>
  </blockquote>
  
  <p>Output of img1.shape:</p>
  
  <blockquote>
    <p>(1540,2670,3)</p>
  </blockquote>
  
  <p>Output of mask_stack.shape :</p>
  
  <blockquote>
    <p>(1540,2670,3)</p>
  </blockquote>
  
  <p>Fred:
  This is the <a href="https://i.stack.imgur.com/iDTHS.jpg" rel="nofollow noreferrer">input image</a> that I have which has blurred content.
  This is the <a href="https://i.stack.imgur.com/6m391.jpg" rel="nofollow noreferrer">output image</a> that I get after deleting the unnecessary contours
  This is my code:</p>
  
  <pre><code>import numpy as np
  import cv2
  img_original= cv2.imread('blueimagewithblur.jpg')
  img_array=np.asarray(img_original)
  blur= cv2.pyrMeanShiftFiltering(img_original,21,49)
  
  gray_image= cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)
  
  ret,thresh= cv2.threshold(gray_image,70,255,cv2.THRESH_BINARY)
  
  _, contours,hierarchy =cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
  
  countourimage=cv2.drawContours(img_original,contours,-1,0,3)
  largest_area= 2000
  
  for i,c in enumerate(contours):
      contour_areas=cv2.contourArea(c)
      if(contour_areas&gt;largest_area):
          del contours[i]
          x_rect,y_rect,w_rect,h_rect=cv2.boundingRect(c)
          cropped=img_original[y_rect:y_rect+h_rect,x_rect:x_rect+w_rect]
  
  cv2.imwrite('C:/Users/User/Anaconda3/stackoverflowexam.jpg',cropped)
  cv2.imshow('croopedd',cropped)
  
  
  cv2.waitKey(0)
  cv2.destroyAllWindows()
  </code></pre>