如何用Python去除图像背景

13

我有一个包含全身人物图像的数据集,我想去掉这些图像中的所有背景,只留下完整的人物图像。

我的问题是:

是否有 Python 代码可以做到这一点?

我需要每次指定人物对象的坐标吗?

enter image description here


1
这个回答解决了你的问题吗?OpenCV去除背景 - zteffi
2个回答

39

这是使用Python/OpenCV的一种方法。

  • 读取输入
  • 转为灰度图像
  • 阈值处理并反转为掩膜
  • 可选地应用形态学操作清除任何多余斑点
  • 对边缘进行抗锯齿处理
  • 将输入的副本转换为BGRA,并将掩膜插入为α通道
  • 保存结果

输入:

enter image description here

import cv2
import numpy as np

# load image
img = cv2.imread('person.png')

# convert to graky
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# threshold input image as mask
mask = cv2.threshold(gray, 250, 255, cv2.THRESH_BINARY)[1]

# negate mask
mask = 255 - mask

# apply morphology to remove isolated extraneous noise
# use borderconstant of black since foreground touches the edges
kernel = np.ones((3,3), np.uint8)
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)

# anti-alias the mask -- blur then stretch
# blur alpha channel
mask = cv2.GaussianBlur(mask, (0,0), sigmaX=2, sigmaY=2, borderType = cv2.BORDER_DEFAULT)

# linear stretch so that 127.5 goes to 0, but 255 stays 255
mask = (2*(mask.astype(np.float32))-255.0).clip(0,255).astype(np.uint8)

# put mask into alpha channel
result = img.copy()
result = cv2.cvtColor(result, cv2.COLOR_BGR2BGRA)
result[:, :, 3] = mask

# save resulting masked image
cv2.imwrite('person_transp_bckgrnd.png', result)

# display result, though it won't show transparency
cv2.imshow("INPUT", img)
cv2.imshow("GRAY", gray)
cv2.imshow("MASK", mask)
cv2.imshow("RESULT", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

透明结果:

enter image description here


你好FMW42,这里有人问了一个与我的问题非常相似的问题。你能看一下这个链接吗:https://stackoverflow.com/q/66309487/4070307 - Govinda Raju
该链接的背景更加一致(没有纹理),没有阴影,前景和背景之间的对比度更高,因此更容易分离。 - fmw42
请提供什么图片?使用我上面的代码。 - fmw42
那张图片很难通过我上面的方法进行处理,因为背景与白色T恤颜色太相似了。需要使用人工智能/深度学习,例如在http://remove.bg中去除背景。 - fmw42
1
有一个开源库可以利用人工智能从图像中删除人物和物体的背景:rembg。您可以在您的项目中使用它。@Parseval - Logan Price
显示剩余7条评论

-2

这段代码对我来说效果更好:

from rembg import remove
from PIL import Image
import easygui as eg
input_path = eg.fileopenbox(title='Select image file')
output_path = eg.filesavebox(title='Save file to..')
input = Image.open(input_path)
output = remove(input)
output.save(output_path)

请添加以下要求:
pip install rembg
pip install easygui

如何去除图像背景

速度有点慢但相当有效。

输入图像: 在此输入图像描述

去除背景后的结果图像:

enter image description here

敬礼, 阿里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接