Python实现图像信息隐藏

Stella981
• 阅读 563

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

Python实现图像信息隐藏

加入信息后的图片s.png

Python实现图像信息隐藏

二、预处理载体图片

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

Python实现图像信息隐藏

隐藏信息后的图片hide.png

Python实现图像信息隐藏

四、信息恢复

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

Python实现图像信息隐藏

小结

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

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

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
2年前
10、图像的几何变换——平移、镜像、缩放、旋转、仿射变换
1.几何变换的基本概念  图像几何变换又称为图像空间变换,它将一副图像中的坐标位置映射到另一幅图像中的新坐标位置。我们学习几何变换就是确定这种空间映射关系,以及映射过程中的变化参数。图像的几何变换改变了像素的空间位置,建立一种原图像像素与变换后图像像素之间的映射关系,通过这种映射关系能够实现下面两种计算:1.原图像任意像素
Stella981 Stella981
2年前
LayoutLM——文本与布局的预训练用于文档图像理解
摘要:预训练技术近年来在多种NPL任务中取得了广泛的成功。尽管广泛的NPL应用的预训练模型,其大多聚焦于文本级别的操作,而忽略了布局与风格信息,这对文档图像的理解至关重要。该篇论文提出了LayoutLM来联合建模扫描文档图像的文本与布局信息关系,这将有益于真实世界中大量的图像理解任务,如文档图像的信息提取。此外,可以利用图像特征合并文字的视觉信息到
Stella981 Stella981
2年前
C++ OpenCV特征提取之积分图计算
前言什么是积分图像积分图像的定义:取图像左上侧的全部像素计算累加和,并用这个累加和替换图像中的每一个像素,使用这种方式得到的图像称为积分图像。为什么要用积分图像直方图的计算方法为遍历图像的全部像素并累计每个强度值在图像中出现的次数。有时仅需要计算图像中某个特定区域的直方图,而
Stella981 Stella981
2年前
Serverless 实战:用 20 行 Python 代码轻松搞定图像分类和预测
图像分类是人工智能领域的一个热门话题,通俗来讲,就是根据各自在图像信息中反映的不同特征,把不同类别的目标区分开。图像分类利用计算机对图像进行定量分析,把图像或图像中的每个像元或区域划归为若干个类别中的某一种,代替人的视觉判读。在实际生活中,我们也会遇到图像分类的应用场景,例如我们常用的通过拍照花朵来识别花朵信息,通过人脸匹对人物信息等。通常,图像识别或分
Stella981 Stella981
2年前
Python骚操作:利用Python获取摄像头并实时控制人脸!
实现流程从摄像头获取视频流,并转换为一帧一帧的图像,然后将图像信息传递给opencv这个工具库处理,返回灰度图像(就像你使用本地静态图片一样)程序启动后,根据监听器信息,使用一个while循环,不断的加载视频图像,然后返回给opencv工具呈现图像信息。创建一个键盘事件监听,按下"d"键,则开始执行面部匹配,并进行面具加
Stella981 Stella981
2年前
Dicom关键概念
数据格式    DICOM将信息分组到datasets中,这意味着胸部X射线图像的文件实际上包含文件中的患者ID,因此图像永远不会被错误地与该信息分开。类似的,JPEG等图像格式也可以使用嵌入式tags中。    DICOM数据对象由许多属性组成,包括名字,ID等,还有一个包含图像像素数据的特殊属性。单个DICOM对象只能包含一个包含像素数
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
马尚 马尚
1星期前
验证码识别实战
验证码是网站常用的一种安全验证手段,但是对于自动化程序来说,验证码可能是个难题。本文将介绍如何使用Python和一些常用的库来识别验证码图像。步骤1:预处理图像首先,我们需要对验证码图像进行预处理,以便更好地提取图像中的文本信息。预处理包括灰度化和二值化。