You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何去除合成图像中Minion残留的绿色背景?(附Python代码)

如何去除抠图后残留的绿色背景并完成图像合成?

我有两张图片——带绿色背景的小黄人图、猫咪图。想要把小黄人从背景中提取出来,合成到猫咪图前景,写了如下Python代码,但目前无法彻底去除小黄人后方残留的绿色背景,调整first = minion[n][n]里的n值也没用,求指导。

minion = Image.open('g.jpg')
newsize = (900, 800)

minion = np.array(minion.resize(newsize))
h = mpimg.imread('h.jpg')

minion=np.array(minion)

first=minion[1][1]
s=minion.shape

i=Image.open("h.jpg")
i =np.array( i.convert('RGB'))

a=i.shape[0]-minion.shape[0]
b=i.shape[1]//2.2
b = int(b)

for x in range(len(minion)):
  for y in range(len(minion[0])):
    if  np.all(minion[x][y]==first):
      continue

    i[a+x][b+y]=minion[x][y]


mpimg.imsave('i.jpg', i)

合成后图像:
合成后图像

原始猫咪图:
猫咪图

原始小黄人图:
Minion图


问题根源

你当前用单一像素颜色判断背景的逻辑有缺陷:实际图像里的绿色背景会有颜色渐变、噪点,还有边缘抗锯齿带来的半透明绿色像素,单一颜色匹配根本覆盖不全,自然会残留绿色。

改进方案

方案1:基于颜色范围过滤背景

不用单一颜色,给绿色设定一个RGB区间,只要像素落在这个区间内就判定为背景:

from PIL import Image
import numpy as np
import matplotlib.image as mpimg

# 读取并缩放小黄人图
minion = Image.open('g.jpg')
newsize = (900, 800)
minion = np.array(minion.resize(newsize).convert('RGB'))

# 读取猫咪图
cat = np.array(Image.open("h.jpg").convert('RGB'))

# 计算合成位置
offset_y = cat.shape[0] - minion.shape[0]
offset_x = int(cat.shape[1] // 2.2)

# 定义绿色背景的RGB范围(根据你的图像微调)
lower_green = np.array([0, 140, 0])
upper_green = np.array([100, 255, 100])

# 生成掩码:非绿色区域保留,绿色区域跳过
mask = ~((minion >= lower_green) & (minion <= upper_green)).all(axis=2)

# 合成图像
cat[offset_y:offset_y+minion.shape[0], offset_x:offset_x+minion.shape[1]][mask] = minion[mask]

# 保存结果
mpimg.imsave('i.jpg', cat)

方案2:用Alpha通道实现精准抠图

通过给小黄人图添加透明通道,直接过滤绿色背景,合成时自动忽略透明部分:

from PIL import Image

# 读取并缩放图像
minion = Image.open('g.jpg').resize((900, 800))
cat = Image.open('h.jpg').convert('RGBA')

# 生成Alpha掩码:把绿色背景设为透明
new_data = []
for r, g, b in minion.getdata():
    # 判断是否为绿色(可根据实际颜色调整阈值)
    if g > 140 and r < 100 and b < 100:
        new_data.append((r, g, b, 0))  # 透明
    else:
        new_data.append((r, g, b, 255))  # 不透明

minion_alpha = Image.new('RGBA', minion.size)
minion_alpha.putdata(new_data)

# 计算合成位置
offset_y = cat.height - minion_alpha.height
offset_x = int(cat.width // 2.2)

# 合成图像(利用Alpha通道做遮罩)
cat.paste(minion_alpha, (offset_x, offset_y), minion_alpha)
cat.convert('RGB').save('i.jpg')

额外提示

  • 绿色阈值要根据你的原图微调:可以用取色工具查看背景绿色的RGB值,再上下浮动10-20来设定范围
  • 如果边缘还有轻微残留,可以给掩码做高斯模糊(用OpenCV的cv2.GaussianBlur),让边缘过渡更自然

内容的提问来源于stack exchange,提问作者Mohammad Haris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 00:06:27