Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何去除噪声图像的背景并提取透明对象?_Python_Deep Learning_Computer Vision_Image Segmentation_Background Substraction - Fatal编程技术网

Python 如何去除噪声图像的背景并提取透明对象?

Python 如何去除噪声图像的背景并提取透明对象?,python,deep-learning,computer-vision,image-segmentation,background-substraction,Python,Deep Learning,Computer Vision,Image Segmentation,Background Substraction,我有一个无法解决的图像处理问题。我有一套像下面(1)一样的375张图片。我正试图去除背景,以便进行“背景减除”(或“前景提取”)并仅在普通背景(黑/白/…)上获得浪费 我尝试了很多东西,包括OpenCV中的createBackgroundSubtractorMOG2或threshold。我还试图通过从前景中减去背景来逐个像素地去除背景,因为我有一组237幅背景图像(2)(没有垃圾的地毯,但与有物体的图像有一点偏移)。背景图像的亮度也有变化 下面是一个我能够测试的代码示例,它给出了下面(3)和

我有一个无法解决的图像处理问题。我有一套像下面(1)一样的375张图片。我正试图去除背景,以便进行“背景减除”(或“前景提取”)并仅在普通背景(黑/白/…)上获得浪费

我尝试了很多东西,包括OpenCV中的createBackgroundSubtractorMOG2或threshold。我还试图通过从前景中减去背景来逐个像素地去除背景,因为我有一组237幅背景图像(2)(没有垃圾的地毯,但与有物体的图像有一点偏移)。背景图像的亮度也有变化

下面是一个我能够测试的代码示例,它给出了下面(3)和(4)的结果。我使用Python 3.8.3

# Function to remove the sides of the images
def delete_side(img, x_left, x_right):
    for i in range(img.shape[0]):
        for j in range(img.shape[1]):
            if j<=x_left or j>=x_right:
                img[i,j] = (0,0,0)
    return img

# Intialize the background model
backSub = cv2.createBackgroundSubtractorMOG2(history=250, varThreshold=2, detectShadows=True)

# Read the frames and update the background model
for frame in frames:
    if frame.endswith(".png"):
        filepath = FRAMES_FOLDER + '/' + frame
        img = cv2.imread(filepath)
        img_cut = delete_side(img, x_left=190, x_right=1280)
        gray = cv2.cvtColor(img_cut, cv2.COLOR_BGR2GRAY)
        mask = backSub.apply(gray)
        newimage = cv2.bitwise_or(img, img, mask=mask)
        img_blurred = cv2.GaussianBlur(newimage, (5, 5), 0)
        gray2 = cv2.cvtColor(img_blurred, cv2.COLOR_BGR2GRAY)
        _, binary = cv2.threshold(gray2, 10, 255, cv2.THRESH_BINARY)
        final = cv2.bitwise_or(img, img, mask=binary)
        newpath = RESULT_FOLDER + '/' + frame
        cv2.imwrite(newpath, final)
#删除图像侧面的功能
def delete_侧(img,左x_,右x_):
对于范围内的i(img.shape[0]):
对于范围内的j(img.形状[1]):
如果j=x_右:
img[i,j]=(0,0,0)
返回img
#初始化背景模型
backSub=cv2.createBackgroundSubtractorMOG2(历史=250,varThreshold=2,detectShadows=True)
#读取帧并更新背景模型
对于帧中帧:
如果frame.endswith(“.png”):
filepath=FRAMES\u文件夹+'/'+FRAMES
img=cv2.imread(文件路径)
img\u剪切=删除侧(img,x\u左=190,x\u右=1280)
灰色=cv2.CVT颜色(img\U切割,cv2.COLOR\U BGR2GRAY)
遮罩=后遮罩应用(灰色)
newimage=cv2.按位_或(img,img,mask=mask)
img_模糊=cv2.高斯模糊(新图像,(5,5,0)
gray2=cv2.CVT颜色(img_模糊,cv2.COLOR_BGR2GRAY)
_,binary=cv2.threshold(灰度2,10,255,cv2.THRESH_binary)
final=cv2.按位_或(img,img,mask=binary)
newpath=RESULT_FOLDER+'/'+frame
cv2.imwrite(新路径,最终)
我的灵感来自Stackoverflow或其他网站上发现的许多其他案例(示例:)

不幸的是,结果图片上仍然有很多噪音

作为“背景减法”的初学者,我没有获得最佳解决方案的所有关键。如果有人想以一种更高效、更干净的方式完成这项任务(有没有处理透明物体的特殊方法?能否更有效地消除物体上的噪音?等等),我很感兴趣:)
谢谢你的回答。作为参考,我只是简单地改变了方法,并使用一个带有两个标签(前景、背景)的分割模型(U-Net)来识别背景。很好用。

谢谢你的回答。作为参考,我只是简单地改变了方法,并使用一个带有两个标签(前景、背景)的分割模型(U-Net)来识别背景。它工作得很好。

应用程序中的背景是否已固定?我不认为分割这些物体会很容易;不过,在收购过程中控制一些因素将使这一过程变得相当容易。感谢您的回复。是的,拍照的相机是固定的,背景的传送带总是一样的。亮度可能只有变化。@cam1234我建议使用。这是一个GUI应用程序,您可以在其中拖放/连接图像处理过滤器,然后将代码导出到Python。应用程序中的背景是否固定?我不认为分割这些物体会很容易;不过,在收购过程中控制一些因素将使这一过程变得相当容易。感谢您的回复。是的,拍照的相机是固定的,背景的传送带总是一样的。亮度可能只有变化。@cam1234我建议使用。它是一个GUI应用程序,您可以在其中拖放/连接图像处理过滤器,然后将代码导出到Python。