机器学习第3章第8节 : 文字信息加密到图片及解密

机器学习第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()

运行结果(加密)

源图像

messageImg

载体图像

baseImg

处理后的图像

secretImg


解密


思路

解密信息是隐藏信息的逆过程,提取载体文件中蓝色像素值为奇数的像素点,将空白图像中的这些像素点对应的位置赋予统一的着色


代码

#!/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()

运行结果(解密)

加密后的图片

secretImg

解密后的图片

showMessage


笔记

在这里,解密后的图片是黑色背景的原因是使用了numpy.zeros()产生的图像矩阵是BGR(0,0,0),所以背景是黑色.

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值