昨天摸鱼的时候,看到 @刘冬煜 的图像隐写的介绍文章

什么是图像隐写

首先,简单介绍一下这个技术。图像隐写听起来很高大上,其实说起来非常简单,一般的,图像都可以用RGB三通道表示(可能也有CMYL或其他的方式),对于每个通道的微小扰动,事实上人眼是无法很好捕捉的。因此,稍微对图像的RGB值进行调整,得出来的图像和原图从肉眼上看不会有什么区别。基于这个现象,我们就可以把信息放在对RGB值的微小修改上,从而实现图像隐写。一个非常简单的例子是EOJ3343

当然,EOJ3343实现的隐写是利用图像的合成。如果我们把要隐藏的信息转化为二进制,和图像进行某种运算得到新的图像,可以储存更多的信息。从文章低四位比特基本没有区别,所以我们可以把信息与图像的低四位做异或,借此实现图像的隐写。异或和简单的加减法相比,有着不会溢出的优点,同时,反向得到信息也很容易,只需要用原图重新进行异或即可。

实现结果

以下是具体实现的结果,同样选取了JOJO的名台词进行隐写。私の名前は吉良吉影です。33歳です。杜王町東北部の別荘地一帯に住んでいます。私は亀友チェーン店でサービスしています。毎日残業して夜8時まで家に帰ります。タバコは吸わないで、お酒はただ試食だけにします。夜11時に寝ます。毎日8時間ぐらい寝ます。寝る前に、必ず温かい牛乳を一杯飲んで、20分間の柔軟体操をして、ベッドに入って、すぐ寝ます。一眠りして夜が明けるまで、

加上原图

得到处理后

可以看到,两者基本没有区别。

具体实现

代码主体分成两个部分,一个是对信息的编码和解码,一个是图像的编码解码。

信息编码解码

为了能同时适配多种语言,实现时选择采用UTF-8读入,先转换为16进制,这样就能分割出4比特的小块,然后再逐步转换为十进制列表。解码是同样读入十进制列表,反向得到原文。

def encode(filename):

with open(filename,encoding="utf-8") as doc:

file = doc.readlines()

text = ''.join(file)

byte = text.encode()

hs = ''.join(['%02X' %x for x in byte])

ls = list(hs)

ls = [int(i, 16) for i in ls]

return ls

def decode(ls):

ls = [hex(i)[2:] for i in ls]

ans = ''.join(ls)

bs = bytes.fromhex(ans)

fin = bs.decode()

return fin

图像编码解码

同样是两个互逆的过程,硬跑就完事了。

事实上,由于是显式的循环遍历,稍微修改一下就可以调整开始的位置。甚至还可以先实现一个随机的映射表,对应修改的位置,而不需要连续修改某一块,这样就更像是保存时的图像损失了。

解码时采用顺序读取,直到读取到信息为零。由于UTF-8中0同样是合法的(尤其是进行4比特切割后,0就更多了),预处理信息列表全部加一,解码时再减一。

def en_image(imgname,ls):

im = Image.open(imgname)

data = np.array(im)

l = len(ls)

num = 0

col,row,channel = data.shape

for i in range(0,col):

for j in range(0,row):

for k in range(0,channel):

data[i][j][k] = data[i][j][k] ^ (ls[num] + 1)

num = num + 1

if(l==num):return data

return data

def de_image(ori_img, diff_img):

ori = Image.open(ori_img)

diff = Image.open(diff_img)

ori_data = np.asarray(ori)

diff_data = np.asarray(diff)

ans = []

col,row,channel = ori_data.shape

for i in range(0,col):

for j in range(0,row):

for k in range(0,channel):

temp = ori_data[i][j][k] ^ diff_data[i][j][k]

if(temp == 0):return ans

ans.append(temp - 1)

return ans

输出和保存

整个过程非常简单,最容易翻车的其实是最后的保存环节。在这个实现中,我采用的是PIL的Image模块。然而,这个模块保存JPG格式时必压缩(毕竟JPG本来就是有损压缩格式),所以,有效的保存方式必须是PNG或BMP。如果简单地保存为JPG/JPEG,最后是无法得到有效的结果的。

ls = encode("introduction.txt")

data = en_image("killerqueen.png", ls)

new_im = Image.fromarray(data)

new_im.save("killerqueen-1.png")

ans = de_image("killerqueen.png", "killerqueen-1.bmp")

print(decode(ans))

参考

