大家好,我是 Jack。

最近看了一个新动画,间谍过家家,12 集都追完了,意犹未尽。

里面有一个细节:

优雅的劳埃德先生,通过暗号来解读报纸上的情报,普通的报纸上隐藏着想要传递的消息。

暗号

解析

其实,程序员的我们,传递秘密的方式,可以更优雅。

劳埃德先生看后都会直呼:「对不起,我不是一个优雅的人!

这张看似普通的约尔美照下面,其实藏着另一个人,你发现了吗?

肉眼很难看出来,但只需要运行一下程序,将图片下采样,就能得到阿尼亚的照片。

同理,照片里也可以藏文字,运行一下程序,就能得到一篇 160 万字的小说。

请问,这种情报传递的方式,够优雅吗?

今天,我就教教大家,这“恐怖如斯”(斗破梗)的实用技能。

学会了,别忘了在女朋友/男朋友面前秀一手,藏个表白照片,再藏段肉麻表白文,玩法很多,就看你脑洞有多大。

视频已经首发在了 B 站:

视频地址:

https://www.bilibili.com/video/BV1XV4y1p7nS

下面是图文版教程和代码:

其实,原理很简单,放大图片,我们就能发现这张约尔的图片上,有着规律分布的杂点,而这些点就是组成阿尼亚照片的像素点。

缩小约尔美照时,电脑会把这些杂点挑选出来,代替它们周围的点,组成缩小后的画面。

电脑刚好能挑选出这些掺入的点,是因为这些位置都是提前计算好的,这里用到的算法就是邻近法。

举个简单的例子,一张 9 * 9 的黑图,如果把它用邻近法缩放到 3 * 3 的正方形。

电脑首先会将这张图分成 9 份,取每份正中间的点,代替它周围的 8 个点,来组成缩小后的图片。

也就是说,如果我们将每份正中间的点改成红色,从整体看,他还是黑图,只是看起来有些杂色。

但图片缩小后,黑色正方形就变成了红色正方形。

看下生成代码和解析代码:

# -*- coding: utf-8-*-
# Author: Jack Cui
import sys
from turtle import width
import cv2
from PIL import Image
import numpy as npdef parse_from_img(img_path):img = cv2.imread(img_path)img_h, img_w, _ = img.shapestepx = 10stepy = 10sml_w = img_w // stepxsml_h = img_h // stepyres_img = np.zeros((sml_h, sml_w, 3), np.uint8)for m in range(0, sml_w):for n in range(0, sml_h):map_col = int(m * stepx + stepx * 0.5)map_row = int(n * stepy + stepy * 0.5)res_img[n, m] = img[map_row, map_col]return res_imgdef generate_img(big_img_path, small_img_path):big_img = cv2.imread(big_img_path)sml_img = cv2.imread(small_img_path)dst_img = big_img.copy()big_h, big_w, _ = big_img.shapesml_h, sml_w, _ = sml_img.shapestepx = big_w / sml_wstepy = big_h / sml_hfor m in range(0, sml_w):for n in range(0, sml_h):map_col = int(m * stepx + stepx * 0.5)map_row = int(n * stepy + stepy * 0.5)if map_col < big_w and map_row < big_h:dst_img[map_row, map_col] = sml_img[n, m]return dst_img

学过深度学习的小伙伴,对这种操作绝对不陌生,这就是一种特定的卷积操作。

卷积甚至可以设置得更复杂一些,比如像这样。

照片里能藏照片,同样也就能藏文字。

我们知道,图片是由 RGB 三通道组成的,其实就是一串数字。

而文字的编码也是一串数字,比如请给我三连,这个连字。

它的 Unicode 数值是 36830,这是十进制,转换为十六进制就是(8F, DE)。

那也就可以写成(0x00,0x8F,0xDE),R 通道不赋值为零,G 通道和 B 通道赋值。

显然,将文字的 Unicode 数值,表示成 RGB 数值的形式,就可以将文字转换成图片,一个像素点代表一个文字。

一张 1000 * 1680 分辨率的图片,就可以存储 168 万个文字。

文字的生成图片代码和解析代码:

# -*- coding: utf-8-*-
# Author: Jack Cui
import sys
from turtle import width
import cv2
from PIL import Image
import numpy as npdef Img2Text(img_fname):img = cv2.imread(img_fname)height, width, _ = img.shapetext_list = []for h in range(height):for w in range(width):R, G, B = img[h, w]if R | G | B == 0:breakidx = (G << 8) + Btext_list.append(chr(idx))text = "".join(text_list)with open("斗破苍穹_dec.txt", "a", encoding="utf-8") as f:f.write(text)def Text2Img(txt_fname, save_fname):with open(txt_fname, "r", encoding="utf-8") as f:text = f.read()text_len = len(text)img_w = 1000img_h = 1680img = np.zeros((img_h, img_w, 3))x = 0y = 0for each_text in text:idx = ord(each_text)rgb = (0, (idx & 0xFF00) >> 8, idx & 0xFF)img[y, x] = rgbif x == img_w - 1:x = 0y += 1else:x += 1cv2.imwrite(save_fname, img)

