图片处理制作“幻影坦克”隐藏图!

0x01 写在前面

为了研究幻影坦克隐藏图的原理,我参考了不少文献资料,其中最重要的三篇如下(其它参考资料仅用于辅助学习,并未套用其内容,特殊部分会给予标注):

关于幻影坦克(双重图)的原理介绍 - 哔哩哔哩 (bilibili.com) https://www.bilibili.com/read/cv458697/

幻影坦克架构指南(三) - 知乎 (zhihu.com) https://zhuanlan.zhihu.com/p/32532733?ivk_sa=1024320u

用Python制作『幻影坦克』(公式法)_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1kV411v7fR?from=search&seid=384532138487976240

感谢所有贡献资料的编辑者、UP,此文章非教程,而是一个探索的过程。

0x02 什么是幻影坦克

幻影坦克(Mirage Tank),《红色警戒2》以及《尤里的复仇》中盟军的一款伪装坦克,盟军王牌坦克之一。是爱因斯坦在德国黑森林中研发的一种坦克。虽然它无法隐形,但它却可以利用先进的光线偏折原理可以伪装成树木来隐藏自己。(百度百科)

根据网络上老司机的观察发现:图片在显示缩略图时,常常会放在白色背景上显示,而显示全图时,常会放在黑色背景下显示,依次特性制作了隐藏图,放置在白色背景与黑色背景下显示不同的内容,被称之为幻影坦克。

这里推荐看一下 模糊老师 的B站讲解视频,里面有实际的操作演示(贡献链接第三个)。

0x03 如何理解幻影坦克

理解不等同于知道,我们先研究其内核:图片的格式有很多种,jpg格式与png格式是我们常见的两种图片格式。jpg图片格式在同图片质量下的体积往往会小于png格式的图片,因为png格式的图片中含有一个除RGB(三原色 分别指 红 绿 蓝)的属性——A,透明度。通过将背景调整透明,使底色和图片本身进行混合导致图片内容的变化,就是幻影坦克的雏形了。

受限于UP的知识犯愁,详细的知识点涉及到高二的知识,UP并未学习,以后会另写一篇文章说明补充,若您想要看更加具体的知识请先观看参考资料中的两篇文章。

0x04 制作简单的黑白幻影坦克

黑白图相对于彩色图来说要起的简单,因为对于图中的每一个像素点(像素:图片由若干个像素组成,每个像素一般都拥有RGB三种颜色通道进行控制像素最终显示颜色,像素点则是指图片中的某一个相适应),都只有两个属性——灰度与透明度,大大降低了处理的难度。两个点混合得一个点有下面这个公式(线性变换):

想要混合一个图片就是依据这个公式进行的。需要说明的一点是RGBA的每个灰度值(灰度值:在像素中每个RGB等显示的亮度)最高上线都是 255 ,有些文献可能会使用 1 来代表 255(取决于你用那个模块、那种语言)。。正因为最高是 255 的原因,αB 必须表示成 255 - αA 。很明显括号里面的 αA 可以约掉。变成:

现在我们把 显示在白色背景下的图(缩略图)叫做表图 ;放在黑色背景下的图(全图)叫里图;混合的图叫混合图,其图中的每一个像素点的灰度值分别用 P 来表示,透明度用 α 表示。

则可以列出下面的方程组:

通过查询资料、编程验证得知,对于灰度图来说,白色就是 255 (全亮) 黑色就是 0 (全暗),故此上面的方程可以简化为:

进行解方程可以将 Pc 的里图进行求解,而 Pc 就是我们的想要的混合图:

解方程的过程并不困难,大家可以自己动手试一试,那么我就使用 Python 来就行演示吧。

由于我使用的图片是两张完全不同的图片,所以效果会受偏差——表图质量太好了,在黑色背景下仍然可以看到表图。由于里图是映衬在黑色背景下的,所以只要图片足够透明,里图就足球清晰,相反,表图就比较模糊了。所以我们应该修改透明度。修改时我想到——是修改最终结果的透明度呢?还是修改代码计算灰度时的透明度呢?我进行了推测,如果透明度 alpha 变低了, cGray 的值必然会升高,表图就会变得明亮(你可以理解成有255个灯,灯开的多就约亮),我们进行对比,分别在公式计算时、结果时透明度减去 100 灰度值。下面为结果对比演示:

可以看到在调整最终透明度时效果是最好的。当然也可以调整灰度值进行设置。

0x05 制作较为复杂的彩色幻影坦克

彩色图片与灰色处理方式略有不同,因为彩色图片不同于灰度图有着RGB三个通道,而困哪的点就出在如何将这三个通道颜色进行混合以及混合后如何将图片质量提升。在仅有灰度图的情况下,运用公式可以推出一个透明度的灰度值,若将灰度图直接照搬,RGB会各产生一个透明度的灰度值,重点在于如何处理这个透明度。我参考了若干文献,得出一个结论:透明度平均分配或者自定义分配。

两个点混合的公式也与上面一致,只不过其中的 P 不是灰度而是 RGB 三个颜色的灰度值,如下图:

求解过程也与灰度图时相同,我们先依照上图写一份代码:

实际上效果长这样:

可以说是完全没有效果了,这样是因为表图的质量太好了,我们仍然需要进行调整。我们可以尝试让图片的RGB灰度值进行平均调整,如何调整?我们可以用插值进行色彩平均(采用第二个参考资料一张图):

[公式]

注意一点,由于这张图的通道是以 1 来代表 255 的,所以我们编程时要将 1 改成 255 。

可以看到这下里图太好了,和表图合体了。所以我们可以进行修改自定义透明度平均值。下面就是完整的代码了:

在透明度计算时,我们要选出一个大于里图的灰度值,以便于我们更加清楚看到里图的内容。(具体以后再看看)

我们也可以更改最终显示的透明度进行调整。

实际上我研究到现在,仍然没有将彩色图片的效果显示到最好,而我的研究不会停止。。。。。。

0x06 写在最后

很多人只求制作的过程,教如何制作幻影坦克,甚至为此制作了软件,可以一键生成幻影坦克,但是没有多少人可以去理解幻影坦克的原理。为什么要怎么做、如何做,这些埋没的经验正是我要探究的东西。

发表评论 (0)

后再参与讨论