一、前言

在某个App中有一个加密水印的功能,当帖子的主人开启了之后。如果有人截图,那么这张截图中就是添加截图用户、帖子ID、截图时间等信息,而且我们无法用肉眼看出这些水印。

这可以通过今天要介绍的隐写技术来实现,我们会通过这种技术,借助Python语言和OpenCV模块来实现在图像中隐藏二维码的操作。而且这个二维码无法通过肉眼看出。

二、隐写

隐写是一种类似于加密却又不同于加密的技术。通常情况下,加密是对数据本身进行一个转换,得到的结果是一堆人无法解读的数据,比如“你好”进行md5加密后的结果是“7eca689f0d3389d9dea66ae112e5cfd7”,如果光看“7eca689f0d3389d9dea66ae112e5cfd7”我们不知道内容,但是我们知道这应该是加密后的数据。隐写的目的同样是让只有接收方才能获取数据,但是隐写通常更加隐蔽,隐写更注重于不让第三方知道我发送的数据中有额外信息。

就像我们在电影中经常看到的一些剧情,一场看似普通的对话却隐含了许多外人不知道的信息,这实际上就是一种隐写。再比如“This is a pig”,看上去像一个普通的句子,如果通信双方规定“T、i、s”这些占三线格上两个的字母表示0,而“p、g”这种占三线格下两格的字母表示1,那么这句话就可以翻译成“0000000101”。而今天我们要介绍的是“最低有效位”隐写。

三、位平面分解

在介绍“最低有效位”隐写之前,需要了解一些图像相关的知识。这里包括数字图像、位平面、位平面分解。

3.1 图像

在计算机中,图像被表示为一个数字矩阵,每个数字被称为一个像素,它们的取值在[0, 255]区间,可以用8个二进制来表示。

这个矩阵大小由图像分辨率决定,如果是480×480分辨率的图像,那么这个矩阵大小就是480×480。如果是彩色图像,会用三个大小相同的矩阵合起来表示,它们分别表示图像R(红色)、G(绿色)、B(蓝色)的程度,也就是俗称的RGB图像。

我们可以用OpenCV来读取图像,OpenCV的安装如下:

pip install opencv-python

安装完成后就可以读取图像:

# 导入模块
import cv2
# 读取图像
img = cv2.imread('test.jpg')
# 输出图像
print(img)

其中test.jpg就是我们的图像名称或者图像路径。上面代码输出结果如下:

[[[ 72 220 234]
  [ 72 220 234]
  [ 73 221 235] 
  ...
  [ 87 147 176]
  [ 87 147 176]
  [ 87 147 176]]]

因为输出过长,这里省略了一部分内容。

3.2 位平面

在前面我们说了一个图像是一个数字矩阵,比如:

[[2, 2]
[3, 4]]

我们可以理解为一张简单的图像,现在我们把图像的像素值写成二进制形式:

[[0000 0010, 0000 0010],
[0000 0011, 0000 0100]]

我们把四个像素的最高位取出,得到新的图像:

[[0, 0]
[0, 0]]

这个过程的图示如下:

这里取出来的图像就叫位平面,因为是取出第7位(从左到右依次是7-0)组成的图像,所以叫第7位平面,也叫最高位平面。而第0位平面也叫“最低有效位”位平面。

如果取出第1位,得到的图像为:

[[1, 1],
[1, 0]]

这个图像叫第1位平面。这里需要注意一点,就是每个位平面的实际值应该乘一个权重,这个权重位i2,即第7位平面的权重位72。

3.3 位平面分解

下面我们看看如何分解位平面,分解位平面可以用cv2.bitwise_and函数来实现。我们需要传入一个图像以及一个分解因子,各个位平面的分解因子如下:

分解因子 作用
0x80 分解第7位平面
0x40 分解第6位平面
0x20 分解第5位平面
0x10 分解第4位平面
0x08 分解第3位平面
0x04 分解第2位平面
0x02 分解第1位平面
0x11 分解第0位平面

比如分解第7位平面的操作为:

import cv2
# 读取图像
img = cv2.imread('test.jpg', 0)
# 分解第7位平面
layer = cv2.bitwise_and(img, 0x80)

其它位平面的分解只需要对照表进行修改即可。

3.4 位平面合成

假如我们以及分解出来8个位平面,分别是M0、M1、…、M7。我们只需要将各个位平面乘上对应的权重,然后相加就能恢复原图,即:

