Python实现图像信息隐藏

之前学习密码学的时候老师有提到过『信息隐藏』,现在用图像的方法尝试一下。思想是:把信息藏到RGB通道中的B通道,然后利用奇偶性可以恢复过来

原理

  • 从源图中提取文字图像信息,记录这个文字图像信息像素点在图像矩阵中的位置
  • 载体图片进行预处理,将B通道的像素值全部设置成偶数
  • 载体图片中,把第一步已经记录的位置的像素B通道设置为奇数
  • 信息解码的过程就是逆过程,只要找出载体图片中B通道是奇数的像素位置,然后统一着色就可以恢复

实现

一、写入要隐藏的信息

source = cv2.imread('img/source.png')
h, w = source.shape[:2]
message = 'Hello World!'
x, y = (180, 250)
color = [88, 26, 16]
cv2.putText(source, message, (x, y), cv2.QT_FONT_BLACK, 3, color, thickness=5)
cv2.imwrite('img/s.png', source)

原图source.png

加入信息后的图片s.png

二、预处理载体图片

carrier = cv2.imread('img/carrier.png')
for i in xrange(h):
for j in xrange(w):
# 把整幅图的B通道全设置为偶数
if carrier[i, j, 0] % 2 == 1:
carrier[i, j, 0] -= 1

三、把隐藏信息的位置设置成奇数

for i in xrange(h):
for j in xrange(w):
# 找出有文字的位置
if list(source[i, j]) == color:
carrier[i, j, 0] += 1
cv2.imwrite('img/hide.png', carrier)

加入信息之后的载体图片与原来几乎不变

原载体图片carrier.png

隐藏信息后的图片hide.png

四、信息恢复

img = cv2.imread('img/hide.png')
h, w = img.shape[:2]
# 新建一张图用来放解出来的信息
info = np.zeros((h, w, 3), np.uint8)
for i in xrange(h):
for j in xrange(w):
# 发现B通道为奇数则为信息的内容
if img[i, j, 0] % 2 == 1:
info[i, j, 0] = 255
info[i, j, 1] = 255
info[i, j, 2] = 255
cv2.imwrite('img/info.png', info)

恢复结果info.png

小结

这种信息隐藏的方法,主要是用『修改像素奇偶性后,图片变化不明显』来实现的,感觉非常巧妙。

不过值得注意的是,\(隐写术\neq 加密\),这种信息隐藏的安全性也依赖于算法本身,而不是密码学里的『密钥』。

Python实现图像信息隐藏的更多相关文章

  1. 孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘

    孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天发现了python的类中隐藏着一些特殊的私有方法. 这些私有方法不管我 ...

  2. python实现图片隐藏信息技术

    隐秘通信的3种典型方式: ①将秘密信息隐于网络通信协议中. ②将秘密信息隐于数字签名等密码协议中 . ③将秘密信息隐于数字图像中. 第三种是利用图像或音频数据对人类感官系统的冗余. 隐藏域数字图像中的 ...

  3. 【10】python窗口控制[隐藏,移动]

    步骤一:下载小软件,如下图 该软件用于提取需要控制程序窗口的具体信息 二.程序代码 #__author:"**佳" #date: 2018/10/20 0020 #function ...

  4. BMP图像信息隐藏

    图像隐写算法LSB—Least Significant Bits,又称最不显著位.LSB算法就是将秘密信息嵌入到载体图像像素值得最低有效位,改变这一位置对载体图像的品质影响最小. 原理如下: 以实验用 ...

  5. python+selenium 定位隐藏元素

    定位隐藏要素的原理:页面主要通过“display:none”来控制元素不可见.所以我们需要通过javaScript修改display的值得值为display="block,来实现元素定位的. ...

  6. Python封装与隐藏

      今日内容: 1.封装与隐藏2.property3.绑定方法与非绑定方法 知识点一:封装与隐藏 1.什么封装:   封:属性对外是隐藏的,但对内是开放的   装:申请一个名称空间,往里装入一系列名字 ...

  7. BMP 图像信息隐藏及检测

    原理简介 针对文件结构的信息隐藏方法需详细掌握文件的格式,利用文件结构块之间的关系或根据块数据和块大小之间的关系来隐藏信息. BMP(Bitmap-File)图形文件是 Windows 采用的常见图形 ...

  8. 微信号可以改了?我用 Python 发现了隐藏的 6 大秘密.

    “听说,微信可以改微信号了! ” 不知道谁扯了一嗓子,让办公室变成了欢乐的海洋 张姐流下了激动的泪水:“太好了!姐的年龄终于不用暴露在微信号了!” 很多人学习python,不知道从何学起.很多人学习p ...

  9. 【python】Selenium隐藏控制台解决办法

    一.起因: 使用selenium 驱动浏览器的时候,如果使用headless模式,会有dos窗口弹出,输出监听信息,有时不想看到,很是麻烦. 二.解决办法: 修改源码:Lib \ site-packa ...

随机推荐

  1. Idea设置行注释不显示在行首

    如图:idea使用ctrl+/注释时候,//都在行首,强迫症表示受不了 解决方法如图

  2. [BZOJ1977][BeiJing2010组队]次小生成树

    题解: 首先要证明一个东西 没有重边的图上 次小生成树由任何一颗最小生成树替换一条边 但是我不会证啊啊啊啊啊啊啊 然后就很简单了 枚举每一条边看看能不能变 但有一个特殊情况就是,他和环上的最大值相等, ...

  3. 【AtCoder】AGC031

    A - Colorful Subsequence 答案是 \(\prod_{c = 'a'}^{'z'} (cnt[c] + 1)\) #include <bits/stdc++.h> # ...

  4. 2016-06-19 exshop第5天

    昨天对grails3和spring-security进行了全面的调研并进行了试验,试用下来发现grails3的启动速度.代码修改后刷新速度.内存占用以及架构的设计上更加合理,asset-pipelin ...

  5. HttpWatch入门使用教程

    HttpWatch V10.0.20.0 官方免费版 HttpWatch是强大的网页数据分析工具.集成... HttpWatch Professional V10.0.20.0 官方下载 HttpWa ...

  6. android测试--常用控件测试及测试经验(常见)

    1.图片选择器 ================测试中遇到的问题记录(除表中记录的)================================================== ①.曾出现,断 ...

  7. PHP生成二维码,PHPQRCode

    声明一个方法,直接调用即可 <?php /** * 功能:生成二维码 * @param string $qr_data 手机扫描后要跳转的网址 * @param string $qr_level ...

  8. ConcurrentModificationException(并发修改异常)的分析

    1)介绍 并发修改ConcurrentModificationException错误是开发中一个常见错误,多发生在对一个Collection边遍历边做影响size变化的操作中,下面以ArrayList ...

  9. 基于TensorFlow的MNIST数据集的实验

    一.MNIST实验内容 MNIST的实验比较简单,可以直接通过下面的程序加上程序上的部分注释就能很好的理解了,后面在完善具体的相关的数学理论知识,先记录在这里: 代码如下所示: import tens ...

  10. JS获取验证码后倒计时不受刷新及关闭影响

    HTML部分 <input type="button" id="code_btn" value="获取验证码"> JS部分 // ...