机器学习第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()
运行结果(加密)
源图像
载体图像
处理后的图像
解密
思路
解密信息是隐藏信息的逆过程,提取载体文件中蓝色像素值为奇数的像素点,将空白图像中的这些像素点对应的位置赋予统一的着色
代码
#!/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),所以背景是黑色.