简述

在上一篇博客进行了证件照更换背景颜色,纯蓝色,红色,白色之间的替换,有人私信我,可以不可以把背景换成其他图片,而不是单纯的颜色填充。这在photoshop里面就是选中一个图层然后复制到另外一张图片上去,用代码实现的话和上篇博文换纯色背景思路完全一样,只是在替换颜色时候有了新变化。

获取目标区域(抠图)

将目标区域和背景分离开。

此方法抠图只适合颜色对比比较明显的图片,允许存在少量颜色干扰

加载&缩放

通过imread函数加载图片,resize函数对图像进行缩放。
(因为找的图片有些大,显示器太小,所以适当缩放)

import cv2
import  numpy as npimg=cv2.imread('zjz.jpg')
img_back=cv2.imread('back.jpg')
#日常缩放
rows,cols,channels = img_back.shape
img_back=cv2.resize(img_back,None,fx=0.7,fy=0.7)
cv2.imshow('img_back',img_back)rows,cols,channels = img.shape
img=cv2.resize(img,None,fx=0.4,fy=0.4)
cv2.imshow('img',img)
rows,cols,channels = img.shape#rows,cols最后一定要是前景图片的,后面遍历图片需要用到

两张图片如下

(图片源于网络,已经马赛克处理,如有侵权,私信立即删除)

要实现的效果就是,把人物图像抠出来,放在背景图片上面。

获取背景区域

由于背景纯蓝色,所以找到了这些区域,相反的就是我们想要的。
这里要用到inRange这个函数获取蓝色区域。
首先需要将图片转换为HSV类型。

#转换hsv
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

获取mask得到蓝色区域

#获取mask
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如下图

黑色区域有明显白点,有少量的颜色干扰,需要进一步优化。

mask优化

通过腐蚀和膨胀操作进行消除个别白点。
我对于腐蚀和膨胀操作的理解是:

腐蚀操作将会腐蚀图像中白色像素,以此来消除小斑点,
而膨胀操作将使剩余的白色像素扩张并重新增长回去。


#腐蚀膨胀
erode=cv2.erode(mask,None,iterations=1)
cv2.imshow('erode',erode)
dilate=cv2.dilate(erode,None,iterations=1)
cv2.imshow('dilate',dilate)

优化后如下图

黑色区域内白点已经消除,完美分离人物与背景[傲娇]。

替换背景图片

此时已经将图片目标区域抠出来了,只需要再新的背景图上把抠出来的对应点颜色填充上去就好。
我们首先要确定一个坐标点,这个点决定了要把抠出来的图像放到新背景图片的什么位置,即就是抠出图片左上角(0,0)点在新的背景图片中应该在的位置。
注意:

扣出的图片应该小于背景图片,确定位置时候应注意,坐标越界后
会发生异常。注意协调。

#遍历替换
center=[50,50]#在新背景图片中的位置
for i in range(rows):for j in range(cols):if dilate[i,j]==0:#0代表黑色的点img_back[center[0]+i,center[1]+j]=img[i,j]#此处替换颜色,为BGR通道
cv2.imshow('res',img_back)

最终效果

(图片源于网络,已经马赛克处理,如有侵权,私信立即删除)

总结

基本原理和上篇博客所讲相同,重点在于后面的center点的确定(谨防越界),和不同图片间相对应的坐标和颜色的相互复制替换。

完整代码如下:

import cv2
import  numpy as npimg=cv2.imread('zjz.jpg')
img_back=cv2.imread('back.jpg')
#日常缩放
rows,cols,channels = img_back.shape
img_back=cv2.resize(img_back,None,fx=0.7,fy=0.7)
cv2.imshow('img_back',img_back)rows,cols,channels = img.shape
img=cv2.resize(img,None,fx=0.4,fy=0.4)
cv2.imshow('img',img)
rows,cols,channels = img.shape#rows,cols最后一定要是前景图片的,后面遍历图片需要用到#转换hsv
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
#获取mask
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)#遍历替换
center=[50,50]#在新背景图片中的位置
for i in range(rows):for j in range(cols):if dilate[i,j]==0:#0代表黑色的点img_back[center[0]+i,center[1]+j]=img[i,j]#此处替换颜色,为BGR通道
cv2.imshow('res',img_back)cv2.waitKey(0)
cv2.destroyAllWindows()