拓展一下,其实只要按照一定的规则,将某些信息写入到图片内,就能达到神不知鬼不觉地保存这些信息的目的。

这个规则,可以设置地复杂一些,并且生成规则和解析规则只有你知道,这样就能得到一张只有你能读懂的照片。

除了这种间谍过家家,逗逗男女朋友,其实这项技术,有着更有意义的用途:用于保护知识产权的数字水印技术。

将影视作品的版权信息,存到视频本身的画面中,这,就是数字水印技术。

与传统的水印不同,这种水印很难被察觉,也很难被抹去,版权信息需要通过特定的解析计算才能得到。

出于好奇,我联系了一位在阿里安全做数字水印的朋友,想看看他们的技术,是否跟我想得差不多。

不看不知道,一看吓一跳。思路大致相同,但是他们设计得更为复杂。

首先,他们的技术鲁棒性要好很多。

比如对一副图片进行裁剪、缩放、有损压缩等,鲁棒性强的水印技术依然能够提取出我们想要的版权等信息。

阿里安全的数字水印鲁棒性就很好,我要来了一个他们的效果,大家可以感受一下。

电视播放着《流浪地球》这部电影,这段视频中隐藏了版权信息,版权信息咱们设为 123456789。此时,有台摄像机正在盗摄画面。

对盗摄后的画面进行分析,可以看到,程序呢,轻松地解析出了信息:123456789。

有了这个技术就能追踪溯源,甚至找出盗摄者。

对画面缩放到非常小,程序还是能够解析出信息:123456789。

甚至只盗摄一部分画面,比如只有画面一小块,程序依然能解析出信息:123456789。

文字表述不够直观,大家可以直接看视频感受一下,解析是有多准确!

视频地址:

https://www.bilibili.com/video/BV1XV4y1p7nS

无论是缩放还是裁剪,程序都能轻松地解析出想要的信息。

在各种噪声和攻击下,水印的漏检率小于 1%,误检率小于10的负9次方。

就很猛!

可见,他们的策略不是简单的在像素中插入数值那么简单,还做了很多提高鲁棒性的工作。

具体细节没有对我透露,毕竟这是人家的产品,发了很多专利,甚至还得到了好莱坞认证。

现在有了国内自主研发的水印产品,这样就可以避免受制于人。

懂的都懂,技术还是自己研发的好。

zu

知识产权保护任重而道远,不仅仅要靠平台,也需要我们每个人的帮助。

视频被盗,维权很困难,特别是对一些小 up。

比如我 21 年的一期视频,被剪辑,盗用发布在了某手。

好家伙,他将我 AI 还原乾隆后妃样貌的视频进行了裁剪,拆分成了三期视频发布。

更杀人诛心的是,每期视频都比我原视频播放高就算了,向官方举报盗用视频还无济于事,以无法鉴别的理由给我回绝了。

现在有了数字水印这项技术,这类问题就有了解决方案,在不影响视频画面的情况下,还能藏入版权信息,只要各个平台都接入这类技术,视频是不是盗用,还不一目了然?

当然,光靠一项技术,想要完全保护知识产权是不可能的,还需要每个平台,每个环节的配合,也需要有完善的、公平的鉴别规则。

只有这样,那些辛辛苦苦做视频的小 up,才能不被视频盗用的问题磨灭了创作热情。

只有这样,那些投资大量人力、物力创作的影视作品,才能不被盗摄盗版等问题弄得焦头烂额。

这就是这项技术的价值所在。

未来,还会有很多技术创新用于解决社会问题。

这些科研人员,每往前走一点,我们生活的安全感就可能多一分。

感谢这些一直在背后努力的人。生成和解析代码以及素材,我已经打包放到了我的公众号:jackcui-ai,后台回复「优雅」,即可获得。

好了,今天就聊这么多,我是 jack,我们下期见~


最后再送大家一本,帮助我拿到 BAT 等一线大厂 offer 的数据结构刷题笔记,是一位 Google 大神写的,对于算法薄弱或者需要提高的同学都十分受用:

谷歌和BAT大佬的刷题笔记,看完秒杀80%的算法题!

以及我整理的 BAT 算法工程师学习路线,书籍+视频,完整的学习路线和说明,对于想成为算法工程师的,绝对能有所帮助:

我是如何成为算法工程师的,超详细的学习路线

