lsb隐写的基本方法matlab,GitHub - RGNil/RG_LSB: 利用python实现LSB隐写算法(我自己改进了LSB算法),并进行了性能分析(psnr、错误率、鲁棒性)...

LSB隐写算法的实现与性能分析

Presented by R.G.

强烈建议点击:本README更好的排版和阅读体验 【Github可能不能正常显示 目录、图片、数学公式】

注:

本README有少量数学公式需要LaTeX支持,github貌似没有原生支持LaTeX,若您在阅读本README时无法正确显示数学公式,请安装支持LaTeX显示的浏览器插件,我推荐 MathJax Plugin for Github 插件

注:如果你的github无法看到图片的话,请参考我的这篇文章

目录大纲

[TOC]

LSB算法简介

LSB全称为 Least Significant Bit(最低有效位),是一种简单而有效的数据隐藏技术。LSB隐写的基本方法是用欲嵌入的秘密信息取代载体图像的最低比特位,原来的图像的高位平面与代表秘密信息的最低平面组成含隐蔽信息的新图像。

1.png

灰度化的图像为单通道格式存储像素,每个像素值在0~255内,而像素的位平面则是对应二进制的像素的各个位。以上图为例,某个像素的值为78,其二进制01001110,从左到右位权依次降低,最左边为最高有效位(MSB,其位权为 $2^7$ ),最右边位最低有效位(LSB,位权为$2^0$)。把每个像素的相同位抽取出来组成一个新的平面,就是所谓的图的位平面。而LSB隐写算法,如其名字,是在LSB也就是最低位平面进行信息嵌入/隐藏。

需要注意的一点是,LSB嵌入的时候,载体图像格式应该为灰度图格式

以著名的Lena图为例,一下是灰度图Lena原图:

lena.bmp

下面是其各个位平面图,从左到右、从上到下位平面依次降低:

2.png

可以看到,位平面越高包含的原图像信息越多,对图像的灰度值贡献越大,并且相邻比特的相关性也越强,反之则相反。LSB最低位平面基本上不包含图像信息了,类似随机的噪点/噪声,因此,可以在此处填入水印/秘密信息。

嵌入示意图如下:

3.png

选取不同位平面嵌入时,LSB算法的保真度:

4.png

LSB算法的基本特点:

LSB是一种大容量的数据隐藏算法

LSB的鲁棒性相对较差(当stego图像遇到信号处理,比如:加噪声,有损压缩等,在提取嵌入信息时会丢失)

常见LSB算法的嵌入方法:

秘密信息在最低位平面连续嵌入至结束,余下部分不作任何处理(典型软件MandelSteg)

秘密信息在最低位平面连续嵌入至结束,余下部分随机化处理(也称沙化处理,典型软件PGMStealth)

秘密信息在最低位平面和次低位平面连续嵌入,并且是同时嵌入最低位平面和次低位平面

秘密信息在最低位平面嵌入,等最低位平面嵌入完全嵌入之后,再嵌入次低位平面

秘密信息在最低位平面随机嵌入

以上五种方式,当嵌入容量不同时,鲁棒性不同

我改进的LSB算法(RG_LSB)

与标准的LSB算法不同,我在设计我的LSB算法的时候,对嵌入的信息进行了随机嵌入,就是水印图像的比特流在嵌入载体图像时,并不是依次嵌入,而是随机选择位置嵌入。

此外,在嵌入时,对水印图像的比特流还进行了01规范化处理(使得嵌入的比特流0和1的个数一样多)。通过 规范化比特流 + 比特流随机嵌入 的方法,能够使得我的LSB算法具有抗击位平面图分析攻击,这里会在之后写一篇LSB隐写分析的文章中具体解释。

由于我增加了 规范化比特流 + 比特流随机嵌入,因此,为了能够提取水印,在嵌入过程中,我的算法会生成2个密钥文件:比特流规范密钥、嵌入位置密钥。所以,我的LSB算法不仅具有隐写术部分,还增加了密码术部分。

这部分可以结合我的代码来具体理解我的LSB算法流程

前期准备(利用genNeedImg.py生成测试所用图像)

编写genNeedImg.py用于生成做本次实验所需的灰度图/二值图,详细介绍看里面的注释:

def genNeedImg(imgPath,size=None,flag='binary'):

'''

用于生成指定大小的灰度图或二值图, imgPath为图像路径

size为tuple类型,用于指定生成图像的尺寸, 如:(512,512),默认为None表示输出原图像尺寸

flag为标志转换类型,默认为binary,可选的值为binary或gray

'''

imgRow = cv.imread(imgPath)

if size != None: # 调整图像尺寸

imgRow= cv.resize(imgRow,size)

imgGray = cv.cvtColor(imgRow,cv.COLOR_RGB2GRAY) # 转换颜色空间为灰度

imgName = imgPath[9:].split('.')[0] # 获取图像原始名称

if flag == 'gray': # 生成灰度图

cv.imwrite('./images/{}_gray.bmp'.format(imgName),imgGray)

print('Gray image generated!')

else: # 生成二值图

ret, imgBinary = cv.threshold(imgGray,127,255,cv.THRESH_BINARY)

prop = int(size[0]*size[1]/(512*512)*100) # 以载体图像为512x512,算生成的水印大小占载体图的百分比

cv.imwrite('./images/{}_binary{}.bmp'.format(imgName,prop),imgBinary)

print('Binary image generated!')

print('threshold:{}'.format(ret)) # 输出转换阈值

测试genNeedImg.py,并生成所需要

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值