一、 低4位替换隐写技术(隐藏载体是RGB图像)
1、在word文档中写下你的学号及姓名全拼,截图保存为1.bmp.
0120221751luruohan
2、在matlab中读取1.bmp并修改为512X512大小,保存为11.bmp.
I=imread('C:\Users\S3214\Desktop\1.bmp');
n = imresize(I,[512,512]);
imwrite(n,'C:\Users\S3214\Desktop\11.bmp')
imfinfo('C:\Users\S3214\Desktop\11.bmp')
3、参考所附的隐藏算法,将11.bmp隐藏到airplane.bmp中,隐藏后的图像保存为airplane11.bmp.
4、参考所附的复原部分代码,编写脚本,读取airplane11.bmp,将其隐藏的图像提取并显示出来。
彩色图片低4位替换
%文件名:imagehide.m
%函数功能:直接将秘密图像的高4bit隐藏在RGB载体图像的R、G、B层中所选的那一层的低4bit,并将秘密图像提取出来,最后显示。要求载体图像的大小大于等于秘密图像的大小。且秘密图像是二值或灰度图像。
%输入格式:
data=imagehide('D:\1751\picture\airplane.bmp','C:\Users\S3214\Desktop\11.bmp','D:\1751\picture\airplane11.bmp','bmp',3); %修改这个语句文件路径就行
%参数说明:
% cover是载体图像的地址
% massage是秘密图像的地址
% goleimage是隐藏后图像的地址
% pemission是图像的类型
%level是作为的载体的具体层。R为1,G为2,B为3。
%data是隐藏后图像的矩阵
function data=imagehide(cover,massage,goleimage,permission,level)
%提取图像信息并分层
cover = imread(cover,permission);
data=cover;
msg=imread(massage,permission);
[row,col]=size(cover);
cover1=cover(:,:,level);
%置载体图像R层的低4bit为0
for i=1:row
for j=1:col/3
cover1(i,j)=bitand(cover1(i,j),240);
end
end
%置秘密图像的低4bit为0
takemsg4=bitand(msg,240);
%将秘密图像的高4bit右移4位
shiftmsg4=bitshift(takemsg4,-4);
%图像隐藏
for i=1:row
for j=1:col/3
cover1(i,j)=bitor(cover1(i,j),shiftmsg4(i,j));
end
end
%写回并保存
data(:,:,level)=cover1;
imwrite(data,goleimage,permission);
%提取秘密图像信息,检测隐藏效果
data=imread(goleimage,permission);
[row,col]=size(data);
A=data(:,:,level);
for i=1:row
for j=1:col/3
A(i,j)=bitand(A(i,j),15);
end
end
A=bitshift(A,4);
%显示结果
subplot(221),imshow(cover);title('载体图像');
subplot(222),imshow(massage);title('秘密图像');
subplot(223),imshow(data);title('隐藏后的图像');
subplot(224),imshow(A);title('提取的秘密图像');
end
思考:考虑通过低3位替换方法将待隐藏图像的高3位隐藏到载体图像中去(加分题)。 编写脚本并演示你的算法。
二、参照上题做法,将11.bmp隐藏到lena1.bmp中,隐藏后的图像保存为lena11.bmp.(此图为灰度图)再用复原脚本提出隐藏的图像并显示出来。
先将lena1转换成rgb的格式
I=imread('D:\1751\picture\lena1.bmp')
[X,map]=gray2ind(I,8);
imshow(X,map);
imwrite(X,map,'D:\1751\picture\lena2.bmp','bmp');
[X,map]=imread('D:\1751\picture\lena2.bmp');
RGB=ind2rgb(X,map);
set(0,'defaultFigurePosition',[100,100,1000,500]);
set(0,'defaultFigureColor', [1 1 1]);
figure, imshow(X,map);
figure,imshow(RGB);
imwrite(RGB,'D:\1751\picture\lena3.bmp','bmp');
imfinfo('D:\1751\picture\lena3.bmp')
三、猫脸置乱算法
参考所给的代码,编写脚本mycatface1.m,实现图像置乱
1、读入一幅图像(灰度图像或索引图像,如果是彩色图,则进行适当转换)并置乱,置乱后的图像保存为after.bmp。
img=imread('D:\1751\picture\lena1.bmp'); %修改文件路径
imshow(img,[])
[h,w]=size(img);
% 读取图片,相对路径,图像必须是正方形,否则不具备Arnold变换的条件
n=10;%
a=3;b=5;
N=h;%N%N代表图像宽高,宽高要一样
%置乱与复原的共同参数,就相当于密码,有了这几个参数,图片就可以复原
imgn=zeros(h,w);
for i=1:n
for y=1:h
for x=1:w
xx=mod((x-1)+b*(y-1),N)+1; %mod(a,b)就是a除以b的余数?
yy=mod(a*(x-1)+(a*b+1)*(y-1),N)+1;
imgn(yy,xx)=img(y,x);
end
end
img=imgn;
end
imwrite(imgn,'D:\1751\picture\after.bmp'); %修改文件路径
figure;
imshow(imgn,[]) %%置乱后的图片
2、编写置乱复原脚本:mycatface2.m,读取after.bmp,提取其中隐藏的图像并显示出来。
img=imread('D:\1751\picture\lena1.bmp');
imshow(img,[])
[h,w]=size(img);
% 读取图片,相对路径,图像必须是正方形,否则不具备Arnold变换的条件
n=10;%
a=3;b=5;
N=h;%N%N代表图像宽高,宽高要一样
%置乱与复原的共同参数,就相当于密码,有了这几个参数,图片就可以复原
imgn=zeros(h,w);
for i=1:n
for y=1:h
for x=1:w
xx=mod((x-1)+b*(y-1),N)+1; %mod(a,b)就是a除以b的余数?
yy=mod(a*(x-1)+(a*b+1)*(y-1),N)+1;
imgn(yy,xx)=img(y,x);
end
end
img=imgn;
end
figure;
imshow(imgn,[])%%置乱后的图片
%澶嶅師
img=imgn;
for i=1:n
for y=1:h
for x=1:w
xx=mod((a*b+1)*(x-1)-b*(y-1),N)+1;
yy=mod(-a*(x-1)+(y-1),N)+1 ;
imgn(yy,xx)=img(y,x);
end
end
img=imgn;
end
figure
imshow(imgn,[])%复原图
*** 四、在360平台上,自行选做一个信息隐藏实验题。