基于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实现抓取城市的PM2.5浓度和排名
Mar 19 Python
python书籍信息爬虫实例
Mar 19 Python
python3.4爬虫demo
Jan 22 Python
python Django编写接口并用Jmeter测试的方法
Jul 31 Python
Pytorch卷积层手动初始化权值的实例
Aug 17 Python
face++与python实现人脸识别签到(考勤)功能
Aug 28 Python
Python完全识别验证码自动登录实例详解
Nov 24 Python
TensorFlow:将ckpt文件固化成pb文件教程
Feb 11 Python
python中format函数如何使用
Jun 22 Python
如何用Matlab和Python读取Netcdf文件
Feb 19 Python
python3判断IP地址的方法
Mar 04 Python
python自动化测试之Selenium详解
Mar 13 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 欧美动漫
利用ThinkPHP内置的ThinkAjax实现异步传输技术的实现方法
2011/12/19 PHP
php实现rc4加密算法代码
2012/04/25 PHP
解析php常用image图像函数集
2013/06/24 PHP
php日历制作代码分享
2014/01/20 PHP
php 生成短网址原理及代码
2014/01/23 PHP
PHP递归实现层级树状展开
2016/04/01 PHP
php实现的顺序线性表示例
2019/05/04 PHP
在网页中屏蔽快捷键
2006/09/06 Javascript
InnerHtml和InnerText的区别分析
2009/03/13 Javascript
面向对象的javascript(笔记)
2009/10/06 Javascript
javascript中的undefined 与 null 的区别  补充篇
2010/03/17 Javascript
跨浏览器开发经验总结(四) 怎么写入剪贴板
2010/05/13 Javascript
jQuery下扩展插件和拓展函数的写法(匿名函数使用的典型例子)
2010/10/20 Javascript
jQuery实现的Email中的收件人效果(按del键删除)
2011/03/20 Javascript
IE的有条件注释判定IE版本详解(附实例代码)
2012/01/04 Javascript
Javascript实现检测客户端类型代码封包
2015/12/03 Javascript
弹出遮罩层后禁止滚动效果【实现代码】
2016/04/29 Javascript
BootStrap 图片样式、辅助类样式和CSS组件的实例详解
2017/01/20 Javascript
写jQuery插件时的注意点
2017/02/20 Javascript
fullPage.js和CSS3实现全屏滚动效果
2017/05/05 Javascript
你有必要知道的10个JavaScript难点
2017/07/25 Javascript
详解Vue中一种简易路由传参办法
2017/09/15 Javascript
利用nginx + node在阿里云部署https的步骤详解
2017/12/19 Javascript
JavaScript 正则命名分组【推荐】
2018/06/07 Javascript
JQuery通过后台获取数据遍历到前台的方法
2018/08/13 jQuery
python正则表达式去掉数字中的逗号(python正则匹配逗号)
2013/12/25 Python
Python实现模拟时钟代码推荐
2015/11/08 Python
matplotlib绘制符合论文要求的图片实例(必看篇)
2017/06/02 Python
Python实现确认字符串是否包含指定字符串的实例
2018/05/02 Python
Django JWT Token RestfulAPI用户认证详解
2019/01/23 Python
在python中修改.properties文件的操作
2020/04/08 Python
C++的几个面试题附答案
2016/08/03 面试题
考察邀请函范文
2015/01/31 职场文书
教师师德工作总结2015
2015/07/22 职场文书
SpringBoot2零基础到精通之数据与页面响应
2022/03/22 Java/Android