基于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 相关文章推荐
Django URL传递参数的方法总结
Aug 28 Python
Python中动态创建类实例的方法
Mar 24 Python
Python标准库inspect的具体使用方法
Dec 06 Python
Window环境下Scrapy开发环境搭建
Nov 18 Python
Python3使用TCP编写一个简易的文件下载器功能
May 08 Python
django页面跳转问题及注意事项
Jul 18 Python
阿里云ECS服务器部署django的方法
Aug 29 Python
Python安装依赖(包)模块方法详解
Feb 14 Python
Tensorflow全局设置可见GPU编号操作
Jun 30 Python
Django CBV模型源码运行流程详解
Aug 17 Python
python 实现百度网盘非会员上传超过500个文件的方法
Jan 07 Python
python数据可视化JupyterLab实用扩展程序Mito
Nov 20 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
超人钢铁侠联手合作?美漫作家呼吁DC漫威合作联动以抵抗疫情
2020/04/09 欧美动漫
PHP URL地址获取函数代码(端口等) 推荐
2010/05/15 PHP
常见的PHP五种设计模式小结
2011/03/23 PHP
PHP数组的交集array_intersect(),array_intersect_assoc(),array_inter_key()函数的小问题
2011/05/29 PHP
php全角字符转换为半角函数
2014/02/07 PHP
php事件驱动化设计详解
2016/11/10 PHP
PHP环境搭建(php+Apache+mysql)
2016/11/14 PHP
PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析
2020/01/02 PHP
js根据给定的日期计算当月有多少天实现思路及代码
2013/02/25 Javascript
JavaScript实现点击按钮后变灰避免多次重复提交
2013/07/15 Javascript
JavaScript中获取鼠标位置相关属性总结
2014/10/11 Javascript
简单谈谈json跨域
2016/03/13 Javascript
30分钟快速掌握Bootstrap框架
2016/05/24 Javascript
Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法
2016/10/30 Javascript
Javascript之面向对象--接口
2016/12/02 Javascript
如何学JavaScript?前辈的经验之谈
2016/12/28 Javascript
canvas 实现中国象棋
2017/02/17 Javascript
全选复选框JavaScript编写小结(附代码)
2017/08/16 Javascript
js数组方法reduce经典用法代码分享
2018/01/07 Javascript
10分钟上手vue-cli 3.0 入门介绍
2018/04/04 Javascript
jquery获取元素到屏幕四周可视距离的方法
2018/09/05 jQuery
js事件触发操作实例分析
2019/06/21 Javascript
详解jQuery中的prop()使用方法
2020/01/05 jQuery
Python实现 多进程导入CSV数据到 MySQL
2017/02/26 Python
pycharm+django创建一个搜索网页实例代码
2018/01/24 Python
python实现俄罗斯方块游戏
2020/03/25 Python
PyQt5重写QComboBox的鼠标点击事件方法
2019/06/25 Python
Python configparser模块封装及构造配置文件
2020/08/07 Python
Maisons du Monde德国:法国家具和装饰的市场领导者
2019/07/26 全球购物
澳大利亚在线消费电子产品商店:TobyDeals
2020/01/05 全球购物
铣工实训报告
2014/11/05 职场文书
综治目标管理责任书
2015/05/11 职场文书
一文搞懂php的垃圾回收机制
2021/06/18 PHP
解决MySQL报“too many connections“错误
2022/04/19 MySQL
JS轻量级函数式编程实现XDM二
2022/06/16 Javascript
HTML 里 img 元素的 src 和 srcset 属性的区别详解
2023/05/21 HTML / CSS