【每周一坑】图像的指纹:数字水印 + 【解答】鸡兔同笼

曾经有过这样的新闻:某公司的员工将内网论坛上的言论截屏发布到互联网上,引发了热议。于是公司通过截图定位到了员工的身份,将其开除。

有人可能好奇,仅凭截图就能知道是谁干的吗?这里就是用到了“数字水印”技术。

数字水印(Digital Watermarking)技术是将一些标识信息(即数字水印)直接嵌入数字载体当中(包括多媒体、文档、软件等)或是间接表示(修改特定区域的结构),且不影响原载体的使用价值,也不容易被探知和再次修改。但可以被生产方识别和辨认。 — 百度百科

只要在你看的页面上嵌入了肉眼不可见的信息,记录你的身份,之后再通过相应的解码软件从流出的截屏上提取出这些信息,就能知道你是谁了。

数字水印的应用还包括防伪防篡改保护版权等场景。

数字水印是个很大的范畴,有很多实现方式,具有不同的实现难度、信息容量、抗攻击性、对原图的干扰等。

这里我们介绍一种很简单的实现方式:

  1. 图像中的每个像素通常可以用 RGB(红绿蓝)三个 0~255 的值来表示。如果把这个值转成二进制来表示,就是 00000000~11111111
  2. 把每个值的最后1位全部设成0,对图像的影响非常细微,人眼无法察觉。
  3. 这样,空出来的最后1位就可以拿来存储信息。把水印字符转成二进制,依次填入这些位置上,就完成了信息的嵌入。
  4. 提取信息就是上述的逆过程:把图像的像素信息取出来,提取最后1位,拼出信息。

今天我们的题目就是:请将一段文字嵌入到一张图片中,然后再成功地复原出来。

示例原图:

嵌入信息后:

提取信息:

相比较之前的题目,这期的问题难道稍高,因此再给一些提示:

  1. 之前几次图像处理用到的 PIL 库,可以方便得到图像的像素值,以及保存新图像。
  2. 将一个字符 c 转成二进制表示:bin(ord(c))[2:],反之:chr(int(s, 2))
  3. 将一个整数 x 的二进制末位设为 0x // 2 * 2
  4. 处理后的图像需要保存成 pngbmp,因为 jpg 是有损压缩,无法保证像素值不变。
  5. 仍然没有头绪的话,可以网上搜索“python 数字水印”寻找参考

详细解答和参考代码将在下次栏目中给出,也可以其他同学在留言中的代码

期待各位同学提交解答。

提交代码可以使用 paste.ubuntu.com

codeshare.io 等代码分享网站,只需将代码复制上去保存,即可获得一个分享地址,非常方便。

往期问题可通过公众号菜单栏“课外辅导”栏目中进入查看。


【解答】鸡兔同笼

上一次的题目 【每周一坑】鸡兔同笼 +【解答】房贷计算器 看来是比较简单,因为是本栏目到目前为止提交答案最多的一次。

大家的解法主要有三种:

1. 枚举法

即循环假设鸡数或兔数,验证是否满足头数和脚数的条件。

参考解答:

def calc_count(m, n):
    for c in range(m+1):
        r = m - c
        if c * 2 + r * 4 == n:
            return c, r
    return 0, 0

m = int(input('heads(m):'))
n = int(input('feet(n):'))
c, r = calc_count(m, n)
if c == r == 0:
    print('invalid input')
else:
    print('cocks', c, 'rabbits', r)

TY、penger、GS、?ེི、Famisi、Bun、张钒、神无月、扶南、喵喵 等同学用了此方法。

2. 计算法

此方法即直接使用推导出的数学算式,计算出结果。

知寒 、Fiat Lux、臧贵城、胖胖萌、阎雷、Butter.Fly.、王文亚、Mayo、灿夜、徐大龙、一休叔叔、会飞的猫、laughing…、╮(╯▽╰)╭、鑫HEAD、A暴躁的眼镜吴 等同学用了此方法。

王目田|xa 同学的代码实现了以上两种方式。

3. 解方程法

利用 sympynumpy 模块里的解方程工具,通过二元方程求解。

曹东、小鱼干拿来啦、花儿笑了、shadowsong 用了这种方式。

虽然从这个问题来看,枚举法有点多余,直接计算很方便。但我想说的是,枚举法更具有“编程的思维”。编程新手可以体会下二者的区别。

感谢各位同学的参与。

期待在下一期中看到你的代码!

原文发布于微信公众号 - Crossin的编程教室(crossincode)

原文发表时间:2018-08-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据挖掘DT机器学习

python数据挖掘:能不能找出吃货最佳住宿点?

这次我爬出了哈尔滨市TOP285家好吃的店,包括烧烤的TOP,饺子的TOP,酱骨的TOP等等等等,在地图上显示,规划热点,再用聚类算法计算下能不能找出吃货最佳的...

39550
来自专栏熊彪的专栏

精准测分:基于函数调用关系链的用例消振算法 ( 上帝视角 )

地球文明不是孤岛,函数呢?从静态的视角观察函数,她只是一个一个在文件中孤立存在的代码片段。但从动态的视角观察,函数与函数之间就天然的发生了关联。这个关联是怎么产...

25100
来自专栏申龙斌的程序人生

零基础学编程014:小海龟做画

在《零基础学编程012:画出复利曲线图》这篇文章中,我们使用了强大的matplotlib和numpy模块,可以用几行代码画出复杂的图形来。但对于初学者来说,里面...

49480
来自专栏数据结构与算法

P1064 金明的预算方案

题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布...

37280
来自专栏CDA数据分析师

为什么说 Python 是数据科学的发动机(二)工具篇(附视频中字)

毋庸置疑,Python是用于数据分析的最佳编程语言,因为它的库在存储、操作和获取数据方面有出众的能力。 在PyData Seattle 2017中,Jake V...

240100
来自专栏牛客网

阿里前端一面面经

22000
来自专栏程序人生

谈谈调度 - Linux O(1)

约莫十五年前,当我刚刚开始参加工作时,赶上 Linux 发布划时代的 2.6 内核。在这个大家都翘首期盼的内核版本中,最令人兴奋的便是 O(1) schedul...

30980
来自专栏CSDN技术头条

Weiflow:微博也有机器学习框架?

本文从开发效率(易用性)、可扩展性、执行效率三个方面,介绍了微博机器学习框架Weiflow在微博的应用和最佳实践。 在上期《基于Spark的大规模机器学习在微博...

34980
来自专栏令仔很忙

UML总结

   描述类与类之间的使用与被使用关系,而其使用关系具有偶然性的、临时性的、非常弱的,但是被使用的一方会影响到使用的一方,比如说:“动物”和“氧气”,动物的生活...

10010
来自专栏yw的数据分析

R语言写2048游戏

       2048 是一款益智游戏,只需要用方向键让两两相同的数字碰撞就会诞生一个翻倍的数字,初始数字由 2 或者 4 构成,直到游戏界面全部被填满,游戏结...

59540

扫码关注云+社区

领取腾讯云代金券