目录
简介
- 组成
- 图片
- 代码
- 引入需要的包
- 读取前景图
- 读取背景图
- 创建掩膜
- 替换背景
- 导出结果
- 创建画板
- 图像排版
- 输出图像
- 完整代码
- 结语
简介
很多人羡慕电影情节中的科幻场景,其实那些都是科技生成的,这项技术就需要用到绿屏特效了(当然大家更喜欢戏称它为“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()
结语
通过上述步骤我们实现了一个简单的录屏特效效果,小伙伴们快拿去试试吧。