首页 > 解决方案 > 使用 Python 的图像前景提取技术

问题描述

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

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

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

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

在此处输入图像描述

标签: pythonopencvimage-segmentationbackground-foregroundimage-thresholding

解决方案


你可以得到这个结果:

在此处输入图像描述

使用精明的边缘检测器,膨胀和腐蚀:

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)

功能说明process

  1. 首先,将图像转换为灰度,以便在其上使用 canny 边缘检测器。然后,使用 canny 边缘检测器检测其边缘:
def process(img):
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    img_canny = cv2.Canny(img_gray, 12, 54)
  1. 定义一个用于扩张和腐蚀图像的内核:
    kernel = np.ones((3, 3))
  1. 最后,对图像进行多次迭代以填充间隙、去除噪声并平滑边缘中的凹凸。当然,膨胀会使边缘变厚,所以在那之后,侵蚀图像以将它们缩小。但是由于在膨胀之前边缘有很多间隙,因此通过较少的迭代来侵蚀图像。返回侵蚀的图像:
    img_dilate = cv2.dilate(img_canny, kernel, iterations=10)
    img_erode = cv2.erode(img_dilate, kernel, iterations=8)
    return img_erode

推荐阅读