I would like to remove the black part in the background 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...
This is what i have tried but please suggest any other method possible..Thanks in advance
I have tried to extract the background which is black and change it to yellow
Please find my code below:
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)
I have then taken help of this: How do I remove the background from this kind of image?
This was to blend the original image with the background created but does not seem to work and gives out an error
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()
This is the error message: Note that I have both the img1 and the mask in the same shape
Traceback (most recent call last):
File "", line 1, in runfile('C:/Users/User/Anaconda3/darkpixeldetection.py', wdir='C:/Users/User/Anaconda3')
File "C:\Users\User\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 678, in runfile execfile(filename, namespace)
File "C:\Users\User\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 106, in execfile exec(compile(f.read(), filename, 'exec'), namespace)
File "C:/Users/User/Anaconda3/darkpixeldetection.py", line 69, in masked= (mask_stack *img1)+((1-mask_stack)*mask_color)
ValueError: operands could not be broadcast together with shapes (1540,2670) (1540,2670,3)
Output of img1.shape:
(1540,2670,3)
Output of mask_stack.shape :
(1540,2670,3)
Fred: This is the input image that I have which has blurred content. This is the output image that I get after deleting the unnecessary contours This is my 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>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()