基于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语言中的按位运算符
Nov 26 Python
pyqt4教程之实现半透明的天气预报界面示例
Mar 02 Python
Python实现嵌套列表及字典并按某一元素去重复功能示例
Nov 30 Python
python将一组数分成每3个一组的实例
Nov 14 Python
Python爬虫设置代理IP(图文)
Dec 23 Python
pyqt5之将textBrowser的内容写入txt文档的方法
Jun 21 Python
python 发送json数据操作实例分析
Oct 15 Python
python如果快速判断数字奇数偶数
Nov 13 Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
Mar 04 Python
Python logging模块进行封装实现原理解析
Aug 07 Python
python绘制雷达图实例讲解
Jan 03 Python
pandas 实现将NaN转换为None
May 14 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上显示JFreechart画的统计图方法
2013/11/03 PHP
phpmyadmin打开很慢的解决方法
2014/04/21 PHP
php实现文件下载功能的几个代码分享
2014/05/10 PHP
php将字符串转换成16进制的方法
2015/03/17 PHP
php中preg_replace_callback函数简单用法示例
2016/07/21 PHP
php生成二维码不保存服务器还有下载功能的实现代码
2018/08/09 PHP
PHP实现计算器小功能
2020/08/28 PHP
javascript函数库-集合框架
2007/04/27 Javascript
10个基于jQuery或JavaScript的WYSIWYG 编辑器整理
2010/05/06 Javascript
Javascript全局变量var与不var的区别深入解析
2013/12/09 Javascript
JavaScript判断字符长度、数字、Email、电话等常用判断函数分享
2015/04/01 Javascript
体验jQuery和AngularJS的不同点及AngularJS的迷人之处
2016/02/02 Javascript
Bootstrap中的Panel和Table全面解析
2016/06/13 Javascript
在vscode里使用.vue代码模板的方法
2018/04/28 Javascript
MVVM 双向绑定的实现代码
2018/06/21 Javascript
vue中组件的过渡动画及实现代码
2018/11/21 Javascript
通过实例解析js简易模块加载器
2019/06/17 Javascript
微信小程序实现左滑动删除效果
2020/03/30 Javascript
vue 返回上一页,页面样式错乱的解决
2019/11/14 Javascript
JS基础之逻辑结构与循环操作示例
2020/01/19 Javascript
vue下载二进制流图片操作
2020/10/26 Javascript
使用python的pexpect模块,实现远程免密登录的示例
2019/02/14 Python
python使用adbapi实现MySQL数据库的异步存储
2019/03/19 Python
梅尔倒谱系数(MFCC)实现
2019/06/19 Python
Python模拟登入的N种方式(建议收藏)
2020/05/31 Python
如何基于Python爬虫爬取美团酒店信息
2020/11/03 Python
使用CSS媒体查询(Media Queries)和JavaScript判断浏览器设备类型的方法
2014/04/03 HTML / CSS
css3动画 小球滚动 js控制动画暂停
2019/11/29 HTML / CSS
Toppik顶丰增发纤维官网:解决头发稀疏
2017/12/30 全球购物
Booking.com英国官网:全球酒店在线预订网站
2018/04/21 全球购物
Luxplus丹麦:香水和个人护理折扣
2018/04/23 全球购物
linux比较文件内容的命令是什么
2013/03/04 面试题
服装设计行业个人的自我评价
2013/12/20 职场文书
2016护理专业求职自荐书
2016/01/28 职场文书
golang操作rocketmq的示例代码
2022/04/06 Golang
CSS中使用grid布局实现一套模板多种布局
2022/07/15 HTML / CSS