基于OpenCV-python3实现抠图&替换背景图
来源:互联网 发布:ubuntu14.04安装php 编辑:程序博客网 时间:2024/05/18 14:25
转自:http://blog.csdn.net/haofan_/article/details/76687238
[+]
简述
在上一篇博客进行了证件照更换背景颜色,纯蓝色,红色,白色之间的替换,有人私信我,可以不可以把背景换成其他图片,而不是单纯的颜色填充。这在photoshop里面就是选中一个图层然后复制到另外一张图片上去,用代码实现的话和上篇博文换纯色背景思路完全一样,只是在替换颜色时候有了新变化。
获取目标区域(抠图)
将目标区域和背景分离开。
此方法抠图只适合颜色对比比较明显的图片,允许存在少量颜色干扰
加载&缩放
通过imread函数加载图片,resize函数对图像进行缩放。
(因为找的图片有些大,显示器太小,所以适当缩放)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
两张图片如下
(图片源于网络,已经马赛克处理,如有侵权,私信立即删除)
要实现的效果就是,把人物图像抠出来,放在背景图片上面。
获取背景区域
由于背景纯蓝色,所以找到了这些区域,相反的就是我们想要的。
这里要用到inRange这个函数获取蓝色区域。
首先需要将图片转换为HSV类型。
- 1
- 2
获取mask得到蓝色区域
- 1
- 2
- 3
- 4
- 5
蓝色区域mask如下图
黑色区域有明显白点,有少量的颜色干扰,需要进一步优化。
mask优化
通过腐蚀和膨胀操作进行消除个别白点。
我对于腐蚀和膨胀操作的理解是:
腐蚀操作将会腐蚀图像中白色像素,以此来消除小斑点,
而膨胀操作将使剩余的白色像素扩张并重新增长回去。
- 1
- 2
- 3
- 4
- 5
优化后如下图
黑色区域内白点已经消除,完美分离人物与背景[傲娇]。
替换背景图片
此时已经将图片目标区域抠出来了,只需要再新的背景图上把抠出来的对应点颜色填充上去就好。
我们首先要确定一个坐标点,这个点决定了要把抠出来的图像放到新背景图片的什么位置,即就是抠出图片左上角(0,0)点在新的背景图片中应该在的位置。
注意:
扣出的图片应该小于背景图片,确定位置时候应注意,坐标越界后
会发生异常。注意协调。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
最终效果
(图片源于网络,已经马赛克处理,如有侵权,私信立即删除)
总结
基本原理和上篇博客所讲相同,重点在于后面的center点的确定(谨防越界),和不同图片间相对应的坐标和颜色的相互复制替换。
完整代码如下:
- 基于OpenCV-python3实现抠图&替换背景图
- 基于OpenCV-python3实现抠图&替换背景图
- opencv实现抠图(单一背景),替换背景图
- 基于OpenCV-python3实现证件照换背景
- 基于Python3,批量替换和删除
- 基于Python3 神经网络的实现
- python3+opencv
- python开发技巧---基于python3实现
- 基于python3的k-means代码实现
- 基于opencv的SVM实现
- 基于OpenCV实现图像平移
- 基于 OpenCV PCA实现过程
- OpenCV:Python3使用OpenCV
- css实现背景图拉伸
- UISlider实现背景图
- MFC基于对话框添加背景图
- 基于node实现文件路径替换
- 基于OpenCV的抠图程序
- for循环
- 36.Oracle杂记——Oracle常用动态视图V$SQL_PLAN_STATISTICS
- c# Visual Studio2015不能创建项目
- Web服务器高并发的解决方案&TCP沾包问题&服务器TIME_WAIT异常
- 小程序学习心得之事件冒泡
- 基于OpenCV-python3实现抠图&替换背景图
- 我遇到的jsp表单提交乱码问题
- 嵌入式linux调试技巧
- 编写一个程序,实现设置上月、本月电表读数,显示上月、本月电表读数,计算并显示本月用电数。假设每度电的价格为1.2元,计算并显示本月电费。
- Java高级篇-7-Java中方法的参数是如何传递的
- java 泛型 编译警告:使用了未经检查或不安全的操作。 注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。
- Tornado官方文档(二)【概述,异步和非阻塞IO】
- Hibernate入门
- in和exists