基于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标准库之多进程(multiprocessing包)介绍
Nov 25 Python
详解Python中的元组与逻辑运算符
Oct 13 Python
python字符串中的单双引
Feb 16 Python
pip install urllib2不能安装的解决方法
Jun 12 Python
基于Python pip用国内镜像下载的方法
Jun 12 Python
在python中获取div的文本内容并和想定结果进行对比详解
Jan 02 Python
python中的Elasticsearch操作汇总
Oct 30 Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
Jul 13 Python
python实现数字炸弹游戏程序
Jul 17 Python
Python Matplotlib绘图基础知识代码解析
Aug 31 Python
pycharm 代码自动补全的实现方法(图文)
Sep 18 Python
pandas:get_dummies()与pd.factorize()的用法及区别说明
May 21 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读取文本文件并逐行输出该行使用最多的字符与对应次数的方法
2016/11/25 PHP
PHP 中魔术常量的实例详解
2017/10/26 PHP
PHP实现图片防盗链破解操作示例【解决图片防盗链问题/反向代理】
2020/05/29 PHP
css值转换成数值请抛弃parseInt
2011/10/24 Javascript
jquery创建一个ajax关键词数据搜索实现思路
2013/02/26 Javascript
Jquery submit()无法提交问题
2013/04/21 Javascript
jquery实现textarea输入字符控制(仿微博输入控制字符)
2013/04/26 Javascript
js判断设备是否为PC并调整图片大小
2014/02/12 Javascript
通过正则表达式实现表单验证是否为中文
2014/02/18 Javascript
javascript的BOM
2016/05/03 Javascript
浅谈js和css内联外联注意事项
2016/06/30 Javascript
javaScript给元素添加多个class的简单实现
2016/07/20 Javascript
Zabbix添加Node.js监控的方法
2016/10/20 Javascript
jQuery实现花式轮播之圣诞节礼物传送效果
2016/12/25 Javascript
Vue组件化开发思考
2018/02/02 Javascript
el-input 标签中密码的显示和隐藏功能的实例代码
2019/07/19 Javascript
基于Vue+ElementUI的省市区地址选择通用组件
2019/11/20 Javascript
js实现带搜索功能的下拉框
2020/01/11 Javascript
JS异步宏队列微队列原理详解
2020/09/09 Javascript
[01:01:35]Optic vs paiN 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python中迭代器(iterator)用法实例分析
2015/04/29 Python
python executemany的使用及注意事项
2017/03/13 Python
Python 判断是否为质数或素数的实例
2017/10/30 Python
python读取与写入csv格式文件的示例代码
2017/12/16 Python
selenium3+python3环境搭建教程图解
2018/12/07 Python
33个Python爬虫项目实战(推荐)
2019/07/08 Python
Python队列、进程间通信、线程案例
2019/10/25 Python
jupyter notebook 增加kernel教程
2020/04/10 Python
哈工大自然语言处理工具箱之ltp在windows10下的安装使用教程
2020/05/07 Python
python网络编程之五子棋游戏
2020/05/14 Python
Python的轻量级ORM框架peewee使用教程
2021/02/05 Python
餐饮主管岗位职责
2013/12/10 职场文书
民事诉讼授权委托书范文
2014/08/02 职场文书
2014年政务公开工作总结
2014/12/09 职场文书
2015年感恩节活动总结
2015/03/24 职场文书
欠条格式范本
2015/07/03 职场文书