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

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

在这里插入图片描述
在这里插入图片描述

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 image

crop_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],因此两张图片进行需要简单的叠加就可以实现绿幕换成太空图了。
是不是很简单呢?你学会了吗?你可以自己尝试着写写代码,看得再多不如动手实践下~

附上我的代码效果图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_18649781/article/details/88703076