写点什么

短视频的色彩特效原来是这样做出来的

  • 2019-10-29
  • 本文字数:2521 字

    阅读完需:约 8 分钟

短视频的色彩特效原来是这样做出来的

从眼睛的进化说起

大约在 5 亿 4 千万年前的寒武纪,地球上一部分生物体开始进化出了感光细胞,这种细胞可以感应光线的强弱,并且直接驱动本体的运动细胞采取必要的规避动作,以确保脆弱的细胞不被紫外线所伤。


后来单个的感光细胞开始扎堆聚集并且形成了凹陷,随着凹陷程度的逐步加深,这些感光细胞也就渐渐地汇聚成了一个前部有孔隙的球状结构,“眼球”的雏形也就由此形成了。



随着球形的眼睛结构渐渐成型,中学物理课本中的“小孔成像”原理也就越来越能发挥作用:只要开孔足够小,光线就能准确地到达这些聚集的感光细胞进而成像,眼前的物体也就开始变得边界清晰。代表腾讯文化吉祥物之一的鹦鹉螺,就是采用了这种“以小为美”的进化策略,而且一直坚持到现在。


但是这种越来越小的策略也会导致光线进入量越来越小,所以鹦鹉螺们的世界想必是很昏暗的。我们的祖先可不希望放弃一个光明的世界,所以,我们给自己的眼睛安装了一个足够高级的光学部件 —— 晶状体,以期拥有一个光明而清晰地世界。


然而,当大家都能把世界看得很清楚的时候,色彩分辨能力也就演变成了新一轮的军备竞赛。


当我们的祖先踩着那些坚称“我就想健健康康地当个素食主义者”的同类尸体艰难前行的时候,他们并不知道,让自己活得更久的原因,竟然是因为那双能区分树叶是嫩叶还是成熟叶片的眼睛。因为成熟的叶片常常包含大量的植物性毒素,会让进食者身体遭受很大的伤害。所以,我们都是那一波“好色的”猴子的后代。


而眼睛对色彩的分辨能力,不仅在远古时代让我们活了下来,也让今天衣食无忧的我们,能看到更多色彩斑斓的效果。


比如短视频的移形换影特效,其本质原理就是一个充分利用色彩的小把戏。

三原色的修改和组合

人体有三种视觉锥细胞,所以我们看到的颜色都是由三原色组成的,并不是说世界上就只有这些颜色,而是更加绚丽的色彩空间我们也感知不到。


因此,液晶显示器的成像原理上也就是基于 R(红)G(绿)B(蓝) 三原色的组合而实现的,腾讯云短视频(UGSV)的移形换影特效,就是在这三种颜色空间上做了一些文章:


先以一幅静态的图片来举例:



Doloris


现在把图片中红色的分量去掉,放大 10%,再移动一些距离。



Doloris-strip-red


再把蓝色的分量去掉,放大 10%,并移动一些距离。



Doloris-strip-blue


再把绿色的分量去掉,放大 10%,并移动一些距离。



Doloris-strip-green


然后将这三副图片以 33%的透明度和源图叠加到一起,形成一种移形幻影的效果。



Doloris-blend

交给计算机来实现

上面这些图片是我用图片处理软件简单处理后得到的,但如果是视频文件,显然要交给计算机自动解决,如何做到呢?


首先我们先给这幅图片定义坐标,为了方便处理我们将图片的中心点定义为 (0,0),图片的 XY 轴最大值为 1,如下图所示:



坐标定义


然后开始处理上面提到的两个变换,一个是放大,一个是移动。


  • 放大如果定义图片上的任意象素坐标是(x,y),放大 s 倍后的坐标就是 (x’,y’) = s(x,y) = (sx, sy)

  • 移动如果定义图片上的任意象素坐标是(x,y),将其移动(?x,?y),移动后的坐标就是(x’,y’) = (x+?x, y+?y)

  • 合并将上面两个公式进行合并,得到的新坐标点就是 (x’,y’) = (s(x+?x), s(y+?y))

  • 叠加然后我们要将修改过的图片叠加到原图上,alpha 叠加的公式是 src * (1 - alpha) + overlay * alpha。

基于 OpenGL 的版本

短视频的特效处理,每秒钟要处理几十张甚至更多的视频画面,所以简单的 C 语言处理算法并不能满足性能上的要求,我们需要使用手机的硬件加速能力,目前除了常见的 OpenGL 等 API 之外,还有如 Vulkan, DirectX, Metal 等可选方案。就目前而言,OpenGL 在各平台上通用性最好,网上的资料也比较丰富,不论是桌面平台还是移动平台都有支持,本文就以 OpenGL 来讲讲特效的实现。


实现移形换影特效的时候,我们会用到 OpenGL 的 Fragment Shader, Fragment Shader 作用就是返回图像各点的色值,Fragment Shader 也有一套自己的编程语言,叫 Shading Language 简称 GLSL, GLSL 和 C 很像,增加了一些向量的数据类型,和一些图像相关的处理函数。Shading 和 C 比起来有一个比较特殊的地方是不支持隐含的类型转换,比如浮点点整型的转换(在使用浮点数时,一定要加上小数点,如 1.0)。


篇幅原因,我不在这里把所有的特效代码都一一列举了,仅附上放大和位移的部分实现:


varying vec2 textureCoordinate;uniform sampler2D inputImageTexture;void main() {  vec2 offset = vec2(0.05, 0.05);  float scale = 1.1;  vec2 coordinate;  coordinate.x = (textureCoordinate.x - offset.x) / scale;  coordinate.y = (textureCoordinate.y - offset.y) / scale;  gl_FragColor = texture2D(inputImageTexture, coordinate);}
复制代码


