基于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使用matplotlib绘图时图例显示问题的解决
Apr 27 Python
python实现二叉树的遍历
Dec 11 Python
python 限制函数调用次数的实例讲解
Apr 21 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
Dec 15 Python
十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)
Apr 26 Python
华为2019校招笔试题之处理字符串(python版)
Jun 25 Python
Python中实现输入超时及如何通过变量获取变量名
Jan 18 Python
numpy的Fancy Indexing和array比较详解
Jun 11 Python
Python3.8安装Pygame教程步骤详解
Aug 14 Python
Anaconda详细安装步骤图文教程
Nov 12 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
Nov 20 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
Jan 26 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开启安全模式后禁用的函数集合
2011/06/26 PHP
phpcms模块开发之swfupload的使用介绍
2013/04/28 PHP
解析php中的escape函数
2013/06/29 PHP
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
2014/05/15 PHP
php中json_encode处理gbk与gb2312中文乱码问题的解决方法
2014/07/10 PHP
学习php中的正则表达式
2014/08/17 PHP
PHP数组内存利用率低和弱类型详细解读
2017/08/10 PHP
网页自动刷新,不产生嗒嗒声的一个解决方法
2007/03/27 Javascript
Javascript isArray 数组类型检测函数
2009/10/08 Javascript
innerText 使用示例
2014/01/23 Javascript
JS实现鼠标箭头变成一个燃烧烛光效果的方法
2015/02/28 Javascript
用Move.js配合创建CSS3动画的入门指引
2015/07/22 Javascript
js实现无限级树形导航列表效果代码
2015/09/23 Javascript
JavaScript中判断数据类型的方法总结
2016/05/24 Javascript
js 声明数组和向数组中添加对象变量的简单实例
2016/07/28 Javascript
JS数字千分位格式化实现方法总结
2016/12/16 Javascript
js仿QQ邮箱收件人选择与搜索功能
2017/02/10 Javascript
浅谈vue,angular,react数据双向绑定原理分析
2017/11/28 Javascript
JavaScript对象的浅拷贝与深拷贝实例分析
2018/07/25 Javascript
在Layui中实现开关按钮的效果实例
2019/09/29 Javascript
这15个Vue指令,让你的项目开发爽到爆
2019/10/11 Javascript
[01:26]神话结束了,却也刚刚开始——DOTA2新英雄玛尔斯驾临战场
2019/03/10 DOTA
[01:03:36]DOTA2-DPC中国联赛 正赛 VG vs Magma BO3 第二场 1月26日
2021/03/11 DOTA
python3+PyQt5实现支持多线程的页面索引器应用程序
2018/04/20 Python
Python拼接字符串的7种方式详解
2020/03/19 Python
Python 利用flask搭建一个共享服务器的步骤
2020/12/05 Python
CSS3实现多重边框的方法总结
2016/05/31 HTML / CSS
如何利用input事件来监听移动端的输入
2016/04/15 HTML / CSS
贪睡宠物用品:Snoozer Pet Products
2020/02/04 全球购物
外语专业毕业生自我评价分享
2013/10/05 职场文书
公司离职证明样本
2014/09/13 职场文书
贫困证明模板(3篇)
2014/09/16 职场文书
2014大四本科生自我鉴定总结
2014/10/04 职场文书
先进个人主要事迹怎么写
2015/11/04 职场文书
会计继续教育培训心得体会
2016/01/19 职场文书
React如何创建组件
2021/06/27 Javascript