简述

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

获取目标区域(抠图)

将目标区域和背景分离开。此方法抠图只适合颜色对比比较明显的图片,允许存在少量颜色干扰

加载&缩放

通过imread函数加载图片,resize函数对图像进行缩放。

(因为找的图片有些大,显示器太小,所以适当缩放)import cv2

import numpy as np

img=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 np

img=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 找图片不同_基于OpenCV-python3实现抠图相关推荐

  1. opencv jpg作为png背景_基于OpenCV与tensorflow实现实时手势识别

    公众号[OpenCV学堂],致力于计算机视觉开发技术传播,原创技术文章200+的,涉及OpenCV开发.tensorflow开发.模型解析与训练.传统图像处理算法解析,对图像与视觉感兴趣的强烈推荐关注 ...

  2. python3.7界面设计_基于selenium+Python3.7+yaml+Robot Framework的UI自动化测试框架

    前端自动化测试框架 项目说明 本框架是一套基于selenium+Python3.7+yaml+Robot Framework而设计的数据驱动UI自动化测试框架,Robot Framework 作为执行 ...

  3. opencv python3 找图片色块_在python3下使用OpenCV 抓取摄像头图像提取蓝色

    工作中需要对摄像头进行调试, Python平台大大提高调试效率. 从网找到段代码, 可以从摄像头图像中抠出蓝色. import cv2 import numpy as np cap = cv2.Vid ...

  4. opencv python3 找图片不同_如何使用OpenCV快速寻找定位图像差异

    原标题:如何使用OpenCV快速寻找定位图像差异 如何使用结构相似性指数(SSIM)将两个图像与Python进行比较. 使用这种方法,我们能够轻松确定两个图像是否相同或由于轻微的图像处理,压缩伪像或有 ...

  5. opencv python3 找图片色块_如何使用OpenCV在Python中找到图像的平均颜色?

    如何修复错误 导致此错误的原因有两个: >文件名拼写错误. >图像文件不在当前工作目录中. 要解决此问题,您应确保文件名拼写正确(以大小写敏感检查)并且映像文件位于当前工作目录中(此处有两 ...

  6. python找图片不同_用openCV和Python 实现图片对比,并标识出不同点的方式

    最近项目中需要实现两组图片对比,并能将两者的区别标识出来. 在网上搜索一大堆找到一篇大神的文章,最终实现该功能,在这里记录下: 想要实现此demo,首先我们得确保电脑上已安装 openCV 和 Pyt ...

  7. opencv python3 找图片色块_Python 图像处理 OpenCV (3):图像属性、图像感兴趣 ROI 区域及通道处理...

    前文传送门: 图像属性 图像属性包括行数,列数和通道数,图像数据类型,像素数等. 1. 形状:shape 图像的形状可以通过 shape 关键字进行获取,使用 shape 关键的后,获取的信息包括行数 ...

  8. opencv 图片叠加_基于OpenCV的红绿灯识别代码解析

    一堆废话 红绿灯分为导向灯和圆形灯.一般圆形灯在路口只有一盏灯,红灯亮时禁止直行和左转,可以右转弯.导向灯市带有箭头的,可以有两个或三个,分别指示不同方向的行车和停车.按指示的灯即可,没有右转向导向灯 ...

  9. python opencv模板匹配多目标_基于opencv的多目标模板匹配

    利用opencv进行多目标模板匹配,只要是利用其matchTemplate函数,但在多目标(这里是讨论目标图片中不同大小模板的匹配),以下贴出代码和图片,供大家参考: #include #includ ...

最新文章

  1. 你还在用Swagger?试试这个神器!
  2. 《Excel 职场手册:260招菜鸟变达人》一第 1 招 快捷键的妙用(基于Windows操作系统)...
  3. 机器学习的数学基础(1)--Dirichlet分布
  4. Windows10安装并使用Unity3D项目AirSim教程(附问题解决方案及相关库下载)
  5. hbase官方网站声称的兼容是否是100%兼容?
  6. 附件下载,中文文件名乱码如何解决???
  7. 转]Linux杀死进程方法大全
  8. 三部委明确能源互联网建设10重点
  9. Vijos P1127 级数求和【数列】
  10. 国人项目,上Github全球热榜了!! 来瞅瞅,你会发现相见恨晚
  11. PyTips 0x14 - Python 描述符
  12. Fedora9下codeblocks安装无法编译的问题
  13. mysql打开数据表命令是_MySQL数据库命令大全
  14. 计算机动画推导,AE表达式实现逼真弹性动画
  15. 太阳高度角/方位角计算公式
  16. 解决问题:failed to lazily initialize a collection of role异常解决
  17. python软件工程师月薪-软件工程师薪水知多少?
  18. 首战告捷!网易有道斩获首届NLPCC中文语法错误修正比赛冠军
  19. 啊哈添柴挑战Java1008. 输入两个整数,倒序输出
  20. vmware安装winxp

热门文章

  1. ThinkPHP5 ajax传值到后台进行处理(验证是否含有某段字符串、截取字符串、字符串转数组)...
  2. 葡萄城报表介绍:数据钻取
  3. 关于打开sdk下载不了的最优秀解决方式
  4. KnockoutJS 3.X API 第四章 表单绑定(11) options绑定
  5. 给EditText的drawableRight属性的图片设置点击事件
  6. 《数据结构与算法分析:C语言描述》复习——第六章“排序”——插入排序
  7. net use 使用
  8. WPF在一个窗口中实现多个视图
  9. [转载] Python——摄氏温度转换华氏温度
  10. [转载] pandas中Series数组创建方法