基于OpenCV-python3实现抠图替换背景图相关推荐

  1. 怎么修改html模板里的背景,如何替换背景图模板中的背景

    原标题:如何替换背景图模板中的背景 图文排版 H5秀 小伙伴 小米,你们最近做的"假装一个标题"那个模板里的图咋替换啊,想换成自己的图,怎么点都换不了呢? 其实,这个模板中的图是作 ...

  2. Opencv4学习-2、小案例之绿布抠图-视频背景图替换

    一.绿布抠图-背景图替换 主要是基于图像色彩空间,转换为HSV色彩空间实现mask层提取.然后通过一些简单的图像处理比如形态学开闭操作.高斯模糊等到完整的mask区域,运用mask区域生成权重系数,对 ...

  3. python:【一文学会】批量读取图片、替换背景图中的像素位置、批量添加文本

    **导语:**有时候为了提升效率节省时间,我们需要对文件夹中的图片进行批量处理.由于工作和学习所需,新接触Python,并且实现批量图片操作. 本文处理效果: 以及这样: 正文开始 步骤:实现一张背景 ...

  4. 9.2【彩色模型】-----基于Opencv实现-----把一幅RGB图转为CMY图

    (一)CMY模型 CMY(Cyan,Magenta,Yellow)模型是采用青,品红,黄色3种基本原色按一定比例合成颜色的方法,由于色彩的显示不是直接来自于光线的色彩,而是光线被物理吸收掉一部分之后反 ...

  5. php实现的证件照换底色功能示例【人像抠图/换背景图】

    <?php //背景图和原图需要保持宽高要保持一样,这里的示例原图用的是蓝色背景 init(); function init(){$old = '1.png';$new = '2.png';// ...

  6. 基于OpenCV的图片电影换背景小实验(可用于证件照替换背景)_计算机视觉

    前言: 经常在电影花絮中看到,特别是一些科技电影中,演员们一般都是在一个背景为浅绿色的环境中进行拍摄,但是呈现在荧幕上的时候,就是遨游海底或者太空,那这些操作究竟是怎么做到的呢?其实很简单,接下来将给 ...

  7. python去除图片复杂背景_3行Python代码实现10秒抠图换背景图的AI神器,根本无需PS...

    人工智能课程大升级,限时优惠仅限前100名​sourl.cn 前言 对于会PhotoShop的人来说,抠图是非常简单的操作了,有时候几秒钟就能扣好一张图.不过一些比较复杂的图,有时候还是要画点时间的, ...

  8. python复杂背景抠图_Opencv实现抠图背景图替换功能

    本文实例为大家分享了opencv实现抠图替换背景图的具体代码,供大家参考,具体内容如下 下面简单图片演示一下: 提取mask: ===> 替换背景:  + = python的opencv代码如下 ...

  9. 一键可以轻松替换人物背景图,效果出乎意料的好(附 Python 代码)

    最近发现 BackgroundMattingV2 项目的一些使用上的小缺陷,但是他却可以做到头发丝精细的抠图效果.我将项目稍微魔改了一下,让他在可以选择单一图片的基础上,可以把抠好的图片贴在自定义的背 ...

最新文章

  1. Working with Symbols (在Balsamiq Mockups中复用自定义控件和页面模板)
  2. [转载]Outlook 2016 显示正在启动... 无法进入Outlook的解决方案
  3. 如何为linux 桌面文件内存,linux - 桌面Linux发行版中.desktop文件的功能是什么? - 堆栈内存溢出...
  4. 有效的括号—leetcode20
  5. 如何成为优秀的程序员
  6. puppet系列之nginx+php日志切割与salt结合使用
  7. 聚类算法的缺点_常用聚类算法
  8. 经典Python面试题之Python基础篇
  9. 华为交换机修改主机名
  10. *第七周*数据结构实践项目三【负数把整数赶出队列】
  11. QT 笔记6 | Qt网络编程
  12. Artistic Style Dev CPP 运算符 前后空格
  13. Android 自定义字体(otf,ttf等等)
  14. word脚注的编辑设置
  15. Windows免杀木马+维持权限(shellter)
  16. Js根据域名判断显示不同内容
  17. uni-app设置背景图片,backgroundImage
  18. 360浏览器自动填充表单
  19. Keras系列之文本向量化
  20. python爬取58同城的兼职信息

热门文章

  1. 一声快门和三个时代:全球移动影像二十年
  2. PettingZoo:多智能体游戏环境库入门
  3. 250. Count Univalue Subtrees
  4. Hie with the Pie(Floyd 状压DP)
  5. 解决 nuxt 获取不到自定义环境变量问题
  6. 咖啡技术培训:传统意式咖啡菜单制作配方及流程
  7. jQuery学习笔记(三)jQuery动画效果
  8. 梯度下降学习率的设定策略
  9. IDEA 2017.3.4 破解到2099年方法
  10. 宁海中考政策计算机考试合格,宁海中考指南!同学们、家长们你们准备好了吗?...