机器学习第3章第8节 : 文字信息加密到图片及解密
2017-10-10 12:23
513 查看
机器学习第3章第8节 : 文字信息加密到图片及解密
加密
思路
首先从源图中提取文字图像的信息.记录这个文字图像信息在图像矩阵中的位置.
对载体文件进行预处理,将蓝色像素值全部设为偶数.
将记录的文字信息像素点在载体文件对应位置的蓝色像素值设为奇数.
步骤
读取原图像(将写上需隐藏文字的信息和载体图像),构造图像矩阵.messageImg = cv2.imread(fnMessageImg) baseImg = cv2.imread(fnBaseImg) height = messageImg.shape[0] width = messageImg.shape[1]
在源图像中加上水印文字作为待隐藏文字.
cv2.putText(messageImg,"Hello World!",(20,300),cv2.FONT_HERSHEY_PLAIN,2.0,redColor,thickness = 2)
处理隐藏载体图,将所有的蓝色值变为偶数,以便加入隐藏信息.
#处理隐藏信息载体图 #将所有蓝色值变成偶数 for j in range(0,height): for i in range(0,width): if (baseImg[j,i,0] % 2) == 1: baseImg[j,i,0] -= 1
读取源图像,将源图像文字的像素点的对应位置的蓝色像素值设为奇数.
#读取源图,将信息写人目标图,将有信息的像素点的蓝色值设为奇数 for j in range(0,height): for i in range(0,width): if(messageImg[j,i,0],messageImg[j,i,1],messageImg[j,i,2]) == redColor: baseImg[j,i,0] += 1
代码
#!/usr/bin/env python # -*- coding: utf-8 -*- """ hideMessages.py 图像隐藏信息的原理: 首先从源图中提取文字图像信息 记录这个文字图像信息像素点在图像矩阵的位置 对载体文件进行预处理,将蓝色像素值全部设为偶数 最后将记录的文字信息像素点在载体文件对应位置的蓝色像素值设为奇数 图像隐藏信息解密原理: 提取载体文件中蓝色像素值为奇数的像素点 @author: Oscar """ import cv2 #含有文字的图像 fnMessageImg = "img/test1.jpg" #载体文件 fnBaseImg = "img/test2.jpg" #包含隐藏信息的载体文件 fnSecretImg = "img/secret.jpg" #注意是(b,g,r),而不是(r,g,b) redColor=(0,0,255) if __name__ == "__main__": print(u"正在处理中......") #图像大小 messageImg = cv2.imread(fnMessageImg) baseImg = cv2.imread(fnBaseImg) height = messageImg.shape[0] width = messageImg.shape[1] #加上要隐藏的信息 cv2.putText(messageImg,"Hello World!",(20,300),cv2.FONT_HERSHEY_PLAIN,2.0,redColor,thickness = 2) cv2.namedWindow('messageImg') cv2.imshow('messageImg',messageImg) cv2.namedWindow('baseImg') cv2.imshow('baseImg',baseImg) #处理隐藏信息载体图 #将所有蓝色值变成偶数 for j in range(0,height): for i in range(0,width): if (baseImg[j,i,0] % 2) == 1: baseImg[j,i,0] -= 1 print("changing......",round(50*j / height),"%") mirror_w = width /2 #读取源图,将信息写人目标图,将有信息的像素点的蓝色值设为奇数 for j in range(0,height): for i in range(0,width): if(messageImg[j,i,0],messageImg[j,i,1],messageImg[j,i,2]) == redColor: baseImg[j,i,0] += 1 print("writing.......",round(50*j / height)+50,"%") #保存修改后的目标图,并显示 cv2.namedWindow('secretImg') cv2.imshow('secretImg',baseImg) cv2.imwrite(fnSecretImg,baseImg) cv2.waitKey() cv2.destroyAllWindows()
运行结果(加密)
源图像
载体图像
处理后的图像
解密
4000思路
解密信息是隐藏信息的逆过程,提取载体文件中蓝色像素值为奇数的像素点,将空白图像中的这些像素点对应的位置赋予统一的着色代码
#!/usr/bin/env python # -*- coding: utf-8 -*- """ showHideMessage.py 在之前的信息隐藏后,肉眼观察载体图像,仍无法察觉与之前相比有任何变化. 解密信息与隐藏信息相反,是隐藏信息的逆过程 图像隐藏信息解密原理: 提取载体文件中蓝色像素值为奇数的像素点 @author: Oscar """ import cv2 import numpy as np fn = "secretImg.png" if __name__ == "__main__": print(u"正在读取文件......") img = cv2.imread(fn) height = img.shape[0] width = img.shape[1] imgInfo = np.zeros((height,width,3),np.uint8) for j in range(0,height): for i in range(0,width): if (img[j,i,0] % 2) == 1: #如果蓝色值为奇数,则该像素点为文字 imgInfo[j,i,1] = 255 print(u"正在解密......",round(100*j / height),"%") cv2.imshow('imgInfo',imgInfo) #cv2.imwrite(fn,imgInfo) cv2.waitKey() cv2.destroyAllWindows()
运行结果(解密)
加密后的图片
解密后的图片
笔记
在这里,解密后的图片是黑色背景的原因是使用了numpy.zeros()产生的图像矩阵是BGR(0,0,0),所以背景是黑色.相关文章推荐
- ImageUtils.java:图片处理工具类[裁剪/图片水印/文字水印/缩放补白/Base64加密解密]
- python 识别图片中的文字信息方法
- 微软注册表也加密!解密注册表神秘文字!(转)
- launcher修改--获取widget信息(图片,文字等)(源码追踪)
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
- [走火入魔失眠夜]浅谈管理软件信息安全,用户名、密码的加密解密【附C#配套加密解密源码】
- 加密解密信息摘要算法搜集
- java 对视频和图片进行加密解密[转]
- [走火入魔失眠夜]浅谈管理软件信息安全,用户名、密码的加密解密【附C#配套加密解密源码】
- Java HttpURLConnection 下载图片 图片全是“加密图片”文字,怎么解决?
- png图片结构分析与加密解密原理
- 用Get方式提交信息加密解密
- 字符串、图片的加密解密
- 大堆文字不如几张图片-论信息传递的方式以NodeMCU入门为例
- [走火入魔失眠夜]浅谈管理软件信息安全,用户名、密码的加密解密【附C#配套加密解密源码】
- Java获取Windows7系统剪切板中的文件路径、文字、图片信息
- 在用户上传的图片上加上版权或者一些其他的附加文字信息
- Android 游戏引擎libgdx 图片简单加密解密 生成Pixmap
- 解密加密的URL图片数据