python图像隐写_【快速跟水】图像隐写的python实现相关推荐

  1. python图像对比处理_图像处理 | 灰度变换与图像对比度拉伸

    一.问题与解决思路 图像实质上就是一个包含了许多像素点的矩阵. 具体计算过程如下: 通过min()函数以及max()函数分别求出处理前原图像的灰度级最小值与最大值: 对原图像进行归一化处理,即用[图像 ...

  2. python十大重点_你见过的最全面的 Python 重点

    由于总结了太多的东西,所以篇幅有点长,这也是我'缝缝补补'总结了好久的东西. Py2 VS Py3print成为了函数,python2是关键字 不再有unicode对象,默认str就是unicode ...

  3. python编译器入门教程_一篇让你直接入门的 Python 教程

    目录(1)Python是什么?Python属性 (2)获取Python-一个Prelim选择Python版本 (3)如何获得Python? (4)确认Python安装PythonShell (5)语言 ...

  4. python小课网站_攻陷朋友圈的8.9元Python小课,有哪些新套路?

    欢迎关注"创事记"微信订阅号:sinachuangshiji 文/套路编辑部 来源:运营研究社(ID:U_quan) 记得有那么一段时间,我经常会在朋友圈刷到同一条广告.神奇的是, ...

  5. python实现面部特效_【AI美颜算法】300行Python实现基于人脸特征的美颜算法

    先上效果图: AI美颜 人类一直是一个看脸的物种,人人都希望可以变得更美是无可争议的,而美颜类应用的出现拯救了所有人,从此人类进入了美(照)颜(骗)时代. .... 每次写技术blog都要写一堆废话引 ...

  6. python手势控制游戏_欢乐的计算机视觉-隔空玩游戏(python手势控制飞机大战)

    每个人儿时都有一个武侠梦,梦想自己有一天10块钱买到一本如来神掌,从此仗剑走天涯,不过在桃花岛,真的有一本秘籍:隔空玩游戏,今天,就带领大家翻阅翻阅这本秘籍. 这本秘籍全部都是用python来完成的哦 ...

  7. c语言python零基础教学_编程零基础应当如何开始学习 Python?附教程

    零基础学编程,用python入门是个不错的选择,虽然国内基本上还是以c语言作为入门开发语言,但在国外,已经有很多的学校使用python作为入门编程语言.此外,python在机器学习,人工智能领域也非常 ...

  8. c语言python零基础教学_编程零基础应当如何开始学习 Python?

    目录 1.学习了解Python的基础知识. 2.安装Python,边学边练. 3.收集资料,作为练习指引. 4.确定学习方向,项目练手. 5.学习过程中要注意多练.多问! 编程零基础选择Python开 ...

  9. python第一章测试题_第一章 测试【含答案】 Python大数据分析

    (1)单选题 python中,常见的结构化数据不包括( ) A  表格型数据 B  多维数组 C  通过关键列相互联系的多个表 D  序列 E  图像数据 (2)单选题 下列不是数据分析的方法有( ) ...

  10. python与材料计算公式_《从问题到程序:用Python学编程和计算》——2.11 补充材料-阿里云开发者社区...

    本节书摘来自华章计算机<从问题到程序:用Python学编程和计算>一书中的第2章,第2.11节,作者 裘宗燕,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 2 ...

最新文章

  1. tf.keras.layers.Flatten() 示例
  2. LeetCode Flatten a Multilevel Doubly Linked List(dfs)
  3. 全球及中国甲醇催化剂行业前景动态与市场需求调研报告2022版
  4. shell脚本触发java程序传参数
  5. 顽强奋斗的FreeEIM
  6. Android 系统(60)---JSON
  7. 评分9.7! 这本Python神作,火爆编程圈!网友:太香!
  8. 11.06T1 DLZ常数剪枝+DP
  9. 使用Json.net进行序列化时,如何更改属性名称?
  10. 史上最简单的 SpringCloud 教程
  11. [渝粤教育] 西南科技大学 文学概论 在线考试复习资料
  12. (ECPC 16) (6/11)
  13. 检索器与阅读器:开放域问答的综述 Retrieving and Reading: A Comprehensive Survey on Open-domain Question Answering
  14. php 计算月差,php计算月份差
  15. go-issues#14592 runtime: let idle OS threads exit 内核线程暴增与线程回收问题
  16. spirngcloud
  17. linux 安装到usb设备,如何通过 USB 设备来安装 CentOS
  18. 游戏策划入门教程(2)人物数值设计
  19. Linux 网络编程学习笔记——二、IP 协议详解
  20. 冥想心理训练有效缓解长期压力:来自头发中皮质醇浓度的检测

热门文章

  1. 简单算法-割点和割边
  2. 20大风控文本分类算法-基于字符级的tfidf+逻辑回归
  3. spring boot电影院售票与管理系统 毕业设计源码论文+答辩PPT
  4. 禁止spotlight索引外置硬盘或者网络硬盘
  5. pyecharts查看版本_pyecharts 安装及使用指南
  6. hdoj 5510 Bazinga
  7. win7电脑桌面背景异常
  8. python row_python – 用于getrow的Scipy稀疏矩阵替代()
  9. 立体匹配(Stereo Matching)
  10. 【Swift】SpotLight搜索