大家好,我是阿潘,今天跟大家分享一个赛博朋克特效的实现算法
为了写好这篇文章, 找了很多资料, 如果对你有帮助的话, 帮忙分享一波, 支持一下, 感谢!!!
主要内容:
1、什么是赛博朋克风格
2、PS 如何做出赛博朋克风格
3、使用opencv 实现
1、什么是赛博朋克风格
根据维基百科上面的描述:赛博朋克(Cyberpunk)是反乌托邦未来主义背景中的科幻小说的一个子流派,倾向于关注“下层社会生活和高科技的结合”,以人工智能和控制论等未来主义技术和科学成就为特色,与社会崩溃、反乌托邦并列或衰退
https://en.wikipedia.org/wiki/Cyberpunk
英文原文:
Cyberpunk is a subgenre of science fiction in a dystopian futuristic setting that tends to focus on a "combination of lowlife and high tech",[1] featuring futuristic technological and scientific achievements, such as artificial intelligence and cybernetics, juxtaposed with societal collapse, dystopia or decay
欣赏一下
2、PS 如何做出赛博朋克风格
上面描述赛博朋克的定义,但是我们想要的是赛博朋克的风格实现,因此,需要查了一下,在利用 p 图软件(PS)中是如何实现的。
简单来说,我们需要了解赛博朋克的画风具体是什么样子的。
赛博朋克风格在视觉设计中的特点就是蓝、紫、青等冷色调为主色调,霓虹灯光感效果为辅助,故障艺术风为辅助(图像的失真、错位、破碎等) ,有时还可以加一些异常的现象比如180度翻转的建筑,还有复古风和未来风并存。
具体思路:
1、让画面呈现冷色调
2、具有对比效果的冷暖色调,颜色花哨(色相、饱和度、明亮度)
2.1 让红色更偏洋红,橙黄色都往红色靠拢,蓝色紫色都偏青
2.2 所有的颜色往洋红和青蓝色上面调
2.3 再加一层纯色滤镜,颜色选择偏紫色,介于蓝色红色之间,可以更好的平衡色彩
https://www.zhihu.com/question/269194796/answer/652003989
以上是PS 大佬的 PS 具体操作流程,翻译成自己能理解的技术方案
1、opencv 实现冷色调
2、让整体图片往一些特殊的颜色上靠
3、使用opencv 实现
首先介绍一个好用的网站:
https://www.w3schools.com/colors/colors_hsl.asp
可以直接通过调整HSL空间的值,来查看 RGB 色彩空间对应的值,比起放公式,会直观很多。
另外简单介绍一下,我们这里会用到的两个色彩空间,HSL 和 LAB (主要目的是为了让我们将颜色映射到目标颜色的值区间,下面会考 )
HSL 色相(Hue)、饱和度(Saturation)、亮度(Lightness)
LAB 亮度(L)、绿红(a)、蓝黄(b)
这里需要注意的是,很多内容都会提到这两个色彩空间,以及对应的值范围,但是在 opencv 中 会值做一些特定的映射!!!
例如,我们上面提供的工具网页 w3school ,显示的 hsl 的值范围和实际上 opencv的值范围并不一样(这里你可以试着写一个代码来验证)
代码语言:javascript复制h : 0 - 360 ⇒ OpenCV range = H/2 (0 > H > 180)
s : 0 - 1 ⇒ OpenCV range = 255*S (0 > S > 255)
l : 0 - 1 ⇒ OpenCV range = 255*l (0 > S > 255)
对于 Lab 也是如此
代码语言:javascript复制0 > L > 100 ⇒ OpenCV range = L*255/100 (1 > L > 255)
-127 > a > 127 ⇒ OpenCV range = a 128 (1 > a > 255)
-127 > b > 127 ⇒ OpenCV range = b 128 (1 > b > 255)
为了更加清晰的看到不同色彩空间中,每个通道对分离并查看其对最终显示效果的贡献(以下示意图来源:https://rodrigoberriel.com/ )
HSV(因为没有找 HSL,所以用 HSV 代替)
原始图像 (a) 及其颜色通道:色调 (b)、饱和度 (c) 和值或亮度 (d)。在第二行,每个通道分别为灰度(单通道图像)。
L*a*b or CIE Lab
原始图像 (a) 及其颜色通道:亮度 (b)、a 维 (c) 和 b 维 (d)。在第二行,每个通道分别为灰度(单通道图像)。
这个时候,可能会有一个疑问,这有什么用?
以 Lab 为例,可以看到:
a 维度(c图) 控制颜色的变化范围是 绿 --> 红
b 维度(d图) 控制颜色的变化范围是 黄 --> 蓝
对照 Lab 的色彩空间(就是那个球),以及我们目标的颜色范围(蓝、紫、青、红),那么我们只需要将对应色彩空间中的值,调整到目标颜色的范围即可实现!!!
现在梳理一下我们的目标:
1、将图片调整成冷色调、
2、可以利用 hsl 将颜色值控制在 (蓝、紫、青、红) 的区间,通过 w3schools 网站可视化,我们可以看到 (蓝、紫、青、红)的值范围是在180-360,映射到opencv中的值范围就变成了 90-180
3、同样的,利用 Lab 再次调整颜色到目标颜色的值范围(个人感觉另一个目的是通过不同色彩空间的调整让最终结果色彩更加的丰富)
效果展示 & 参考资料
原图:
效果图:
参考资料:
https://www.jianshu.com/p/7058debaaf2f
https://en.wikipedia.org/wiki/Cyberpunk
https://www.zhihu.com/question/269194796/answer/652003989
https://blog.csdn.net/sinat_26917383/article/details/70860910
https://www.w3schools.com/colors/colors_hsl.asp
https://blog.csdn.net/lysslq2015/article/details/124987039
https://docs.microsoft.com/en-us/windows/win32/wcs/hls-color-spaces
https://blog.csdn.net/weixin_48623445/article/details/119395509
https://rodrigoberriel.com/2014/11/opencv-color-spaces-splitting-channels/
https://learnopencv.com/color-spaces-in-opencv-cpp-python/
https://github.com/howarder3/ironman2020_OpenCV_photoshop/blob/master/Day06_調整色調色溫白平衡_modify_color_temperature.ipynb
https://en.wikipedia.org/wiki/HSL_and_HSV#HSL_to_RGB
https://sensing.konicaminolta.asia/what-is-cie-1976-lab-color-space/
https://zhuanlan.zhihu.com/p/158524543