前言: 经常在电影花絮中看到,特别是一些科技电影中,演员们一般都是在一个背景为浅绿色的环境中进行拍摄,但是呈现在荧幕上的时候,就是遨游海底或者太空,那这些操作究竟是怎么做到的呢?其实很简单,接下来将给大家介绍一下此方法的基本原理,然后用代码实现一个例子(让汽车漂浮在太空)


1、源码

import matplotlib.pyplot as plt   #用来绘图
import matplotlib.image as mpimg  import numpy as np
import cv2                        #导入计算机视觉库%matplotlib inline
# Read in the image
image = mpimg.imread('E:\ComputerVision\images\lesson2img\images\car_green_screen.jpg')  #导入图片# Print out the image dimensions (height, width, and depth (color))
print('Image dimensions:', image.shape)                                                  #打印出图片的形状 (高,宽,深)
# Display the image
plt.imshow(image)                                                                        #显示图片## TODO: Define our color selection boundaries in RGB values
lower_green = np.array([0,200,0])                                                        #设置颜色阈值的下限
upper_green = np.array([100,255,80])                                                     #设置颜色阈值的上限
# Define the masked area   定义掩膜区域    掩膜:把我们选定的感兴趣的区域分离出来,以便进行操作
mask = cv2.inRange(image, lower_green, upper_green)# Vizualize the mask   显示掩膜 掩膜可视化
plt.imshow(mask, cmap='gray')
# Mask the image to let the car show through
masked_image = np.copy(image)     #颜色转换后的掩膜副本图像masked_image[mask != 0] = [0, 0, 0]# Display it!
plt.imshow(masked_image)         #显示出来的图片绿幕消失  若图片中存在一些小点,可以通过调整前面的阈值进行修正# Load in a background image, and convert it to RGB
background_image = mpimg.imread('E:\ComputerVision\images\lesson2img\images\sky.jpg')  #导入背景图片
background_image = cv2.cvtColor(background_image, cv2.COLOR_BGR2RGB) #转换成RGB## TODO: Crop it or resize the background to be the right size (450x660)crop_background = background_image[0:450, 0:660]   #使背景图片与绿幕图片大小一致## TODO: Mask the cropped background so that the car area is blocked
# Hint mask the opposite area of the previous imagecrop_background[mask == 0] = [0, 0, 0]    #与上面的掩膜完全相反,这次是显示背景## TODO: Display the background and make sure plt.imshow(crop_background)               #显示出来的图片,中间的汽车区域是黑色的## TODO: Add the two images together to create a complete image!
# complete_image = masked_image + crop_background    complete_image = masked_image + crop_background   #因为黑色的RGB值是0,因此在此只需要进行简单的加法运算即可
plt.imshow(complete_image)

2、原理解析

给你一张图片,你一眼就看出来这是什么,但是,计算机是怎么认识图片的呢?其实,计算机就是把图片分成好多的网格,也就是我们常说的像素,在计算机中,像素是以数组的形式存储的,数组中存储的就是相关信息的数值,比如RGB图像的话,存储的就是RGB值,就是[R,G,B]。因此我们要对图片进行处理也就是对像素点进行处理,因为每个颜色的RGB值是不同的,所以我们完全可以根据像素的RGB值来提取我们想要的部分或者其他的一些操作。在本文的例子中,给替换掉绿幕并换成太空的效果,其实就是对图片中绿色的部分进行掩膜,掩膜实现的是什么呢?我们创建掩膜时考虑的是什么呢?
首先掩膜实现的是,将在颜色阈值内的像素显示出来,而不在的部分呢,就会被遮住,设为黑色。从上面的解释,我们可以看出,创建掩膜时需要考虑的就是颜色阈值。在这个例子中,我们要去掉的是绿色背景,因此阈值设置的就是绿色的RGB范围。这样
会得到一个汽车区域是黑色的,背景是白的掩膜灰度图。然后我们提取绿幕,有一个办法就是提取图像与掩膜白色区域重叠部分,或是说与掩膜非黑区域重叠的区域,也就是说要提取的部分是掩膜不等于0的部分。这样即将掩膜不等于0的区域设为0,这样就得到了绿幕消失的图片。
根据这个原理,我们将要当成背景的图片也进行掩膜,因为这次需要的是背景,而要提取出去的是汽车的区域,因此这次的掩膜和上次是相反的,也就是说这次要提取的部分是掩膜等于0的区域,这样就得到一个汽车区域是黑色的背景图片。
之后,因为黑色的RGB值是[0,0,0],因此两张图片进行需要简单的叠加就可以实现绿幕换成太空图了。
是不是很简单呢?你学会了吗?你可以自己尝试着写写代码,看得再多不如动手实践下~

