利用python实现简单的绿屏特效

目录

简介

  • 组成

  • 图片

  • 代码

  • 引入需要的包

  • 读取前景图

  • 读取背景图

  • 创建掩膜

  • 替换背景

  • 导出结果

  • 创建画板

  • 图像排版

  • 输出图像

  • 完整代码

  • 结语

简介

很多人羡慕电影情节中的科幻场景,其实那些都是科技生成的,这项技术就需要用到绿屏特效了(当然大家更喜欢戏称它为“5毛”特效),那么接下来我们就利用python通过20多行代码来实现一个简单的绿屏特效。这里会将一个路标的背景进行切换,实现一个简单的绿屏特效。

想要实现绿屏特效就需要对图像的组成有所了解,图像的颜色是有红绿蓝三个通道混合而成,这里我们就是利用颜色的不同来实现绿屏特效的,这种简单的绿屏特效要求前景图有明显的颜色差异(更有利于寻找严格系数),如果前景图没有明显的颜色差异那么要实现绿屏特效的难度将会较大,这里我们所做的是简单的绿屏特效,所以采用的是颜色差异较大的前景图(背景图可以随意选取)。

组成

图片

前景图(这里我们命名为:stop.jpg)

stop.jpg(前景图)

背景图(这里我们命名为:leaves.jpg)

leaves.jpg(背景图)

生成结果(这里我们命名为:out.png,图片由代码导出)

out.png

代码

引入需要的包

from skimage import io
import matplotlib.pyplot as plt
import cv2 as cv

读取前景图

stop = io.imread("stop.jpg")  # 读入stop.jpg RGB图

读取背景图

leaves = io.imread("leaves.jpg")  # 读入leaves.jpg RGB图

创建掩模

avg = cv.imread("stop.jpg", 0)  # stop的灰度图
r = stop[:, :, 0]  # stop的红色通道图
mask = r > avg * 1.4  # 获取红色占主导色位置的掩模,严格系数设置为1.4

替换背景

stop2 = io.imread("stop.jpg")  # 重新读取stop的彩图,以免修改覆盖的一个stop
h, w = stop2.shape[:2]  # 获得stop的高和宽
stop2[mask] = leaves[:h, :w][mask]  # 内容替换

导出结果

plt.savefig("out.png")

创建画板

fig, ax = plt.subplots(1, 4, figsize=(15, 4))

图像排版

ax[0].imshow(stop)
ax[1].imshow(leaves)
ax[2].imshow(mask, cmap='gray')
ax[3].imshow(stop2)

plt.tight_layout()

输出图像

plt.show()

完整代码

# 引入合适的包
from skimage import io
import matplotlib.pyplot as plt
import cv2 as cv

# 读取stop和leaves的彩图
stop = io.imread("stop.jpg")  # 读入stop.jpg RGB图
leaves = io.imread("leaves.jpg")  # 读入leaves.jpg RGB图

# 获得stop图中需要被替代部分的位置的掩模
avg = cv.imread("stop.jpg", 0)  # stop的灰度图
r = stop[:, :, 0]  # stop的红色通道图
mask = r > avg * 1.4  # 获取红色占主导色位置的掩模,严格系数设置为1.4

# 直接把月球的内容放入到猴子的需要被替代的内容对等的位置上
stop2 = io.imread("stop.jpg")  # 重新读取stop的彩图,以免修改覆盖的一个stop
h, w = stop2.shape[:2]  # 获得stop的高和宽
stop2[mask] = leaves[:h, :w][mask]  # 内容替换
# 注意, 因为图像大小不一定一致,所以要确保两个数组的结果要对等才能进行等价索引替换

fig, ax = plt.subplots(1, 4, figsize=(15, 4))
ax[0].imshow(stop)
ax[1].imshow(leaves)
ax[2].imshow(mask, cmap='gray')
ax[3].imshow(stop2)

plt.tight_layout()
plt.savefig("out.png")
plt.show()

结语

通过上述步骤我们实现了一个简单的录屏特效效果,小伙伴们快拿去试试吧。

期待下一个展示内容吧:

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是小石呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值