实验一:MATLAB基本操作实验
【实验目的】:
1.熟悉matlab基本功能;
2.熟悉matlab对图片矩阵的操作;
3.实现LSB信息隐藏
【实验内容】:
■一、图像翻转
■二、LSB的顺序嵌入和提取
■三、LSB的随机嵌入和提取
一.图像翻转
1)使用库函数imread()读取图片;
2)提取图片size:h,w,ch(高度,宽度,通道数);
3)初始化旋转之后的图片矩阵;
4)根据旋转的特点,将矩阵中的值根据向量旋转的特点赋给新矩阵;
pp = round(R*(p-c)+c);
5)选择区域进行图像处理;
对角线分割:if h>=w: image_new = image;
指定位置切割:if h >=150 && h<=300 && w>=150 && w<=300: image_new = image;
6)图像结果显示。
Subplot(331);subplot(332);subplot(333);…subplot(339);
二.LSB的顺序嵌入和提取
1)读取message.txt中的信息,并转化为二进制形式;
f_id = fopen(file,'r');
[msg,len_total] = fread(f_id,'ubit1');
2)读取图像,将图像LSB按位赋值为message中提取的信息;
ste_cover(f1,f2,1) = ste_cover(f1,f2,1) - mod(ste_cover(f1,f2,1),2) + msg(p,1);
3)将新图像写入。
4)注意!!!!!!!!!!不要使用.jpg格式!!!!!!!!!!!
5)将新图像读入(准备进行信息提取);
6)将新图像的LSB提取,并写入新的.txt文件
if bitand(ste_cover(f1,f2,1),1) == 1
fwrite(frr,1,'ubit1');
result(p,1) = 1;
else
fwrite(frr,0,'ubit1');
result(p,1) = 0;
7)查看.txt文件结果,与原文件比对。
8)查看加入隐写噪声后的图片。
三.LSB的随机嵌入和提取
大致内容与上一个实验类似,只不过在选择LSB的时候不是顺序选择位置插入,而是经过了一个位置生成算法randinterval。
[row,col] = randinterval(ste_cover,len_total,key);
randinterval不是内置库函数,是实验手册上的一个随机数生成器,它可以根据key的值唯一的生成随机数序列。这样,只要隐写方和提取方都知道这个key,就可以加密传输数据了。
嵌入:
ste_cover(row(i),col(i),1) = ste_cover(row(i),col(i),1)-mod(ste_cover(row(i),col(i),1),2) + msg(p,1);
提取:
if bitand(ste_cover(row(i),col(i),1),1) == 1
fwrite(frr,1,'ubit1');
result(p,1) = 1;
else
fwrite(frr,0,'ubit1');
result(p,1) = 0;
最终结果也是成功的…
【实验分析】:
性能方面没有测试,不过从结果上说还是比较成功。
其中有一个小插曲,就是我在使用.jpg图片格式进行隐写的时候,通过动态调试发现隐写过程没有任何问题,但在获取的时候,调用库函数imread之后立刻对图像矩阵进行取值分析发现,与所期望的值有些区别。百思不得其解之后,我选择用教材上的.bmp文件形式再做尝试,结果一次成功。
合理分析原因,可能是因为.jpg图片文件在生成时会进行压缩,也许会对LSB有影响。
总体来说是一次成功的实验,希望以后能继续努力!