一、实验目的
(1) 掌握基于 python 的数字音频及图片常用操作方法;
(2) 了解音频和图像变换系数特点,掌握离散余弦和时空域基本操作;
(3) 了解 LSB 隐写技术原理,掌握 LSB 隐写及提取基本操作。
二、实验环境
(1) Windows 11操作系统;
(2) Python3.7;
(3) 图像文件;
(4) 音频文件。
三、实验步骤和结果
1.选取文件夹中的图片“test.bmp”,将其转为灰度图。
“test.bmp”如下所示:
将其转化为灰度图的具体操作如下:
(1)使用函数imread读取图片,并设置参数cv2.IMREAD_GRAYSCALE将原始彩色图像像素转换灰度图像像素;
(2)使用函数resize通过插值的方式改变图片尺寸,将期望的输出图像大小尺寸dsize设置为512*512;
(3)使用函数imwrite将转换后的灰度图保存为BMP文件,并命名为flag.bmp;
(4)使用函数imshow对比展示原始彩图图像与转换后的灰度图像。
运行代码后的结果如下(其中第一行第一列输出彩色图,标注的名称为“彩色图像”,第一行第二列为灰度图像,标注的名称为“灰度图像”。同时这个输出的名称为“2020211950+刘綦勋+彩色图和灰度图对比”):
2. 在灰度图中使用 LSB 隐写技术隐藏秘密信息“BUPT”。
(1)选取秘密信息“BUPT”,其ASCII码为:
(2)使用generate(msg)函数转为二进制转化结果如下,为32bit的秘密信息:
3.对比隐写前后的图像,在屏幕中一行两列输出。
如下所示,第一行第一列输出原始灰度图,标注的名称为“载体图像”,第一行第二列为嵌入秘密信息后的图像,标注的名称为“携密图像”。同时这个输出的名称为本人的学号+姓名+载体图和携密图对比(2020211950+刘綦勋+载体图和携密图对比):
对比两张图片,通过肉眼观察发现并没有明显的区别。
4. 提取隐藏的LSB隐写信息,对比原信息,判断是否提取成功。
(1)将含有隐写信息的图片encode.bmp读入程序中,然后提取其最低位的信息,并还原为二进制信息,结果如下:
可以看到,上图的32bit的秘密信息和之前加密得到的是一致的。
(2)转成文本,可以看到提取的文本信息是BUPT:
4. 提取隐藏的LSB隐写信息,对比原信息,判断是否提取成功。
(1)将含有隐写信息的图片encode.bmp读入程序中,然后提取其最低位的信息,并还原为二进制信息,结果如下:
可以看到,上图的32bit的秘密信息和之前加密得到的是一致的。
(2)转成文本,可以看到提取的文本信息是BUPT:
5. 计算携密图像的峰值信噪比。
峰值信噪比取小数点后四位,读取原始图像flag.bmp和隐写后的图像encode.bmp,然后可以根据公式计算其峰值信噪比。
由于实验原始代码在嵌入的过程中是将像素值-1(例如150减去1,变成149),而嵌入本来是可以-1也可以+1的,因此接下来展示-1和+1两种情况得到的峰值信噪比(还需要注意,嵌入时是既可以按行操作也可以按列操作,因此总共有4种情况,对应有4个不同的峰值信噪比的值,下面展示的是像素值+1、-1并按列操作的两种情况)
(1)像素值-1并按列操作
如下图所示,计算可以得到原始图片和隐写后的图片的峰值信噪比是86.5184。
(2)像素值+1并按列操作
如下图所示,计算可以得到原始图片和隐写后的图片的峰值信噪比是89.7635。
四、实验遇到的问题及解决方法
1.在运行相应的脚本时,pycharm报错,原因是没有安装相应的包。使用“pip install 包”这个命令,解决了问题。
2.在将打印的图像的标注设置为中文时,会无法正常显示:
解决方法是,在代码中添加如下语句:
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
重新运行代码,便能够正常显示中文了:
3.原给的encode.py代码是处理彩色图像的,不能直接拿来处理灰度图像。解决方法:将源代码的主干部分修改为如下即可:
4..默认输出的峰值信噪比的小数位数不为4,要解决这个问题,只需导入decimal模块,并在代码最后输入相应语句即可。
五、实验心得体会和思考
通过本次信号处理基础实验,我更加深入地了解了信息隐藏和数字水印的基础技术,较好地掌握了LSB隐写及提取的基本操作,在理论基础和动手实践方面都得到了很大的提升,这些都是仅在课堂学习中获取不到的宝贵经验,正所谓“实践方能出新知”。
同时,我对python这门语言以及相应的开发工具(pycharm)的使用有了更进一步的熟练掌握,也真真切切地感受到了编程语言应用于实际场景的快捷和便利。