OpenCV的蓝色屏幕效果[色度键控]

OpenCV的蓝色屏幕效果[色度键控]

在我们进入色度键控(绿色屏幕效果)之前,最好先了解使用Open CV实现这一目标的基本概念。

颜色阈值

当我们将图像作为X和Y的函数处理图像时,我们将使用颜色信息来分离特定区域。我们将使用颜色阈值选择感兴趣的区域,

使用颜色阈值,我们可以删除属于特定颜色范围的图像部分。常用的是蓝/绿屏。

类似于绿色屏幕的蓝色屏幕用于基于识别和替换大的蓝色区域来对两个图像或视频流进行分层。

我们现在要用蓝屏来拍摄;那么,它是如何工作的呢?

第一步是分离蓝色背景并将蓝色区域替换成你选择的图像。

OpenCV的蓝色屏幕效果[色度键控]

ctree_bluescreen.jpg

我们将从蓝色屏幕背景上的圣诞树图像开始。

我们首先必须识别蓝色区域,然后我们将用我们选择的背景图像替换它。Python代码如下:

import cv2
import matplotlib.pyplot as plt
import numpy as np
image = cv2.imread('images/ctree_bluescreen.jpg')

OpenCV的蓝色屏幕效果[色度键控]

cv2.imread()用于读取以图像位置为参数的图像,其中图像ctree_bluescreen.jpg位于images文件夹中.

print('Image type: ', type(image),'Image Dimensions : ', image.shape)

输出结果:

Image type: Image Dimesnsions: (720,1280,3)

openCV库以数组的形式读取图像。图像的形状,其中包含三个值,表示图像数组的维数,

  • 720: 像素高度
  • 816: 宽度(像素)
  • 3: 红色,绿色和蓝色(RGB)值的颜色组件
image_copy = np.copy(image)
image_copy = cv2.cvtColor(image_copy, cv2.COLOR_BGR2RGB)
plt.imshow(image_copy)

OpenCV的蓝色屏幕效果[色度键控]

OpenCV的蓝色屏幕效果[色度键控]

上述Python代码段的输出

OpenCV将彩色图像读取为BGR(蓝色、绿色、红色)图像,而不是RGB(红色、蓝色、绿色)图像。因此,红色和蓝色的顺序是相反的,pyplot反映了这种转换,并产生了与原始图像不同的颜色。

因此,在我们显示图像之前,让我们制作原始图像的副本,并使用Open CV将颜色从BGR更改为RGB。这样,您将应用于副本的任何变换都不会影响原始图像,因此更容易撤消步骤或尝试新内容。

现在,在这个复制的图像image_copy上,我们可以使用Open CV函数cvtColor()执行一个颜色转换,它接受一个源图像和颜色转换代码,在本例中,是BGR2RGB,然后输出所需的图像。

定义颜色阈值

现在,我们需要创建一个颜色阈值来移除所需的蓝色区域。

为了创建一个颜色阈值,我们需要为需要分离和删除的颜色定义下限和上限

Python代码如下:

lower_blue = np.array([0, 0, 100]) ##[R value, G value, B value]
upper_blue = np.array([120, 100, 255])

OpenCV的蓝色屏幕效果[色度键控]

因此,我们定义了包含红色、绿色和蓝色的最小值的低阈值,这些值仍然被认为是蓝屏背景的一部分。

在lower_blue 中,红色和绿色,我们设置为0,这意味着没有红色或绿色是可以的。但是,蓝色的最小值仍然很高,假设是100左右。

现在,对于upper_bluedefined的上限阈值允许更多的红色和绿色,并设置蓝色的最高值为255。在这个高低范围内的任何颜色都将是强烈的蓝色。这只是一个估计。如果我们发现这个范围没有找到我们想要的蓝色屏幕区域,我们可以返回并改变这些值。

创建一个Mask

我们将使用刚刚创建的颜色边界来创建一个图像蒙版。

蒙版是一种非常常见的方法来分离选定的区域,并对该区域进行处理。我们可以使用Open CV的inRange()函数在蓝色区域上创建一个蒙版。Python代码如下:

mask = cv2.inRange(image_copy, lower_blue, upper_blue)
plt.imshow(mask, cmap='gray')

OpenCV的蓝色屏幕效果[色度键控]

inRange()函数接收上、下颜色范围内的图像,并通过询问每个图像像素的颜色值是否落在上、下颜色阈值范围内来定义mask。如果它落在这个范围内,mask将被允许显示,如果不显示,它将阻止它,并将像素变为黑色。

实际上,我们可以通过将其绘制为图像来可视化蒙版。

OpenCV的蓝色屏幕效果[色度键控]

plt.imshow(mask,cmap ='gray')

整个白色区域是图像被允许显示的地方,黑色区域将被遮挡。在数值方面,我们可以将这个mask看作一个二维网格,其尺寸与图像的720像素高度和816像素宽度相同。

mask中的每个坐标对于白色的值是255,对于黑色的值是0,有点像灰度图像。当我们看这个mask的时候,我们可以看到它有一个白色的区域(蓝色的屏幕是背景),黑色的区域是圣诞树。

现在,我们需要做的第一件事是让圣诞树显示出来,挡住蓝色屏幕的背景。Python代码如下:

masked_image = np.copy(image_copy)
masked_image[mask != 0] = [0, 0, 0]
plt.imshow(masked_image)

OpenCV的蓝色屏幕效果[色度键控]

首先,我们将制作另一个图像副本,称为maksed_image,我更改图像副本,以防我以后想要更改mask。

然后我们将使用选择mask区域不等于零的图像部分mask != 0 。为了阻止这个背景区域,我们将像素设置为黑色。现在,当我们显示结果时,应该显示圣诞树区域是唯一应该显示的区域。

OpenCV的蓝色屏幕效果[色度键控]

plt.imshow(masked_image)

蓝屏背景消失了,我们甚至可以改变我们的颜色阈值来去除任何少量的蓝色点,我们可以尝试通过增加highest green值和减少low blue值,这应该可以捕捉到更大范围的蓝色。

Mask和添加背景图像

现在,我们只有最后一步是将背景应用于此图像。这个过程非常相似。Python代码如下:

background_image = cv2.imread('images/treeBackground.jpg')
background_image = cv2.cvtColor(background_image, cv2.COLOR_BGR2RGB)
crop_background = background_image[0:720, 0:1280]
crop_background[mask == 0] = [0, 0, 0]
plt.imshow(crop_background)

OpenCV的蓝色屏幕效果[色度键控]

首先,我们将读取图像并转换成RGB颜色。我们还会裁剪它,使它的大小也为720 x 1280像素,我们将这个图像称为crop_background,然后我们应用mask,这次使用相反的mask,这意味着我们想要背景显示而不是圣诞树区域。

为了确保我们的mask正确,我们将绘制生成的图像。

OpenCV的蓝色屏幕效果[色度键控]

plt.imshow(crop_background)

最后,我们只需要将这两个图像相加。

final_image = crop_background + masked_image
plt.imshow(final_image)

OpenCV的蓝色屏幕效果[色度键控]

现在,当我们绘制完整的图像时,我得到了具有新背景的圣诞树

OpenCV的蓝色屏幕效果[色度键控]

plt.imshow(final_image)

相关推荐