基于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实现windows下模拟按键和鼠标点击的方法
Mar 13 Python
python通过pil将图片转换成黑白效果的方法
Mar 16 Python
Python编程之属性和方法实例详解
May 19 Python
python 截取 取出一部分的字符串方法
Mar 01 Python
用Python下载一个网页保存为本地的HTML文件实例
May 21 Python
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
Dec 05 Python
Python json模块与jsonpath模块区别详解
Mar 05 Python
基于python检查SSL证书到期情况代码实例
Apr 04 Python
Django filter动态过滤与排序实现过程解析
Nov 26 Python
Python3.8.2安装包及安装教程图文详解(附安装包)
Nov 28 Python
Django框架实现在线考试系统的示例代码
Nov 30 Python
python中urllib包的网络请求教程
Apr 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入门之常量简介和系统常量
2014/05/12 PHP
详解PHP错误日志的获取方法
2015/07/20 PHP
Windows下php+mysql5.7配置教程
2017/05/16 PHP
laravel 判断查询数据库返回值的例子
2019/10/11 PHP
laravel5.6实现数值转换
2019/10/23 PHP
php连接mysql之mysql_connect()与mysqli_connect()的区别
2020/07/19 PHP
离开页面时检测表单元素是否被修改,提示保存的js代码
2010/08/25 Javascript
基于Jquery的回车成tab焦点切换效果代码(Enter To Tab )
2010/11/14 Javascript
yepnope.js 异步加载资源文件
2011/09/08 Javascript
JSON为什么那样红为什么要用json(另有洞天)
2012/12/26 Javascript
javascript 面向对象封装与继承
2014/11/27 Javascript
node.js中的fs.fchmod方法使用说明
2014/12/16 Javascript
Node.js中调用mysql存储过程示例
2014/12/20 Javascript
C++中的string类的用法小结
2015/08/07 Javascript
AngularJS入门教程之AngularJS指令
2016/04/18 Javascript
AngularJs  Creating Services详解及示例代码
2016/09/02 Javascript
基于zepto.js实现手机相册功能
2017/07/11 Javascript
nuxt框架中对vuex进行模块化设置的实现方法
2019/09/06 Javascript
js编写简易的计算器
2020/07/29 Javascript
微信小程序实现倒计时功能
2020/11/19 Javascript
[01:11:37]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第一场 11.19
2020/11/19 DOTA
python读写json文件的简单实现
2017/04/11 Python
Python基于贪心算法解决背包问题示例
2017/11/27 Python
Python OpenCV实现图片上输出中文
2018/01/22 Python
Python基于多线程实现抓取数据存入数据库的方法
2018/06/22 Python
django session完成状态保持的方法
2018/11/27 Python
python中的tcp示例详解
2018/12/09 Python
python3实现raspberry pi(树莓派)4驱小车控制程序
2020/02/12 Python
Python环境下安装PyGame和PyOpenGL的方法
2020/03/25 Python
python3.6环境下安装freetype库和基本使用方法(推荐)
2020/05/10 Python
物业保安主管岗位职责
2013/12/25 职场文书
汽车广告策划方案
2014/05/31 职场文书
世界文化遗产导游词
2015/02/13 职场文书
党员违纪检讨书
2015/05/05 职场文书
SQLServer2008提示评估期已过解决方案
2021/04/12 SQL Server
Java基础之详解HashSet的使用方法
2021/06/30 Java/Android