如果我们只对M1-M7进行合成,得到的A`与A的差距最多为1,因此我们可以让A`≈A。此时图像A`的第0个位平面可以用于隐藏数据。

四、图像隐写

这里我们使用一种叫“最低有效位”位平面隐写的技术来实现二维码的隐藏。其原理就是把图像“最低有效位”位平面设置为0,此时图像与原图像像素相差最大为0,人肉眼无法看出区别。然后我们可以在图像的最低有效位任意设置值,此时图像与原图像素相差最大仍是1。这样我们就可以用“最低有效位”位平面来隐写数据。

在前面我们合成原图时用M1-M7,而M0位平面则全为0,这时我们可以用最低有效位存储数据。假如我们的数据矩阵为M,该矩阵为一个0-1矩阵。而二维码就是一个黑白矩阵,我们可以把黑当作0,白当作1,这样我们让M为一个二维码的矩阵。现在我们通过下面的公式来合成:

这个A就是带有隐写信息的图像。代码实现如下:

import cv2
# ①读取图像
img = cv2.imread('test.jpg', 0)
# ②把最低有效位清空
img -= cv2.bitwise_and(img, 0x01)
# ③准备需要隐写的信息M
M = cv2.imread('qrcode.jpg', 0)
M = cv2.resize(M, img.shape)
# 把二维码转换成0-1矩阵
_, M = cv2.threshold(M, 30, 1, cv2.THRESH_BINARY)
# ④将要隐写的数据设置到图像最低有效位
img  = M
# ⑥以无损的方式保存隐写后的
cv2.imwrite('dst.png', img, [int(cv2.IMWRITE_JPEG_QUALITY), 100])

最后保存的dst.png就是我们隐写后的图像。

二维码的生成可以参考详解Python如何生成优雅的二维码

到此这篇关于Python实现在图像中隐藏二维码的方法详解的文章就介绍到这了,更多相关Python图像隐藏二维码内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Python实现在图像中隐藏二维码的方法详解的更多相关文章

  1. 手对手的教你用canvas画一个简单的海报的方法示例

    企业的广告投入开始从电视等传统媒体向基于圈层文化的新媒体精准营销转移,很多人都想制作一张属于自己的海报,本文介绍了手对手的教你用canvas画一个简单的海报的方法示例,感兴趣的可以了解一下

  2. XCode 3.2 Ruby和Python模板

    在xcode3.2下,我的ObjectiveCPython/Ruby项目仍然可以打开更新和编译,但是你无法创建新项目.鉴于xcode3.2中缺少ruby和python的所有痕迹(即创建项目并添加新的ruby/python文件),是否有一种简单的方法可以再次安装模板?我发现了一些关于将它们复制到某个文件夹的信息,但我似乎无法让它工作,我怀疑文件夹的位置已经改变为3.2.解决方法3.2中的应用程序模板

  3. Swift AVFoundation 二维码扫描和生成

    项目终于不需要支持iOS6了(泪崩),在二维码扫描这一块,能够完全的放弃ZXing库,改用系统的AVFoundation了,拿swift写了个Demo,效果如下:github地址:点这里有关AVFoundation和CoreImage(滤镜等),可以先看看objc.io第21期和第23期的有关介绍.初始化视频捕捉PS:LZ用了下微信和新浪微博的扫一扫,发现那个扫描框是忽悠人的,也就是你没拿它对准二维码,只要二维码进入手机摄像头范围,就能够解码成功…

  4. Swift基本使用-函数和闭包(三)

    声明函数和其他脚本语言有相似的地方,比较明显的地方是声明函数的关键字swift也出现了Python中的组元,可以通过一个组元返回多个值。传递可变参数,函数以数组的形式获取参数swift中函数可以嵌套,被嵌套的函数可以访问外部函数的变量。可以通过函数的潜逃来重构过长或者太复杂的函数。

  5. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  6. Swift - 生成二维码

    CIFilter提供了各种各样的滤镜,其中CiqrCodeGenerator可以用来生成二维码。下面通过一个样例演示如何将字符串生成二维码图片,同时支持在二维码中间放置个性化图标。效果图如下:代码如下:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263importUIKitclassViewController:UIView

  7. Swift - 二维码QRCode的读取

    1,直接读取图片中的二维码使用CIDetector可以很方便的检测并读取二维码。context=CIContextdetector:CIDetectorfeatures=detector.featuresInImageprint//遍历所有的二维码,并框出forfeatureinfeaturesas![CiqrCodeFeature]{}}didReceiveMemoryWarning(){.didReceiveMemoryWarning()}}控制台输出如下:扫描到二维码个数:2http://www.h

  8. Swift系统自带二维码的扫描使用

    session.canAddInput{return}//判断是否能够将输出添加到回话中if!session.canAddOutput{return}//将输入和输出添加到回话中session.addInputsession.addOutput//设置输入能够解析的数据类型//设置能解析的数据类型,一定要在输出对象添加到会员之后设置output.MetadataObjectTypes=output.availableMetadataObjectTypes//设置输出对象的代理,只要解析成功,就会通知代理o

  9. swift系统自带二维码的生成

    .setDefaults()//设置需要生成二维码的数据filter?.setValue//从滤镜中取出生成的图片letciImage=filter?.outputimage//这个清晰度不好//letbgImage=UIImage(CIImage:ciImage!,size:300)//创建一个头像leticon=UIImage//合成图片letnewImage=creatimage(bgImage,iconImage:icon!)//返回生成好的二维码returnnewImage}//MARK:-根据

  10. swift编程语言简单开发二维码扫描

    )类型8.do{9.letinput=tryAVCaptureDeviceInput10.returninput11.}catch{12.print13.returnnil14.}15.}()16.//创建会话/输出比较简单只需要创建一个对象17.privatelazyvarsession:AVCaptureSession=AVCaptureSession()18.//创建输出设备19.privatelazyvardeviceOutput:AVCaptureMetadataOutput=AVCapture

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部