Python 使用OpenCV删除背景

Python 使用OpenCV删除背景,python,opencv,background-subtraction,Python,Opencv,Background Subtraction,我需要一点帮助:) 我正在尝试删除我拍摄的图像的背景 图中显示了一块穿过机器的木头: 现在我想移除背景,这样只有一块木头可见,它应该是这样的: 我试着用颜色检测、抓取切割和边缘检测来实现这一点。我能够去掉一点背景,但我并没有得到好的结果。我希望能够使用这个小程序来处理我将来拍摄的所有图像 其他信息: 图像的照明条件可能总是有点不同 木材的宽度总是略有不同。这意味着我不能对它应用“坐标系” 木材的颜色有时会稍微浅一点或深一点。这使得我很难仅仅应用颜色检测 下面是我尝试的颜色检测,例如: fro

我需要一点帮助:)

我正在尝试删除我拍摄的图像的背景

图中显示了一块穿过机器的木头:

现在我想移除背景,这样只有一块木头可见,它应该是这样的:

我试着用颜色检测、抓取切割和边缘检测来实现这一点。我能够去掉一点背景,但我并没有得到好的结果。我希望能够使用这个小程序来处理我将来拍摄的所有图像

其他信息:

  • 图像的照明条件可能总是有点不同
  • 木材的宽度总是略有不同。这意味着我不能对它应用“坐标系”
  • 木材的颜色有时会稍微浅一点或深一点。这使得我很难仅仅应用颜色检测
  • 下面是我尝试的颜色检测,例如:

    from PIL import ImageGrab
    from win32 import win32gui
    import cv2
    import numpy as np
    
    
    while True:
        frame = cv2.imread('Wood.png')
    
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    
        lower_blue = np.array([0, 0, 110])
        upper_blue = np.array([120, 255, 255])
        mask = cv2.inRange(hsv, lower_blue, upper_blue)
        result = cv2.bitwise_and(frame, frame, mask=mask)
    
        cv2.imshow("Result", result)
        key = cv2.waitKey(1)
    
        if key == 27:
            break
    
    cap.release()
    cv2.destroyAllWindows()
    
    有什么想法吗


    提前谢谢。

    从计算机视觉的角度来看,这可能很困难,因为背景颜色几乎相同。你可以试着研究边缘检测,这样做。你可以访问没有木头的背景图像吗?是的,我可以访问没有木头的背景图像。不过,每幅图像的照明条件可能略有不同。你可以利用这样一个事实:你有原始背景,而你的相机看起来是静态的。你可以通过使用高斯混合模型(GMM)来解释像素级的细微运动和闪电变化所产生的噪声。这是最流行的背景减法算法之一。您可以更进一步,实现一个像素分类器,在各种闪电条件下从关键帧中采样像素,并生成概率分布,以找到光噪声之间的关系,背景模型和前景对象。查看OpenCV的GMM。从计算机视觉的角度来看,这可能很困难,因为背景几乎是相同的颜色。你可以试着研究边缘检测,这样做。你可以访问没有木头的背景图像吗?是的,我可以访问没有木头的背景图像。不过,每幅图像的照明条件可能略有不同。你可以利用这样一个事实:你有原始背景,而你的相机看起来是静态的。你可以通过使用高斯混合模型(GMM)来解释像素级的细微运动和闪电变化所产生的噪声。这是最流行的背景减法算法之一。你可以更进一步,实现一个像素分类器,在各种闪电条件下从关键帧采样像素,并生成概率分布,以找到光噪声、背景模型和前景对象之间的关系。