附上我的代码效果图:




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

  1. python利用opencv去除图片logo_python 基于opencv去除图片阴影

    一.前言 如果你自己打印过东西,应该有过这种经历.如果用自己拍的图片,在手机上看感觉还是清晰可见,但是一打印出来就是漆黑一片.比如下面这两张图片: 因为左边的图片有大片阴影,所以打印出来的图片不堪入目 ...

  2. 通过opencv标记图片以及写入Excel小方法

    通过opencv标记图片以及写入Excel小方法 通过opencv根据坐标绘制图片框,然后保存图片 将结果读入并且写入Excel中进行保存 Python strip() 方法用于移除字符串头尾指定的字 ...

  3. 基于opencv的图片模板匹配及其简单应用

    opencv的图片模板匹配及其简单应用 我的个人博客 基础知识 基于opencv的图片模板匹配 注: python及其相关包的安装不在讨论范围内 opencv提供了图片模板匹配的方法, cv2.mat ...

  4. 基于Python实现图片格式转换的小程序

    基于Python实现图片格式转换的小程序 特点: 批量处理图片 转换常见的4种图片格式 运行窗口 运行窗口-1 选择图片(可批量选择)-2 假设选中4张JEPG格式的图片 格式选择窗口-3 假设选择目 ...

  5. 如何给证件照替换背景颜色?一键替换证件照背景色的方法

    证件照换背景的优点 在申请各种证件时,一张合格的证件照是必不可少的.然而,在拍摄证件照时,往往因为背景.光线等问题导致照片质量不佳.因此,将证件照的背景更换为统一的纯色背景就显得尤为重要. 证件照换背 ...

  6. OpenCV2学习笔记(十四):基于OpenCV卡通图片处理

    得知OpenCV有一段时间.除了研究的各种算法的内容.除了从备用,据导游书籍和资料,尝试结合链接的图像处理算法和日常生活,第一桌面上(随着摄像头)完成了一系列的视频流处理功能.开发平台Qt5.3.2+ ...

  7. 基于OpenCV给图片添加边框

    目标: 基于OpenCV的函数cv::copyMakeBorder给图像添加边框 函数简介: copyMakeBorder( src, dst, top, bottom, left, right, b ...

  8. 基于OpenCV对图片清晰度、色偏和亮度的检测(java版)

    由来:近期项目需要检测图片的亮度和色偏,但网上大多为用C实现的,没有java版本的,此篇为java版本对opencv的调用,谨以此献给CSDN的广大用户. 一. 导入OpenCV所需依赖 依赖下载:O ...

  9. 基于51单片机的led灯控制小实验

    该小实验是为了更好的理解51单片机的使用,其完成的要求如下: 1.第一个键控制两个灯的翻转; 2.第二个键控制一个灯的翻转; 3.第三个键接在51单片机的外部中断口,每检测到一次,翻转三下; 4.第四 ...

最新文章

  1. Obj-C的hello,world 2
  2. 延时求和波束形成的MATLAB仿真
  3. [云炬商业计划书阅读分享] 珠江啤酒公司企业文化调查
  4. 组成原理----存储管理
  5. MYSQL数据库导入大数据量sql文件失败的解决方案
  6. OpenWrt网络结构
  7. 【渝粤教育】国家开放大学2018年秋季 0109-22T公司财务 参考试题
  8. matlab回归系数 t检验6,matlab做回归分析时,能做t检验吗?
  9. 吴昂雄回应Arm中国控制权争夺:Arm罢免我无效
  10. Jeff Dean的传奇人生:超级工程师们拯救谷歌
  11. 一张图回顾Hadoop十年 Hadoop老矣,尚能饭否
  12. 计算机内存调用优化,Memory Cleaner——简单好用的Windows内存优化工具
  13. PLM教程:CAXA 3D 与 PLM 的集成应用
  14. 程序之外:由电影《少年的你》揭露的bug
  15. wps 单元格跳动_WPS文字在表格中打字自动跳动
  16. 根据身份证号回填信息
  17. 软件系统等保方案,市政项目,投标项目必须
  18. 转载的--------------------HTTP协议中的短轮询、长轮询、长连接和短连接
  19. 怎么保存网页为html格式,怎样保存网页部分内容为html格式?
  20. DuerOS智能设备激活数破亿!百度补贴上亿造节再添一把火

热门文章

  1. 记录FinalShell退格键
  2. ios开发html转图片,iOS | PPT 转图片(UIImage) 解决方案
  3. java转换中文日期格式_java 转换日期格式的方法
  4. Springboot+mybatis
  5. 小米刷入Recovery
  6. python excel筛选统计_懂点EXCEL就行!教你利用Python做数据筛选(上)
  7. 应届生前端上班很吃力怎么办?
  8. nodejs stream 经典解析
  9. Oracle数据库占用磁盘,导致磁盘活动时间为100%的解决方法
  10. 估算活动持续时间-规划管理