【Python黑科技】cv2库实现证件照抠图替换背景(注释比代码多)


欢迎关注 『Python黑科技』 系列,持续更新中
欢迎关注 『Python黑科技』 系列,持续更新中

实现效果

因为一些细节以及我本身选择的图片不是很好,有一些杂色,效果不是很好,大家可以试试自己的图片。

在这里插入图片描述


图片素材和源码

已经上传至我的gitee仓库
python黑科技
在这里插入图片描述


实现思路

  • 图片预处理(导入、缩放、二值化黑白化)
  • 获取原图的背景区域(类比为ps的魔棒工具)
  • 修缮杂色(类似锐化?我ps用的不多,反正就是把边缘交界部分的杂色去除)
  • 遍历替换(把证件照提取的人像放到背景图上,这一部分尤其注意选择放置的center中心点,不要选择错误的中心点导致报越界错误)

实现代码

核心方法解读

缩放图片函数cv2.resize解读
InputArray src :img_back 输入待改变大小的原图像
OutputArray dst:None 输出,改变后的图像。这个图像和原图像具有相同的内容,只是大小和原图像不一样而已;
dsize:输出图像的大小,我这里没有使用这个固定大小的参数,而是启动了下面的比例缩放,你也可以填写具体的缩放大小(500,500)
fx:width方向的缩放比例
fy:height方向的缩放比例

图片二值化(黑白化)函数cv2.inRange解读
RGB 白色 0,0,0 黑色 255,255,255
取色对照网站推荐 https://www.fontke.com/tool/rgb/6effff/
第一个参数:hsv指的是原图
第二个参数:lower_red指的是图像中低于这个lower_red的值,图像值变为0,RGB格式
第三个参数:upper_red指的是图像中高于这个upper_red的值,图像值变为0,RGB格式

des = cv2.erode(src, kernel[, anchor[, iterations[, borderType[, borderValue]]]] )
src 被腐蚀的原始图像
kernel 代表腐蚀操作时所采用的结构类型。
anchor 代表element结构中锚点的位置,默认为(-1,-1),在核的中心位置。
iterations 是腐蚀操作的迭代的次数,默认为1
borderType 代表边界样式

import cv2
import  numpy as np

#1.导入本地图片,注意图片的选择,一定要保证在图片缩放处理后,背景图片center点的确定(谨防越界)证件照图片,否则会报错
img=cv2.imread('zjz.png')#要被抠图的证件照
img_back=cv2.imread('back.png')#要替换的背景图片

#2.缩放变换处理图片
#缩放图片函数cv2.resize解读
#InputArray src :img_back 输入待改变大小的原图像
#OutputArray dst:None 输出,改变后的图像。这个图像和原图像具有相同的内容,只是大小和原图像不一样而已;
#dsize:输出图像的大小,我这里没有使用这个固定大小的参数,而是启动了下面的比例缩放,你也可以填写具体的缩放大小(500,500)
#fx:width方向的缩放比例
#fy:height方向的缩放比例

#处理背景图片
rows, cols, channels = img_back.shape#获得图片的形状,rows, cols, channels代表行,列像素点数量和通道数
img_back = cv2.resize(img_back, None, fx=0.7, fy=0.7)
cv2.imshow('back', img_back)#展示缩放后的背景图片
#处理证件照图片
rows, cols, channels = img.shape
img = cv2.resize(img, None, fx=0.4, fy=0.4)
cv2.imshow('zjz', img)
rows, cols, channels = img.shape  # rows,cols最后一定要是前景图片的,后面遍历图片需要用到


