python图像隐写_【快速跟水】图像隐写的python实现
昨天摸鱼的时候,看到 @刘冬煜 的图像隐写的介绍文章
什么是图像隐写
首先,简单介绍一下这个技术。图像隐写听起来很高大上,其实说起来非常简单,一般的,图像都可以用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实现相关推荐
- python图像对比处理_图像处理 | 灰度变换与图像对比度拉伸
一.问题与解决思路 图像实质上就是一个包含了许多像素点的矩阵. 具体计算过程如下: 通过min()函数以及max()函数分别求出处理前原图像的灰度级最小值与最大值: 对原图像进行归一化处理,即用[图像 ...
- python十大重点_你见过的最全面的 Python 重点
由于总结了太多的东西,所以篇幅有点长,这也是我'缝缝补补'总结了好久的东西. Py2 VS Py3print成为了函数,python2是关键字 不再有unicode对象,默认str就是unicode ...
- python编译器入门教程_一篇让你直接入门的 Python 教程
目录(1)Python是什么?Python属性 (2)获取Python-一个Prelim选择Python版本 (3)如何获得Python? (4)确认Python安装PythonShell (5)语言 ...
- python小课网站_攻陷朋友圈的8.9元Python小课,有哪些新套路?
欢迎关注"创事记"微信订阅号:sinachuangshiji 文/套路编辑部 来源:运营研究社(ID:U_quan) 记得有那么一段时间,我经常会在朋友圈刷到同一条广告.神奇的是, ...
- python实现面部特效_【AI美颜算法】300行Python实现基于人脸特征的美颜算法
先上效果图: AI美颜 人类一直是一个看脸的物种,人人都希望可以变得更美是无可争议的,而美颜类应用的出现拯救了所有人,从此人类进入了美(照)颜(骗)时代. .... 每次写技术blog都要写一堆废话引 ...
- python手势控制游戏_欢乐的计算机视觉-隔空玩游戏(python手势控制飞机大战)
每个人儿时都有一个武侠梦,梦想自己有一天10块钱买到一本如来神掌,从此仗剑走天涯,不过在桃花岛,真的有一本秘籍:隔空玩游戏,今天,就带领大家翻阅翻阅这本秘籍. 这本秘籍全部都是用python来完成的哦 ...
- c语言python零基础教学_编程零基础应当如何开始学习 Python?附教程
零基础学编程,用python入门是个不错的选择,虽然国内基本上还是以c语言作为入门开发语言,但在国外,已经有很多的学校使用python作为入门编程语言.此外,python在机器学习,人工智能领域也非常 ...
- c语言python零基础教学_编程零基础应当如何开始学习 Python?
目录 1.学习了解Python的基础知识. 2.安装Python,边学边练. 3.收集资料,作为练习指引. 4.确定学习方向,项目练手. 5.学习过程中要注意多练.多问! 编程零基础选择Python开 ...
- python第一章测试题_第一章 测试【含答案】 Python大数据分析
(1)单选题 python中,常见的结构化数据不包括( ) A 表格型数据 B 多维数组 C 通过关键列相互联系的多个表 D 序列 E 图像数据 (2)单选题 下列不是数据分析的方法有( ) ...
- python与材料计算公式_《从问题到程序:用Python学编程和计算》——2.11 补充材料-阿里云开发者社区...
本节书摘来自华章计算机<从问题到程序:用Python学编程和计算>一书中的第2章,第2.11节,作者 裘宗燕,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 2 ...
最新文章
- tf.keras.layers.Flatten() 示例
- LeetCode Flatten a Multilevel Doubly Linked List(dfs)
- 全球及中国甲醇催化剂行业前景动态与市场需求调研报告2022版
- shell脚本触发java程序传参数
- 顽强奋斗的FreeEIM
- Android 系统(60)---JSON
- 评分9.7! 这本Python神作,火爆编程圈!网友:太香!
- 11.06T1 DLZ常数剪枝+DP
- 使用Json.net进行序列化时,如何更改属性名称?
- 史上最简单的 SpringCloud 教程
- [渝粤教育] 西南科技大学 文学概论 在线考试复习资料
- (ECPC 16) (6/11)
- 检索器与阅读器:开放域问答的综述 Retrieving and Reading: A Comprehensive Survey on Open-domain Question Answering
- php 计算月差,php计算月份差
- go-issues#14592 runtime: let idle OS threads exit 内核线程暴增与线程回收问题
- spirngcloud
- linux 安装到usb设备,如何通过 USB 设备来安装 CentOS
- 游戏策划入门教程(2)人物数值设计
- Linux 网络编程学习笔记——二、IP 协议详解
- 冥想心理训练有效缓解长期压力:来自头发中皮质醇浓度的检测