基于OpenCV python3实现证件照换背景的方法


Posted in Python onMarch 22, 2019

简述

生活中经常要用到各种要求的证件照电子版,红底,蓝底,白底等,大部分情况我们只有其中一种,所以通过技术手段进行合成,用ps处理证件照,由于技术不到位,有瑕疵,所以想用python&openCV通过代码的方式实现背景颜色替换,加强一下对于openCV的学习,锻炼一下编码水平。

软件环境:

python3.5
opencv2
windows 10

图像载入

导入opencv库,使用imread函数读取图片

import cv2
import numpy as np

img=cv2.imread('zjz.jpg')

由于证件照太大,不方便显示,故进行缩放

#缩放
rows,cols,channels = img.shape
img=cv2.resize(img,None,fx=0.5,fy=0.5)
rows,cols,channels = img.shape
cv2.imshow('img',img)

原图如下

基于OpenCV python3实现证件照换背景的方法
(图片源于网络,已经马赛克处理,如有侵权,私信立即删除)

获取背景区域

首先将读取的图像默认BGR格式转换为HSV格式,然后通过inRange函数获取背景的mask。
HSV颜色范围参数可调节根据这篇文章

hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
lower_blue=np.array([78,43,46])
upper_blue=np.array([110,255,255])
mask = cv2.inRange(hsv, lower_blue, upper_blue)
cv2.imshow('Mask', mask)

获得的mask如下图

基于OpenCV python3实现证件照换背景的方法 

如图所示蓝色的背景在图中用白色表示,白色区域就是要替换的部分,但是黑色区域内有白点干扰,所以进一步优化。
腐蚀和膨胀

#腐蚀膨胀
erode=cv2.erode(mask,None,iterations=1)
cv2.imshow('erode',erode)
dilate=cv2.dilate(erode,None,iterations=1)
cv2.imshow('dilate',dilate)

经过腐蚀和膨胀操作后如下图

基于OpenCV python3实现证件照换背景的方法 

处理后图像单独白色点消失。

替换背景色

遍历全部像素点,如果该颜色为dilate里面为白色(255)则说明该点所在背景区域,于是在原图img中进行颜色替换。

#遍历替换
for i in range(rows):
 for j in range(cols):
  if dilate[i,j]==255:
   img[i,j]=(0,0,255)#此处替换颜色,为BGR通道
cv2.imshow('res',img)

最终结果如下

基于OpenCV python3实现证件照换背景的方法
(图片源于网络,已经马赛克处理,如有侵权,私信立即删除)

总结

最开始想直接通过遍历全图进行替换背景色,但是图像中难免有些像素点和背景色一样,造成了干扰,导致最后结果不尽人意,所以想通过这种方法进行处理。显然最后有明显的ps痕迹。

最后贴上完整代码,不足之处欢迎各位指正!

import cv2
import numpy as np

img=cv2.imread('zjz.jpg')
#缩放
rows,cols,channels = img.shape
img=cv2.resize(img,None,fx=0.5,fy=0.5)
rows,cols,channels = img.shape
cv2.imshow('img',img)

#转换hsv
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
lower_blue=np.array([78,43,46])
upper_blue=np.array([110,255,255])
mask = cv2.inRange(hsv, lower_blue, upper_blue)
cv2.imshow('Mask', mask)

#腐蚀膨胀
erode=cv2.erode(mask,None,iterations=1)
cv2.imshow('erode',erode)
dilate=cv2.dilate(erode,None,iterations=1)
cv2.imshow('dilate',dilate)

#遍历替换
for i in range(rows):
 for j in range(cols):
  if dilate[i,j]==255:
   img[i,j]=(0,0,255)#此处替换颜色,为BGR通道
cv2.imshow('res',img)

cv2.waitKey(0)
cv2.destroyAllWindows()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python避免死锁方法实例分析
Jun 04 Python
浅谈python中scipy.misc.logsumexp函数的运用场景
Jun 23 Python
Python中selenium实现文件上传所有方法整理总结
Apr 01 Python
Python插件virtualenv搭建虚拟环境
Nov 20 Python
python自动发送邮件脚本
Jun 20 Python
python监控文件并且发送告警邮件
Jun 21 Python
Python 字符串与数字输出方法
Jul 16 Python
通过pykafka接收Kafka消息队列的方法
Dec 27 Python
基于pandas中expand的作用详解
Dec 17 Python
Django之form组件自动校验数据实现
Jan 14 Python
python seaborn heatmap可视化相关性矩阵实例
Jun 03 Python
解决python3中os.popen()出错的问题
Nov 19 Python
详解Python给照片换底色(蓝底换红底)
Mar 22 #Python
详解python-图像处理(映射变换)
Mar 22 #Python
python中如何使用分步式进程计算详解
Mar 22 #Python
浅谈Python基础—判断和循环
Mar 22 #Python
浅谈python常用程序算法
Mar 22 #Python
python实现移位加密和解密
Mar 22 #Python
python实现可逆简单的加密算法
Mar 22 #Python
You might like
帖几个PHP的无限分类实现想法~
2007/01/02 PHP
Yii2.0中使用js异步删除示例
2017/03/10 PHP
用正则xmlHttp实现的偷(转)
2007/01/22 Javascript
动态表格Table类的实现
2009/08/26 Javascript
原生js实现shift/ctrl/alt按键的获取
2013/04/08 Javascript
JQuery实现带排序功能的权限选择实例
2015/05/18 Javascript
基于jQuery的ajax方法封装
2016/07/14 Javascript
详解利用 Vue.js 实现前后端分离的RBAC角色权限管理
2017/09/15 Javascript
微信小程序实现鼠标拖动效果示例
2017/12/01 Javascript
vue中如何动态绑定图片,vue中通过data返回图片路径的方法
2018/02/07 Javascript
关于Angularjs中自定义指令一些有价值的细节和技巧小结
2018/04/22 Javascript
Vue实现todolist删除功能
2018/06/26 Javascript
react 国际化的实现代码示例
2018/09/14 Javascript
Vue实现简易翻页效果源码分享
2018/11/08 Javascript
laypage+SpringMVC实现后端分页
2019/07/27 Javascript
解决layui 三级联动下拉框更新时回显的问题
2019/09/03 Javascript
[00:33]2016完美“圣”典风云人物:Sccc宣传片
2016/12/03 DOTA
[08:47]2018国际邀请赛 OG战队举杯时刻
2018/08/29 DOTA
python读取注册表中值的方法
2013/04/08 Python
python生成器generator用法实例分析
2015/06/04 Python
python嵌套函数使用外部函数变量的方法(Python2和Python3)
2016/01/31 Python
python使用itchat库实现微信机器人(好友聊天、群聊天)
2018/01/04 Python
Django model反向关联名称的方法
2018/12/15 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
2019/11/30 Python
Python面向对象封装操作案例详解
2019/12/31 Python
Scrapy框架基本命令与settings.py设置
2020/02/06 Python
详解Python中的编码问题(encoding与decode、str与bytes)
2020/09/30 Python
python 模拟登陆163邮箱
2020/12/15 Python
意大利体育用品网上商城:Nencini Sport
2016/08/18 全球购物
MONNIER Frères英国官网:源自巴黎女士奢侈品配饰电商平台
2018/12/06 全球购物
ORACLE第二个十问
2013/12/14 面试题
自考生自我评价分享
2014/01/18 职场文书
公司联欢晚会主持词
2014/03/22 职场文书
放假通知怎么写
2015/08/18 职场文书
基于python制作简易版学生信息管理系统
2021/04/20 Python
windows10 家庭版下FTP服务器搭建教程
2022/08/05 Servers