基于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中的计算示例
Jun 28 Python
Python 专题六 局部变量、全局变量global、导入模块变量
Mar 20 Python
手把手教你用python抢票回家过年(代码简单)
Jan 21 Python
解决安装python库时windows error5 报错的问题
Oct 21 Python
python根据url地址下载小文件的实例
Dec 18 Python
python简单实现AES加密和解密
Mar 28 Python
python 杀死自身进程的实现方法
Jul 01 Python
使用Windows批处理和WMI设置Python的环境变量方法
Aug 14 Python
Python进阶之使用selenium爬取淘宝商品信息功能示例
Sep 16 Python
pandas之分组groupby()的使用整理与总结
Jun 18 Python
python实现文件分片上传的接口自动化
Nov 19 Python
2020年10款优秀的Python第三方库,看看有你中意的吗?
Jan 12 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
YB217、YB235、YB400浅听
2021/03/02 无线电
一个php作的文本留言本的例子(四)
2006/10/09 PHP
php面向对象全攻略 (二) 实例化对象 使用对象成员
2009/09/30 PHP
在视频前插入广告
2006/11/20 Javascript
常见效果实现之返回顶部(结合淡入、淡出、减速滚动)
2012/01/04 Javascript
JS限制Textarea文本域字符个数的具体实现
2013/08/02 Javascript
关于img的href和src取变量及赋值的方法
2014/04/28 Javascript
bootstrap改变按钮加载状态
2014/12/01 Javascript
JS实现网页每隔3秒弹出一次对话框的方法
2015/11/09 Javascript
跟我学习javascript的最新标准ES6
2015/11/20 Javascript
javascript常见数字进制转换实例分析
2016/04/21 Javascript
JS & JQuery 动态添加 select option
2016/06/08 Javascript
深入浅析JavaScript中的Function类型
2016/07/09 Javascript
使用Javascript简单计算器
2018/11/17 Javascript
使用Angular Cli如何创建Angular私有库详解
2019/01/30 Javascript
js module大战
2019/04/19 Javascript
Vue使用虚拟dom进行渲染view的方法
2019/12/26 Javascript
vue使用swiper实现左右滑动切换图片
2020/10/16 Javascript
使用C语言扩展Python程序的简单入门指引
2015/04/14 Python
详解Python设计模式编程中观察者模式与策略模式的运用
2016/03/02 Python
Python实现八大排序算法
2016/08/13 Python
Python实现数据结构线性链表(单链表)算法示例
2019/05/04 Python
微信小程序python用户认证的实现
2019/07/29 Python
python中for循环变量作用域及用法详解
2019/11/05 Python
python中的垃圾回收(GC)机制
2020/09/21 Python
Python数据分析库pandas高级接口dt的使用详解
2020/12/11 Python
css3实现文字扫光渐变动画效果的示例
2017/11/07 HTML / CSS
蒂芙尼澳大利亚官方网站:Tiffany&Co. Australia
2017/08/27 全球购物
美国女孩洋娃娃店:American Girl
2017/10/24 全球购物
Aquatalia官网:意大利著名鞋履品牌
2019/09/26 全球购物
优秀毕业生就业推荐信
2014/05/22 职场文书
八荣八耻的活动方案
2014/08/16 职场文书
酒店爱岗敬业演讲稿
2014/09/02 职场文书
结婚司仪主持词
2015/06/29 职场文书
Java中PriorityQueue实现最小堆和最大堆的用法
2021/06/27 Java/Android
oracle重置序列从0开始递增1
2022/02/28 Oracle