码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【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()#销毁所有窗口,回收资源
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    总结

    大家喜欢的话,给个👍,点个关注!给大家分享更多有趣好玩的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 浏览器头爬虫模拟用户(保姆级图文+实现代码)】
    【更多内容敬请期待】


  • 相关阅读:
    Golang仿ps获取Linux进程信息
    leetcode_2909元素和最小的山形三元组
    Pandas - 数据转换
    python3,设置只读属性
    有一个不错的解决module xxx has no attribute的思路
    SpringBoot实战案例:图书管理系统
    2024一定要看的文章系列!!!接口自动化测试框架思路和实战(5):【推荐】混合测试自动化框架(关键字+数据驱动)
    电力系统直流潮流分析【N-1】(Matlab代码实现)
    线上服务异常的定位、处理与优化的探索 - 第三章 Java虚拟机
    基于Vue+SpringBoot的大病保险管理系统 开源项目
  • 原文地址:https://blog.csdn.net/u011027547/article/details/126499716
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号