别光收藏,来个赞哦,笔芯~

写代码,必须要优雅...相关推荐

  1. python要在哪里写代码-如何更优雅地写python代码

    前言 Python 这门语言最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净.整洁.一目了然.但有时候我们写代码,特别是 Python 初学者,往往还是按照其它语言的思维习惯来写,那样的写法不 ...

  2. 用c语言写代码_教你如何用android mvp分层架构优雅写代码

    背景 看了好多android技术博客,写android分层架构的博客越来越多,有mvc.mvp.mvvm.clean等各式各样的,而mvp异常火热,然而每个人对mvp的定义又是不同,写法自然也是千紫万 ...

  3. 软件工程师,要么不写代码,要么就写优雅的代码

    何为优雅的代码 优雅的代码,至少需要遵循以下几个原则: 遵守规范 优雅的代码,首先让人看起来就是很整洁的.而这种整洁,则来源于代码规范.严格地遵守代码规范,是提高且保证代码质量的最有效方法.从个人开发 ...

  4. 骚操作 !IDEA 防止写代码沉迷插件 !

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! ‍ 原文地址:juejin.cn/post/6914083 ...

  5. 他是阿里 P11,靠写代码写成合伙人,身家几十亿,没有他,我们可能刷不了淘宝!...

    作者 | Mr.K 来源 | 技术领导力(ID:jishulingdaolij) 他是阿里的"扫地僧",写代码级别最高的人,一等一的技术高手,他非科班出身,用近20年的时间,修炼成 ...

  6. 架构师究竟要不要写代码?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! Talk is cheap, show me the c ...

  7. java 8代码 改 java7_Java 8 到 Java 14,改变了哪些你写代码的方式?

    前几天,JDK 14 正式发布了,这次发布的新版本一共包含了16个新的特性. 其实,从Java8 到 Java14 ,真正的改变了程序员写代码的方式的特性并不多,我们这篇文章就来看一下都有哪些. La ...

  8. 你的代码可以是优雅的,但是还有更重要的

    引用 软件设计有两种方法:一种是尽可能地简单,这种设计明显没有什么缺陷:另一种是尽可能地复杂,这种设计没有明显的缺陷. --C.A.R. Hoare,1980年图灵奖讲座 在开发过程中,我的口头禅是: ...

  9. mysql在哪里写代码_[译] 如何写好 Go 代码

    原文:https://scene-si.org/2018/07/24/writing-great-go-code/ 我写了多年的 Go 微服务,并在写完两本关于 (API Foundations in ...

  10. 编程不仅是写代码!?

    作者 | keypressingmonkey 译者 | 孙薇,责编 | 夕颜 出品 | CSDN(ID:CSDNnews) 1. 非天才生存指南 承认这一点很难,我的正式简历上也不会有:我是一名普通的 ...

最新文章

  1. mysql 单实例部署_Mysql 数据库单机多实例部署手记
  2. python代码大全p-【python】10分钟教你用python一行代码搞点大新闻
  3. 关于C语言的问卷调查
  4. HTML学习笔记之二(回到顶部 与 回到底部)
  5. GSM/GPRS/WCDMA/EDGE/HSDPA?
  6. Java对象析构_c++之对象构造顺序和销毁(析构函数)
  7. jenkins-基础配置
  8. NTIRE 2021 @CVPR 2021 Workshop 及挑战赛来了!
  9. DSB2017第一名论文理解: 3D Deep Leaky Noisy-or Network(二)
  10. 程序员面试金典——18.4 2的个数
  11. vuejs 外部嵌套from表单
  12. springcloud ip部署_php接入SpringCloud微服务框架
  13. CDAS2016中国数据分析师行业峰会议程(完整版)!
  14. [IOI2019] 景点划分
  15. 运用大数据手段 加快传统产业转型升级
  16. 使用 WPF+ ASP.NET MVC 开发 在线客服系统 (一)
  17. MySQL数据库——数据库设计概念和数据库设计步骤
  18. 国内外研究现状和发展趋势
  19. 安卓新闻发布系统源码,后台java springboot框架
  20. 使用Python对大脑成像数据进行可视化分析

热门文章

  1. win10启动项_昂达H61SD3全固版如何用u盘装系统win10
  2. Porter Algorithm ---------词干提取算法
  3. R中数据的标准化0-1标准化
  4. linux l7,linux iptables L7-filter
  5. 弱监督学习 weakly supervised learning 笔记
  6. 数据分析求职系列_简历篇
  7. 零基础学python 视频_零基础入门学习PYTHON(第2版)(微课视频版)
  8. 手机拍照识别 如何识别车牌号并给出数据
  9. 普华永道与BitFury合作在俄罗斯创建区块链加速器
  10. docker 部署 joplin server进行文档同步