考虑到不是所有读者都学过 Shading Language,这里做一个简单的解读:


  • 我们在这里定义了一个变量 coordinate,这个就是前面提到的(x,y),它的值就是 ((x - ?x)/s, (y-?y)/s)。

  • 函数 texture2D 的作用就是从图片中获取某个坐标的颜色。这里从 inputImageTexture 中的 coodinate 坐标点获取了颜色。

  • gl_FragColor, 这是 Fragment Shader 的输出的值, gl_FragColor 是一个 GLSL 预定义的全局变量, 类型是 vec4 既 (r,g,b,a) 这四个量,也就是一个 RGBA 颜色。

  • 程序运行后在 textureCoordinate 这个坐标就会显示 gl_FragColor 这个颜色。


上面讲了单幅图的处理,对于视频我们可以做些更有意思的效果,比如我们可以把当前帧和上一帧的图片进行叠加,这样就可以作出一些更有意思的效果。


更多特效

本文介绍了腾讯云短视频(UGSV)众多视频特效中的一种,如果要实现更加复杂的特效,还是需要继续深入研究 OpenGL 和人脸识别等相关领域的知识,这需要一段时间的学习和努力,也不可避免的需要踩很多坑。


作者介绍:


常青, 2008 年毕业加入腾讯,一直从事客户端研发相关工作,先后参与过 PC QQ、手机 QQ、QQ 物联 等产品项目,目前在腾讯视频云团队负责音视频终端解决方案的优化和落地工作,帮助客户在可控的研发成本投入之下,获得业内一流的音视频解决方案,目前我们的产品线包括:互动直播、点播、短视频、实时视频通话,图像处理,AI 等等。


本文转载自公众号云加社区(ID:QcloudCommunity)。


原文链接:


https://mp.weixin.qq.com/s/qEF8syevmQ25Ot2G9KMlyg


2019-10-29 14:321178

评论

发布
暂无评论
发现更多内容

【LeetCode】统计匹配检索规则的物品数量Java题解

Albert

算法 LeetCode 11月月更

Wallys/ WiFi6 MiniPCIe Module 2T2R 2×2.4GHz 2x5GHz MT7915 MT7975 /industrial mini pcie card

wallysSK

MT7915

张文歆:思维需碰撞,才有更大的“火花”|对话 Doris

SelectDB

开源 职场 成长 学习路线 开源治理

node.js的模块化与npm

急需上岸的小谢

11月月更

计算机网络:IEEE 802.11无线局域网

timerring

计算机网络 11月月更

阿里P8出,入职阿里必会199道SpringCloud面试题,你能掌握多少?

钟奕礼

Java java程序员 java面试 java编程

数据库精选 60 道面试题

钟奕礼

Java Java 面试 java程序员 java编程

Spring 5(五)事务操作

浅辄

Spring5 事务 11月月更

HMS Core手语服务荣获2022中国互联网大会“特别推荐案例”:助力建设数字社会

HarmonyOS SDK

手语 HMS Core

分布式锁

急需上岸的小谢

11月月更

StarRocks 与 DataPipeline 完成兼容性互认证,携手共建数据基础设施生态

StarRocks

数据库

云服务器的四大作用讲解-行云管家

行云管家

云计算 服务器 云服务 云服务器

软件测试 | 接口自动化你不懂?听HttpRunner的作者怎么说

测试人

软件测试 自动化测试 接口测试 接口自动化 HttpRunner

EventBridge 生态实践:融合 SLS 构建一体化日志服务

阿里巴巴云原生

阿里云 云原生 EventBridge

战略合作再升级!合合信息与腾讯云联合推出海外智能风控方案

科技热闻

微服务中的服务发现是什么?

API7.ai 技术团队

微服务 服务发现 API网关 APISIX

有奖报名|StarRocks 获开源热力值增速第一,有你的贡献

StarRocks

数据库

精彩议程更新,从云原生到 Serverless 的思考和收获,邀你共同见证丨PingCAP DevCon 2022

PingCAP

TiDB

MetaForce佛萨奇2.0系统开发DAPP搭建

薇電13242772558

dapp开发

node.js的path路径模块和http模块

急需上岸的小谢

11月月更

「Go实战」在 Go 项目中基于本地内存缓存的实现及应用

Go学堂

golang 缓存 开源 程序员 性能

首次!阿里巴巴团队共同携手编写“大厂面试参考指南”v1.0版本

钟奕礼

Java 面试 java程序员 java 编程 #java Java 面试题

软件测试 | 测试开发 | 校招面试真题 | 实习生和应届生有什么区别?

测吧(北京)科技有限公司

软件测试 软件测试工程师

成为千行百业数字化转型催化剂的,竟然是它!

元年技术洞察

微服务 低代码 数字化转型

DTSE Tech Talk | 第11期:深入浅出畅谈华为云低时延直播技术

华为云开发者联盟

云计算 后端 华为云

学历不是问题!社招大专老哥阿里 腾讯Java面试,上岸入职京东

钟奕礼

java程序员 java面试 java编程 #java

Dive into TensorFlow系列(3)- 揭开Tensor的神秘面纱

京东科技开发者

Python 人工智能 深度学习 tensorflow

5种GaussDB ETCD服务异常实例分析处理

华为云开发者联盟

数据库 后端 华为云

打开时空隧道,重演云栖72小时云世界

阿里云CloudImagine

阿里云 云栖大会

应用程序现代化指南

世开 Coding

应用现代化 软件升级

HUAWEI DevEco Studio 3.1版本发布,配套ArkTS声明式开发全面升级

HarmonyOS开发者

HarmonyOS

短视频的色彩特效原来是这样做出来的_文化 & 方法_常青_InfoQ精选文章