2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

  • 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:321214

评论

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

重塑元宇宙体验!3DCAT元宇宙实时云渲染解决方案来了

3DCAT实时渲染

元宇宙 元宇宙解决方案

Node 版本控制

程序员海军

Node 三周年连更

linux环境下用c语言实现reactor网络模型的代码案例

linux大本营

Linux reactor 高并发 epoll

kafka常用命令

烟波

kafka MQ 中间件

创建型模式之单例模式和工厂模式

共饮一杯无

设计模式 创建型模型 三周年连更

ORACLE EBS:多组织结构 理解与配置

back_wang

oracle oracle ebs oracle apex

一文初探 Goroutine 与 channel

陈明勇

Go golang channel goroutine 三周年连更

一键搭建web版chatGPT,无需魔法,国内可用

石云升

AI AIGC ChatGPT 三周年连更

IPv6过渡技术概述

穿过生命散发芬芳

ipv6 三周年连更

报名开启,明天直播!龙蜥社区多位专家在线报告 | 2023 大学生操作系统大赛培训会

OpenAnolis小助手

活动 操作系统 计算机 大学生 龙蜥社区

怎么查看自己的mac地址和ip

linux大本营

Mac 网络 Windows Server IP地址

C头文件是什么,使用mmap

linux大本营

C语言 Mmap

大模型带来的Web复兴,会是昙花一现吗?

脑极体

AI 云厂商

Android XML数据解析

芯动大师

android XML配置 三周年连更

Flutter 开发:如何引入第三方库并安装使用

三掌柜

三周年连更

解析mmap系统调用的所有的标志位

linux大本营

Linux 内存管理 Mmap 系统调用 内存映射

QUIC技术分享

linux大本营

网络协议 udp QUIC

怎么看电脑上是否有lindex命令可运行

linux大本营

bash Linux linux命令

C语言检测输入的ip地址中含有几个.

linux大本营

C语言 字符串

C语言检测输入的ip地址是否合法

linux大本营

C语言 IP地址

挑战 30 天学完 Python:Day11 函数

MegaQi

Python 挑战30天学完Python 三周年连更

2023-04-21:用go语言重写ffmpeg的metadata.c示例。

福大大架构师每日一题

Go ffmpeg

MySQL 教程

仅需三步,快速打造指标数据应用

Kyligence

数据分析 指标平台

组播ip地址,广播ip地址,特殊ip地址

linux大本营

TCP IP地址

TCP正常关闭连接

阿泽🧸

TCP 三周年连更

如何快速在手机中查看UDID,无需itunes、itools

网络视频监控如何入门?如何安装和配置、设备选择和实时监控?

wljslmz

三周年连更

lindex命令在shell脚本里的应用

linux大本营

Shell linux命令 脚本 shell脚本

运行脚本报错lindex:未找到命令

linux大本营

bash Linux 脚本

AI视觉实战2:实时头发染色

轻口味

android AI 图像处理 三周年连更

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