基于Python的图像前景提取技术

基于Python的图像前景提取技术,python,opencv,image-segmentation,background-foreground,image-thresholding,Python,Opencv,Image Segmentation,Background Foreground,Image Thresholding,我已经用python编写了一段代码,使用OpenCV提取图像中的前景。我的程序正在获取图像流,我需要从这些图像中提取对象 这些图片包括鞋子、包或衣服等产品。大多数图像都有白色背景,但有时我也会有灰色渐变背景。我已经使用阈值来分离前景和背景,并提取对象 但问题是,即使我假设背景为白色,并设置了固定的上限和下限阈值,我有时也会在对象中获得白色,而阈值并不能呈现正确的输出 我想知道在计算机视觉中有哪些好的方法可以用来获得最好的结果 您可以得到以下结果: 使用canny边缘检测器,膨胀和侵蚀: imp

我已经用python编写了一段代码,使用OpenCV提取图像中的前景。我的程序正在获取图像流,我需要从这些图像中提取对象

这些图片包括鞋子、包或衣服等产品。大多数图像都有白色背景,但有时我也会有灰色渐变背景。我已经使用阈值来分离前景和背景,并提取对象

但问题是,即使我假设背景为白色,并设置了固定的上限和下限阈值,我有时也会在对象中获得白色,而阈值并不能呈现正确的输出

我想知道在计算机视觉中有哪些好的方法可以用来获得最好的结果


您可以得到以下结果:

使用canny边缘检测器,膨胀和侵蚀:

import cv2
import numpy as np

def process(img):
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    img_canny = cv2.Canny(img_gray, 12, 54)
    kernel = np.ones((3, 3))
    img_dilate = cv2.dilate(img_canny, kernel, iterations=10)
    img_erode = cv2.erode(img_dilate, kernel, iterations=8)
    return img_erode

img = cv2.imread("robe.jpg")
contours, _ = cv2.findContours(process(img), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
cv2.drawContours(img, contours, -1, (0, 255, 0), 2)
cv2.imshow("Image", img)
cv2.waitKey(0)
过程的说明
功能:

  • 首先,将图像转换为灰度,以便在其上使用canny边缘检测器。然后,使用canny边缘检测器检测其边缘:
  • 定义用于扩展和侵蚀图像的内核:
  • 最后,将图像放大几次,以填充间隙、消除噪声并平滑边缘中的凹凸。当然,膨胀会使边缘变厚,因此在这之后,会侵蚀图像,使其收缩。但是,由于在膨胀之前边缘有很多间隙,因此通过较少的迭代来腐蚀图像。返回被侵蚀的图像:

  • 你能发布到目前为止的代码吗?你需要人工智能/深度学习才能做到这一点。例如,@fmw42我想到了相同的解决方案。是否有一些数据集可用于此测试用例?@Ubaid。我不知道,只是搜索了一下,找到了。它使用COCO数据集。我也尝试过它和其他一些边缘检测器,但边缘检测器的问题是我们只得到外部轮廓,这是一个相当简单的图像,其中没有需要检测的内部轮廓。比如说,如果这张图片中有一个手提包,而包带内有一些背景,我们就不会使用边缘检测器得到它。如果我们也包括内部轮廓,我们肯定会得到很多不需要的轮廓,在这样做的同时,我们也可能会失去物体的一些部分。
    def process(img):
        img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        img_canny = cv2.Canny(img_gray, 12, 54)
    
        kernel = np.ones((3, 3))
    
        img_dilate = cv2.dilate(img_canny, kernel, iterations=10)
        img_erode = cv2.erode(img_dilate, kernel, iterations=8)
        return img_erode