繁体   English   中英

在Python中检测到的背景减法或轮廓的背景色变化

[英]background subtraction or change of background colour of contour detected in Python

我想删除背景中的黑色部分或将其更改为其他颜色,因为我试图检测轮廓内的暗像素,但这似乎不起作用,因为两者都在黑色背景中并且暗像素是黑色。 。

这是我尝试过的方法,但请提出其他可能的方法。

我试图提取黑色的背景并将其更改为黄色

请在下面找到我的代码:

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)

然后,我采取了以下措施: 如何从此类图像中删除背景?

这是将原始图像与创建的背景混合在一起,但似乎不起作用并发出错误

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()

这是错误消息: 请注意,我的img1和蒙版都具有相同的形状

追溯(最近一次通话):

文件“”,第1行,位于runfile('C:/Users/User/Anaconda3/darkpixeldetection.py',wdir='C:/ Users / User / Anaconda3')

文件“ C:\\ Users \\ User \\ Anaconda3 \\ lib \\ site-packages \\ spyder_kernels \\ customize \\ spydercustomize.py”,行678,在运行文件execfile(文件名,名称空间)中

文件“ C:\\ Users \\ User \\ Anaconda3 \\ lib \\ site-packages \\ spyder_kernels \\ customize \\ spydercustomize.py”,行execfile exec(编译(f.read(),文件名,“ exec”),名称空间)

文件“ C:/Users/User/Anaconda3/darkpixeldetection.py”,行69,masked =(mask_stack * img1)+((1-mask_stack)* mask_color)

ValueError:操作数不能与形状一起广播(1540,2670)(1540,2670,3)

img1.shape的输出:

(1540,2670,3)

输出mask_stack.shape:

(1540,2670,3)

弗雷德:这是我输入的内容模糊的图像 这是删除不必要的轮廓后得到的输出图像。这是我的代码:

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()

您可以使用背景占据图像很大一部分的事实。 如果知道要检测的东西总是小于特定大小,则可以使用轮廓区域过滤要忽略的轮廓。

maxArea  = 12412 # whatever makes sense in your case
for i, contour in enumerate(contours):
  area = cv2.contourArea(contour)
  if area > maxArea :
    del contours[i]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM