如何用python抠图和切换背景

原理:

python的函数库Image是个非常强大的数据库,拥有很多处理图片的功能,像是P图软件一样。当我们想要实现把人P到另一张背景的操作时,我们就需要先把人给扣出来,再粘到背景上。抠图,我们需要先准备好绿色背景的图片。用Image里的convert函数把图片的RGB格式改为RGBA(A就是透明度参数),把偏绿色的像素点的透明度参数A赋值为0(即透明),就可以实现抠图的操作。再用paste函数把两张图片粘在一起即可。

学会这个自己在家也能做红蓝底的大头照啦!

具体操作:

第一步:准备好两张图片

        第一张(要扣的图,必须是绿色背景):

e82aeb9fa9cf45bea77de0be35cc8974.jpeg

        第二张(背景):

e4bb7bb2d16541fe9b2c1d6e7ebeca45.jpeg

第二步:

打开python编辑环境,我用的是Anacondo

第三步:

输入以下代码:

from PIL import Image  #引用PIL里的Image函数
kun=Image.open('kun.jpg') #获取图片'kun.jpg'
background=Image.open('background.jpeg') #获取图片'background.jpg'
kun=kun.convert('RGBA') #把图片格式转化为RGBA
w,h=kun.size  #取出图片大小参数
for x in range(0,w): #遍历图片的每一个像素点
    for y in range(0,h):
        r,g,b,a=kun.getpixel((x,y)) #取出每个像素点的颜色和透明度参数
        if (g+1)/(r+g+b+3)>0.4 and g>60: #如果像素点偏绿色
            a=0  #把像素点的透明度设为0,也就是完全透明
            kun.putpixel((x,y),(r,g,b,a))  #修改图片像素的参数
kun.save('kun.png') #把抠好的图保存为'kun.png'


background.paste(kun,(640,250),mask=kun.split()[3])  #把背景和图片粘贴在一起
background.save('final.jpg')  #保存为最后的图片

代码分两个部分,一个是抠图,一个是把背景和扣好的图粘在一起

抠完图的效果是这样的:

3307bcd2589a43e8b3b4fa8bb251a4c1.png

 注意!保存格式一定要是png,png可以显示透明度,jpg格式是不能显示透明度的。

效果图:

7dbda9385b584551acf5df180edcf453.jpeg

### Python 实现图像抠图的代码示例 #### 使用 `rembg` 库进行简单高效的抠图操作 为了简化抠图过程,可以利用专门用于移除图片背景的库——`rembg`。此方法仅需少量代码即可完成高质量的人像或其他物体的抠图工作[^2]。 ```python from rembg import remove from PIL import Image input_path = 'input_image.jpg' output_path = 'output_image.png' # 打开输入图片文件 input_img = Image.open(input_path) # 移除背景并获取处理后的图像数据 output_img = remove(input_img) # 将结果保存为PNG格式以保留透明度信息 output_img.save(output_path) ``` 这段脚本展示了如何加载一张照片、执行背景删除以及存储最终成果至指定路径下作为带有Alpha通道的新文件。 #### 利用 COCO 数据集中的分割掩码手动调整特定区域 当面对更复杂的需求时,比如只针对某些类别做精细控制,则可以从预训练模型得到的对象检测与实例分割结果出发,在此基础上进一步定制化修改[^3]: ```python import cv2 import numpy as np from copy import deepcopy img_raw = cv2.imread('image_with_objects.jpg') coco_80_dict = ... # 加载COCO标注字典结构 img_segmentation = deepcopy(img_raw) img_segmentation_data = coco_80_dict['bench']['segmentation'][0] for h_i in range(img_h): for w_i in range(img_w): if not img_segmentation_data[h_i, w_i]: img_segmentation[h_i, w_i] = [255, 255, 255] cv2.imwrite('demo_result_segmentation.jpg', img_segmentation) ``` 上述例子中,通过遍历每一个像素点并与给定的目标物(此处假设为目标“板凳”)对应的布尔型掩膜对比,实现了对该类别的精准替或隐藏效果。 #### 更证件照背景颜色的方法 对于需要频繁变更背景色的应用场景而言,采用基于阈值的颜色空间转配合形态学运算能够有效分离前景主体同其所在环境,并轻松切换成任意所需底色[^4]: ```python import cv2 import numpy as np def change_bg_color(image_path, new_bg=(255, 0, 0)): image = cv2.imread(image_path) hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) lower_blue = np.array([90, 70, 70]) upper_blue = np.array([126, 255, 255]) mask = cv2.inRange(hsv, lower_blue, upper_blue) kernel = np.ones((5, 5), np.uint8) mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) result = image.copy() result[mask != 0] = list(new_bg)[::-1] return result changed_bg_photo = change_bg_color('id_card_photo.jpg', (255, 255, 255)) cv2.imshow('Changed Background Photo', changed_bg_photo) cv2.waitKey(0); cv2.destroyAllWindows(); ``` 该函数接收原图路径及新背景RGB三元组参数,默认情况下会将蓝色背景成白色;当然也可以根据实际情况灵活设置其他色彩组合来满足不同场合下的需求。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值