python opencv替换背景教程(基于OpenCV python3实现证件照换背景的方法)
python opencv替换背景教程
基于OpenCV python3实现证件照换背景的方法简述
生活中经常要用到各种要求的证件照电子版,红底,蓝底,白底等,大部分情况我们只有其中一种,所以通过技术手段进行合成,用ps处理证件照,由于技术不到位,有瑕疵,所以想用python&opencv通过代码的方式实现背景颜色替换,加强一下对于opencv的学习,锻炼一下编码水平。
软件环境:
python3.5
opencv2
windows 10
图像载入
导入opencv库,使用imread函数读取图片
|
import cv2 import numpy as np img = cv2.imread( 'zjz.jpg" alt="python opencv替换背景教程(基于OpenCV python3实现证件照换背景的方法)" border="0" /> |
由于证件照太大,不方便显示,故进行缩放
|
#缩放 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) |
原图如下
(图片源于网络,已经马赛克处理,如有侵权,私信立即删除)
获取背景区域
首先将读取的图像默认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如下图
如图所示蓝色的背景在图中用白色表示,白色区域就是要替换的部分,但是黑色区域内有白点干扰,所以进一步优化。
腐蚀和膨胀
|
#腐蚀膨胀 erode = cv2.erode(mask,none,iterations = 1 ) cv2.imshow( 'erode' ,erode) dilate = cv2.dilate(erode,none,iterations = 1 ) cv2.imshow( 'dilate' ,dilate) |
经过腐蚀和膨胀操作后如下图
处理后图像单独白色点消失。
替换背景色
遍历全部像素点,如果该颜色为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) |
最终结果如下
(图片源于网络,已经马赛克处理,如有侵权,私信立即删除)
总结
最开始想直接通过遍历全图进行替换背景色,但是图像中难免有些像素点和背景色一样,造成了干扰,导致最后结果不尽人意,所以想通过这种方法进行处理。显然最后有明显的ps痕迹。
最后贴上完整代码,不足之处欢迎各位指正!
|
import cv2 import numpy as np img = cv2.imread( 'zjz.jpg" alt="python opencv替换背景教程(基于OpenCV python3实现证件照换背景的方法)" border="0" /> #缩放 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() |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持开心学习网。
原文链接:https://blog.csdn.net/haofan_/article/details/76618362
- opencv抠出边缘检测的图形(python opencv实现图像边缘检测)
- 基于pythonopencv的图片识别(Python Opencv实现图像轮廓识别功能)
- python opencv图像合并(Python3+OpenCV2实现图像的几何变换平移、镜像、缩放、旋转、仿射)
- python opencv替换背景教程(基于OpenCV python3实现证件照换背景的方法)
- opencv 图像匹配python(OpenCV+Python识别车牌和字符分割的实现)
- opencv轮廓模糊识别(Opencv+Python实现图像运动模糊和高斯模糊的示例)
- pythonopencv自定义阈值算法(理想高通滤波实现Python opencv示例)
- opencv人脸识别算法(python利用Opencv实现人脸识别功能)
- python怎么装opencv(Python基于opencv实现的简单画板功能示例)
- opencv怎么设置图像形态(OpenCV图像颜色反转算法详解)
- opencv人脸识别效果好吗(通过opencv制作人脸识别的窗口)
- opencv提取图像轮廓python代码(Python基于opencv调用摄像头获取个人图片的实现方法)
- python opencv 标记目标(使用Python的OpenCV模块识别滑动验证码的缺口推荐)
- opencv人脸识别实战(Python opencv实现人眼/人脸识别以及实时打码处理)
- opencv图像识别基础知识(opencv与numpy的图像基本操作)
- python opencv图像表格处理(Opencv-Python图像透视变换cv2.warpPerspective的示例)
- 翼龙贷组织出借人调研 感受鄱阳 借 来的致富路(翼龙贷组织出借人调研)
- 2023新国风戏曲教育寒假集训班汇报演出《戏娃闹元宵》图文报道(2023新国风戏曲教育寒假集训班汇报演出戏娃闹元宵图文报道)
- 九儿《狐踪谍影》出演热血女特警,戏份杀青受关注(九儿狐踪谍影出演热血女特警)
- 红色代表什么(红色代表什么寓意)
- 蓝天代表什么(蓝天代表什么生肖)
- 今天要吃什么(今天要吃什么菜)
热门推荐
- centos7 离线安装nginx(centos8安装nginx1.9.1的详细过程)
- mariadb导入数据库命令(MySQL/MariaDB 如何实现数据透视表的示例代码)
- httpcontextbase 与 httpcontext
- 云服务器和物理服务器有什么区别(云服务器是什么?云服务器有什么优势?)
- vue怎么定义router的动态路由(vue.js Router中嵌套路由的实用示例)
- mysql修改初始密码教程(使用MySQL命令行修改密码)
- 怎么用单元测试php(PHP使用phpunit进行单元测试示例)
- vue移动端图片放大效果实现(vue实现图片切换效果)
- php构成方法的关键字是(PHP中的self关键字详解)
- mysql事务未提交会锁表吗(Mysql事务中Update是否会锁表?)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9