此篇文章只讨论图像处理部分,AI换脸暂不讨论。上图左边手机拍摄效果,右图是自己通过算法实现。

不同角度和亮度,不同参数的效果对比。

提亮图像

由于不同手机或图片的亮度信息不同,这里咱们先加了亮度调整,但是又不能平均加亮,这样会导至图片丢失很多细节,所以选择非线性提亮。

for(int i = 0; i < _Light; i++)
{col = pow(col, (1 - col/3.0));
}

非线性提亮方法有很多,大家下载工程后可自行发挥。

减少图像般色级别

提取象素明度信息,以明度为附加参数,减少色阶

fixed4  col    = tex2D(_MainTex, i.uv);
fixed  lum    = luminance(col);
col.rgb = floor((col.rgb * _quantizationLevels) + lum) / _quantizationLevels;

边缘提取

使用Sobel算子提取信息,拿到当前象素周围9个象素UV,然后采样得到象素信息,卷积拿到边缘信息。最后与边缘阀值比较,当前象素是否为边缘处理。

float  bottomLeftIntensity = tex2D(_MainTex, i.bLR.xy).r;
float  bottomRightIntensity = tex2D(_MainTex, i.bLR.zw).r;
​
float  topLeftIntensity = tex2D(_MainTex, i.tLR.xy).r;
float  topRightIntensity = tex2D(_MainTex, i.tLR.zw).r;
​
float  leftIntensity = tex2D(_MainTex, i.leftRight.xy).r;
float  rightIntensity = tex2D(_MainTex, i.leftRight.zw).r;
​
float  topIntensity = tex2D(_MainTex, i.topBottom.xy).r;
float  bottomIntensity = tex2D(_MainTex, i.topBottom.zw).r;
​
float  h = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + bottomLeftIntensity + 2.0 * bottomIntensity + bottomRightIntensity;
float  v = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomRightIntensity + 2.0 * rightIntensity + topRightIntensity;
​
float  mag = length(float2(h, v));
float  thresholdTest = 1.0 - step(_threshold, mag);

图像混合

边缘信息后与减色阶后的图像混合得到最终颜色,漫画脸的颜色是固定的偏暖黄色,所以这里还要加一个颜色叠加,让最后的颜色看起来和脸部是相近色。

​float3  finalCol = col * thresholdTest;
finalCol = you * finalCol;
finalCol = 1 - (1 - finalCol) * (1 - _Color.rgb);
return float4(finalCol, 1);

C#代码部分

这个算法共两个Pass,提亮图像为一个Pass,减少色阶+边缘提取+图像混合为一个Pass,所以我们要先生成一个RenderTexture用来存提亮后的图像,然后以在这个图像上做相应处理。

void OnRenderImage(RenderTexture src, RenderTexture dest)
{if (material != null){material.SetFloat("_quantizationLevels", quantizationLevels);material.SetFloat("_threshold", threshold);material.SetColor("_Color", col);material.SetFloat("_radius", radius);material.SetFloat("_Light", lighten);
​RenderTexture buffer0 = RenderTexture.GetTemporary(src.width, src.height, 0);buffer0.filterMode = FilterMode.Bilinear;Graphics.Blit(src, buffer0, material, 0);
​
​Graphics.Blit(buffer0, dest, material, 1);RenderTexture.ReleaseTemporary(buffer0);}else{Graphics.Blit(src, dest);}
}

工程代码 加 微信号:ITComputerGraph

更多精彩内容,关注公众号《IT木子李》

【Unity Shaders】抖音变身漫画 2相关推荐

  1. 【Unity Shaders】抖音变身漫画1

    先来看一下手机拍出来的效果,我们发现有一张人像变成了卡通漫画脸,其它的只是做了一些图像处理. 你可以再拍几张看一下,会发现千篇一律的大眼.小嘴有没有.你想的没错,这个是AI换脸技术,抖音特效里有很多了 ...

  2. 【Unity Shaders】Lighting Models —— 灯型号Lit Sphere

    考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同一时候会加上一点个人理解或拓展. 这里是本书全部的插图.这里是本书所需的代码和资源(当然你 ...

  3. 【Unity Shaders】Mobile Shader Adjustment —— 为手机定制Shader

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

  4. 我赢助手详解:抖音变现目前流行的是七种方式之直播变现和Ip变现

    抖音变现目前流行的是七种方式,电商卖货.广告营销.内容付费.品牌导流.直播变现.IP变现.社群营销. 今天我们来说一说直播变现模式.直播变现,他有两种模式: 第一种就是直接在直播中去带货,然后就转化. ...

  5. 短视频运营详解:抖音变现目前流行的是七种方式之一电商卖货

    短视频运营详解:抖音变现目前流行的是七种方式之电商卖货 抖音变现目前流行的是七种方式,电商卖货.广告营销.内容付费.品牌导流.直播变现.IP变现.社群营销. 我们分别来说一下:权威的三方报告提到过,抖 ...

  6. 【Unity Shaders】最简单的顶点/片元着色器3

    微信号:ITComputerGraph 更多精彩内容,关注公众号<IT木子李> Shader "Unity Shaders/Simple Shader3" {SubSh ...

  7. 【Unity Shaders】Reflecting Your World —— Unity3D中的法线贴图和反射

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

  8. 【Unity Shaders】游戏性和画面特效——创建一个夜视效果的画面特效

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

  9. 独家揭秘!抖音爆款漫画变身特效的背后技术

    记者 | 夕颜 来源 | CSDN(ID:CSDNnews) 动漫伴随着我们大部分人的青春,很多人悄咪咪地都有一个动漫梦,如果有一天能变身成为漫画中的人,感觉一定很奇妙吧? 还真就有人用技术手段帮我们 ...

最新文章

  1. LeetCode-剑指 Offer 04. 二维数组中的查找
  2. 保存tensorboard的损失曲线为图片
  3. Spring Boot开发框架优点诠释
  4. ROS笔记(18) Gazebo仿真
  5. 查看邮箱号是否存在_腾讯企业邮箱--新版本
  6. 2011最赚钱的行业和公司排行榜(verified 版本)
  7. Mac 抓包工具wireshark使用
  8. 分享:EditText默认不弹出软件键盘
  9. fluidsim元件库下载_模块七 FluidSIM软件应用
  10. php加ajax,PHP – AJAX 与 PHP | 菜鸟教程
  11. Python调用Matplotlib绘制分布点图
  12. 三菱运动控制电子凸轮应用 三菱Q173系列的电子凸轮使用
  13. 哈工大C语言程序设计精髓第十三周
  14. spark.jars.packages使用镜像源加速
  15. (2)ubuntu 中安装epics 的额外插件---asyn 以及 streamdevice
  16. 华为首个芯片工厂封顶!
  17. ADB屏蔽知乎视频答案
  18. Python中随机数的使用
  19. 【Linux项目】 --P2P下载器的详细介绍
  20. PTA L1-062 幸运彩票 C++实现

热门文章

  1. 架构师的职责、核心能力、能力修炼手册
  2. maven官网应该下载binary还是sources
  3. wps打开两个文档用两个窗口独立显示
  4. 对象遍历php,PHP对象的遍历
  5. 儿童护目台灯哪种好用?几款真的保护视力的台灯品牌推荐
  6. java中遍历集合_java中遍历ArrayList集合的四种方式
  7. mysql中如何大量删除数据_mysql批量删除大量数据的方法
  8. 2018河南对口升学计算机专业试题,河南省2018年计算机类基础课对口升学考试题...
  9. 单片机蓝牙模块与手机蓝牙通信(6)小结
  10. 51单片机实战教程(一 数据类型别名定义)