#3.图片黑白化二值化,获取背景图片区域
#白色 0,0,0  黑色 255,255,255
#图片二值化(黑白化)函数cv2.inRange解读
# 取色对照网站推荐 https://www.fontke.com/tool/rgb/6effff/
# 第一个参数:hsv指的是原图
# 第二个参数:lower_red指的是图像中低于这个lower_red的值,图像值变为0
# 第三个参数:upper_red指的是图像中高于这个upper_red的值,图像值变为0
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)#图片颜色模式rgb转换为hsv
# 证件照黑白化mask
lower_blue = np.array([59,29,1])#证件照中低于改值的像素点颜色置为0,如果显示证件照不全,说明这个值要调低
upper_blue = np.array([190, 255, 255])#证件照中高于改值的像素点颜色置为0,如果显示了不该显示的证件照背景杂色,说明这个值要调高
mask = cv2.inRange(hsv, lower_blue, upper_blue)#把范围的像素点颜色变成黑色(人物区域变成黑色),在范围外的像素点颜色变成白色(背景图区域变成白色)
cv2.imshow('mask', mask)#展示黑白化后的证件照

#4.腐蚀膨胀 dilate 消除杂色(但是我这边消除了个寂寞····因为本来背景就有一大块白色····)
#侵蚀了前景物体的边界(始终尝试使前景保持白色)。在二进制图像上执行,简单说是把物体边缘的部分消去杂色
#des = cv2.erode(src, kernel[, anchor[, iterations[, borderType[, borderValue]]]] )
# src 被腐蚀的原始图像
# kernel 代表腐蚀操作时所采用的结构类型。
# anchor 代表element结构中锚点的位置,默认为(-1,-1),在核的中心位置。
# iterations 是腐蚀操作的迭代的次数,默认为1
# borderType 代表边界样式
erode = cv2.erode(mask, None, iterations=1)
cv2.imshow('erode', erode)
dilate = cv2.dilate(erode, None, iterations=1)
cv2.imshow('dilate', dilate)

#5.遍历替换
center = [60,60]  # 自定义固定在新背景图片中的位置,center点的确定(谨防越界)
for i in range(rows):
    for j in range(cols):
        if dilate[i, j] == 0:  # 0代表黑色的点
            img_back[center[0] + i, center[1] + j] = img[i, j]  # 此处替换颜色,为BGR通道
cv2.imshow('result', img_back)#展示替换背景后最终效果的图片

cv2.waitKey(0)#窗口停滞,不加这一行窗口会一闪而逝看不到效果,给imshow提供时间展示图像,所以只有一个空窗口一闪而过。添加了waitkey后,哪怕仅仅是cv2.waitkey(1),我们也能截取到一帧的图像。所以cv2.imshow后边是必须要跟cv2.waitkey的。
cv2.destroyAllWindows()#销毁所有窗口,回收资源

总结

大家喜欢的话,给个👍,点个关注!给大家分享更多有趣好玩的Python黑科技!

版权声明:

发现你走远了@mzh原创作品,转载必须标注原文链接

Copyright 2022 mzh

Crated:2022-2-1

欢迎关注 『Python黑科技』 系列,持续更新中
欢迎关注 『Python黑科技』 系列,持续更新中
【Python黑科技】tkinter库实战7个小项目合集(保姆级图文+实现代码)
【Python黑科技】tkinter库实战制作一个计算器(保姆级图文+实现代码)
【Python黑科技】tkinter库实战制作一个记事本(保姆级图文+实现代码)
【Python黑科技】tkinter库实战用户的注册和登录(保姆级图文+实现代码)
【Python黑科技】tkinter库实战“2048”小游戏(保姆级图文+实现代码)
【Python黑科技】tkinter库实战“俄罗斯方块”小游戏(保姆级图文+实现代码)
【Python黑科技】tkinter库实战“贪吃蛇”小游戏(保姆级图文+实现代码)
【Python黑科技】tkinter库实战“连连看”小游戏(保姆级图文+实现代码)

【Python安装第三方库一行命令永久提高速度】
【使用PyInstaller打包exe】
【免登陆爬虫一键下载知乎文章图片(保姆级图文+实现代码)】
【孤独的程序员和AI机器人朋友聊天解闷(免费接口+保姆级图文+实现代码注释)】
【几行代码绘制gif动图(保姆级图文+实现代码)】
【几行代码实现网课定时循环截屏,保存重要知识点(保姆级图文+实现代码)】
【常用的user_agent 浏览器头爬虫模拟用户(保姆级图文+实现代码)】
【更多内容敬请期待】


  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发现你走远了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值