基于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中的身份运算符的使用方法
Oct 13 Python
python爬取51job中hr的邮箱
May 14 Python
快速实现基于Python的微信聊天机器人示例代码
Mar 03 Python
Python爬虫DNS解析缓存方法实例分析
Jun 02 Python
python时间日期函数与利用pandas进行时间序列处理详解
Mar 13 Python
PyQt5每天必学之像素图控件QPixmap
Apr 19 Python
python 解压pkl文件的方法
Oct 25 Python
python定时任务 sched模块用法实例
Nov 04 Python
Python可变对象与不可变对象原理解析
Feb 25 Python
opencv python在视屏上截图功能的实现
Mar 05 Python
PyQt5 控件字体样式等设置的实现
May 13 Python
详解Python中openpyxl模块基本用法
Feb 23 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
晋城吧对DiscuzX进行的前端优化要点
2010/09/05 PHP
PHP使用适合阅读的格式显示文件大小的方法
2015/03/05 PHP
wamp服务器访问php非常缓慢的解决过程
2015/07/01 PHP
thinkPHP框架可添加js事件的分页类customPage.class.php完整实例
2017/03/16 PHP
How to Auto Include a Javascript File
2007/02/02 Javascript
JQuery 选项卡效果(JS与HTML的分离)
2010/04/01 Javascript
javascript中substr,substring,slice.splice的区别说明
2010/11/25 Javascript
div当滚动到页面顶部的时候固定在顶部实例代码
2013/05/27 Javascript
实现前后端数据交互方法汇总
2015/04/07 Javascript
jQuery中$.extend()用法实例
2015/06/24 Javascript
jQuery带进度条全屏图片轮播特效代码分享
2020/06/28 Javascript
简单学习JavaScript中的for语句循环结构
2015/11/10 Javascript
JavaScript转换与解析JSON方法实例详解
2015/11/24 Javascript
深入剖析JavaScript面向对象编程
2016/07/12 Javascript
如何利用模板将HTML从JavaScript中抽离
2016/10/08 Javascript
纯 JS 实现放大缩小拖拽功能(完整代码)
2019/11/25 Javascript
vue组件中实现嵌套子组件案例
2020/08/31 Javascript
解决vuex改变了state的值,但是页面没有更新的问题
2020/11/12 Javascript
python中使用smtplib和email模块发送邮件实例
2014/04/22 Python
Python中optparse模块使用浅析
2015/01/01 Python
Python3中的列表,元组,字典,字符串相关知识小结
2017/11/10 Python
解决python3中解压zip文件是文件名乱码的问题
2018/03/22 Python
Python2.7版os.path.isdir中文路径返回false的解决方法
2019/06/21 Python
提升Python效率之使用循环机制代替递归函数
2019/07/23 Python
python conda操作方法
2019/09/11 Python
python生成器推导式用法简单示例
2019/10/08 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
2019/10/24 Python
pycharm解决关闭flask后依旧可以访问服务的问题
2020/04/03 Python
快速解决pymongo操作mongodb的时区问题
2020/12/05 Python
求职信范文英文版
2014/01/05 职场文书
关键在于落实心得体会
2014/09/03 职场文书
革命英雄事迹演讲稿
2014/09/13 职场文书
夫妻吵架保证书
2015/05/08 职场文书
教师节领导致辞
2015/07/29 职场文书
详解MySQL 用户权限管理
2021/04/20 MySQL
Apache POI操作批量导入MySQL数据库
2022/06/21 Servers