- 实验题目(此栏实验前由老师填写)
- 位平面分离
编码实现:
X=double(rgb2gray(imread('D:\1751\pic\airplane.bmp')));%将原始图像转换为灰度图像,如果本身就是灰度图可以去掉rgb2gray函数
[h w] = size(X);
subplot(3,3,1);
imshow(X,[]);
title('原始图像');
for k=1:8
for i=1:h
for j=1:w
tmp(i,j) = bitget(X(i,j),k);%bitget函数首先将X(i,j)处灰度值分解为二进制串,然后取第k位
end
end
subplot(3,3,k+1);
imshow(tmp,[]);
ind = num2str(k);
imwrite(tmp,['D:\1751\pic\',ind,'.bmp'],'bmp')
imti = ['第',ind,'个位平面'];
title(imti);
end
-
- 读入一个灰度图。
-
- 按位分离出8个位平面,并保存到磁盘上。
-
- 显示各个位平面。
***4、分别读取前述的8个位平面图,合成为一个灰度图。
A = imread('D:\1751\pic\houses.bmp');
Array=cell(1,8);
% 显示8个位平面图像
for i=8:-1:1Array{i} = bitshift(bitget(A,i),i-1);
end %%%复原
%%定义全0矩阵
[M,N]=size(Array{1});
B=zeros(M,N,'uint8');for i=1:8B=bitset(B,i,bitget(Array{i},i));
end
figure;
subplot(1,2,1);
imshow(A);title('原始图像');
subplot(1,2,2)
imshow(B);title('复原后图像')
- RGB图像颜色分量分离
编写代码实现:
1、读入一个RGB图像。
2、按RGB图像颜色分量分离。分别保存到磁盘中。
3、显示各个颜色分量。
P=imread('D:\1751\pic\flowers.bmp'); %载入图片
figure;
%提取图像三通道信息
R1=P;G1=P;B1=P;
R1(:,:,2)=0;R1(:,:,3)=0;G1(:,:,1)=0;G1(:,:,3)=0;B1(:,:,1)=0;B1(:,:,2)=0;
%保存图像
imwrite(R1,'D:\1751\pic\R1.png','png');
imwrite(G1,'D:\1751\pic\G1.png','png');
imwrite(B1,'D:\1751\pic\B1.png','png');
% 显示图像
subplot(1,3,1);imshow(R1,[]);title('R通道');
subplot(1,3,2);imshow(G1,[]);title('G通道');
subplot(1,3,3);imshow(B1,[]);title('B通道');
4、分量合成:
编辑代码实现:
(1)读取上述的三个颜色分量对应的图片
(2)合成为RGB图像并显示出来。
R=imread('D:\1751\pic\R1.png');
G=imread('D:\1751\pic\G1.png');
B=imread('D:\1751\pic\B1.png');
RGB1(:,:,1)=R(:,:,1);
RGB1(:,:,2)=G(:,:,2);
RGB1(:,:,3)=B(:,:,3);
imwrite(RGB1,'D:\1751\pic\RGB1.png');
imshow(RGB1);
三、 LSB顺序隐藏技术
1、创建文本文件f1.txt,保存你的学号及姓名全拼。
2、在所给的图像中任选一个(灰度图或RGB图像),编写代码,使用LSB顺序隐藏技术,把secure01.txt隐藏到图像中去,并保存隐藏后的图像。
3、显示隐藏前后的图像。
4、显示隐藏前后图像的差别图像。
%文件名:lsbhide.m
%程序员:李巍
%编写时间:2004.2.29
%函数功能:本函数将完成在LSB上的顺序信息隐秘
[ste_cover,len_total]=lsbhide('D:\1751\\pic\lenna.bmp','D:\1751\pic\secure01.txt','D:\1751\pic\lena02.bmp');
%参数说明:
%input是信息隐秘载体图像
%file是秘密消息文件
%output是信息隐秘后生成图像
%ste_cover是信息隐秘后图像矩阵
%len_total是秘密消息的长度,即容量
function [ste_cover,len_total]=lsbhide(input,file,output)
%读入图像矩阵
cover=imread(input);
ste_cover=cover;
ste_cover=double(ste_cover);
%将文本文件转换为二进制序列
f_id=fopen(file,'r');
[msg,len_total]=fread(f_id,'ubit1');
%判断嵌入消息量是否过大
[m,n]=size(ste_cover);
if len_total>m*n
error('嵌入消息量过大,请更换图像');
end
%p作为消息嵌入位数计数器
p=1;
for f2=1:n
for f1=1:m
ste_cover(f1,f2)=ste_cover(f1,f2)-mod(ste_cover(f1,f2),2)+msg(p,1);
if p==len_total
break;
end
p=p+1;
end
if p==len_total
break;
end
end
ste_cover=uint8(ste_cover);
imwrite(ste_cover,output);
%显示实验结果
subplot(1,2,1);imshow(cover); title(' 原始图像 ');
subplot(1,2,2);imshow(output);title('隐藏信息的图像');
end
5、提取隐藏的信息,保存为f2.txt.显示文件内容。
%文件名:lsbget.m
%程序员:李巍
%编写时间:2004.2.29
%函数功能:本函数将完成提取隐秘于LSB上的秘密消息
%输入格式举例:
result=lsbget('D:\1751\pic\lena02.bmp',156,'D:\1751\pic\f2.txt');
%参数说明:
%output是信息隐秘后的图像
%len_total是秘密消息的长度
%goalfile是提取出的秘密消息文件
%result是提取的消息
function result=lsbget(output,len_total,goalfile)
ste_cover=imread(output);
ste_cover=double(ste_cover);
%判断嵌入消息量是否过大
[m,n]=size(ste_cover);
frr=fopen(goalfile,'a');
%p作为消息嵌入位数计数器,将消息序列写回文本文件
p=1;
for f2=1:n
for f1=1:m
if bitand(ste_cover(f1,f2),1)==1
fwrite(frr,1,'ubit1');
result(p,1)=1;
else
fwrite(frr,0,'ubit1');
result(p,1)=0;
end
if p==len_total
break;
end
p=p+1;
end
if p==len_total
break;
end
end
fclose(frr);
end
***6、LSB随机隐藏的实现:对上述问题,采用随机隐藏的算法再实现一次,并比较隐藏前后图像的差别图像。
%文件名:randlsbhide.m
%程序员:李巍
%编写时间:2004.3.2
%函数功能:本函数将完成随机选择LSB的信息隐秘
%输入格式举例:
[ste_cover,len_total]=randlsbhide('D:\1751\pic\lenna.bmp','D:\1751\pic\secure01.txt','D:\1751\pic\lena03.bmp',213);
%参数说明:
%input是信息隐蔽载体图像
%file是秘密消息文件
%output是信息隐秘后生成图像
%key是随机间隔函数的密钥
%ste_cover是信息隐秘后图像矩阵
%len_total是秘密消息的长度,即容量
function [ste_cover,len_total]=randlsbhide(input,file,output,key)
%读入图像矩阵
cover=imread(input);
ste_cover=cover;
ste_cover=double(ste_cover);
%将文本文件转换为二进制序列
f_id=fopen(file,'r');
[msg,len_total]=fread(f_id,'ubit1');
%判断嵌入消息量是否过大
[m,n]=size(ste_cover);
if len_total>m*n
error('嵌入消息量过大,请更换图像');
end
%p作为消息嵌入位数计数器
p=1;
%调用随机间隔函数选取像素点
[row,col]=randinterval(ste_cover,len_total,key);
%在LSB隐秘消息
for i=1:len_total
ste_cover(row(i),col(i))=ste_cover(row(i),col(i))-mod(ste_cover(row(i),col(i)),2)+msg(p,1);
if p==len_total
break;
end
p=p+1;
end
ste_cover=uint8(ste_cover);
imwrite(ste_cover,output);
%显示实验结果
subplot(1,2,1);imshow(cover); title(' 原始图像 ');
subplot(1,2,2);imshow(output);title('隐藏信息的图像');
end
%文件名:randlsbget.m
%程序员:李巍
%编写时间:2004.2.29
%函数功能:本函数将完成提取隐秘于LSB上的秘密消息
%输入格式举例:
result=randlsbget('D:\1751\pic\lena03.bmp',156,'D:\1751\pic\secure03.txt',1988)
%参数说明:
%output是信息隐秘后的图像
%len_total是秘密消息的长度
%goalfile是提取出的秘密消息文件
%key是随机间隔函数的密钥
%result是提取的消息
function result=randlsbget(output,len_total,goalfile,key)
ste_cover=imread(output);
ste_cover=double(ste_cover);
%判断嵌入消息量是否过大
[m,n]=size(ste_cover);
frr=fopen(goalfile,'a');
%p作为消息嵌入位数计数器,将消息序列写回文本文件
p=1;
%调用随机间隔函数选取像素点
[row,col]=randinterval(ste_cover,len_total,key);
for i=1:len_total
if bitand(ste_cover(row(i),col(i)),1)==1
fwrite(frr,1,'ubit1');
result(p,1)=1;
else
fwrite(frr,0,'ubit1');
result(p,1)=0;
end
if p==len_total
break;
end
p=p+1;
end
fclose(frr);
end
四、4bit直接替换法
编码实现:
1、读取一个灰度图(cover)(如果是RGB图像,则取其中一个颜色分量),每个像素的低4位置0.
2、读取一个待隐藏的灰度图(secure),每个像素低4位清0,再将高4位移至低4位
3、将cover的每个像素的低4位用secure的像素低4位替换。
4、保存替换结果,并显示出来(ste-cover)。
cover = imread('D:\1751\pic\houses.bmp') ;
ste_cover = cover;
ste_cover=double(ste_cover);
f_id = fopen('D:\1751\pic\sec.txt', 'r') ;
[ msg, len_total] = fread( f_id, 'ubit1');
[ m, n] = size( ste_cover) ;
if len_total > m*n
error( '嵌入的信息量太大') ;
end
p = 1;
for f2 = 1:n
for f1 = 1:m
%ste_cover( f1, f2) = ste_cover( f1, f2) -mod( ste_cover( f1, f2) , 2) + msg( p, 1) ;
ste_cover( f1, f2) = bitand(ste_cover( f1, f2), 254) ;
ste_cover( f1, f2) = ste_cover( f1, f2) + msg( p, 1) ;
if p == len_total
break;
end
p = p + 1;
end
if p == len_total
break;
end
end
ste_cover = uint8( ste_cover) ; %生成隐密后的图像;
imwrite( ste_cover, 'D:\1751\pic\houses02.bmp') ; %显示隐藏结果;
subplot( 1, 2, 1) ; imshow( cover) ; title( '原始图像') ;
subplot( 1, 2, 2) ; imshow( 'houses02.bmp') ; title( '隐藏信息后的图像');
5、编写代码实现提取功能
(1)读取ste-cover.
(2)定义图像变量,把ste-cover中提取的低4位,保存至该图像变量并移动至高4位。显示该图像变量。
%文件名:lsbget.m
%函数功能:本函数将完成提取隐秘于LSB上的秘密消息
%输入格式举例:result=lsbgetnew('d.bmp',1736,'secret.txt');
%参数说明:
%output是信息隐秘后的图像
%len_total是秘密消息的长度
%goalfile是提取出的秘密消息文件
%result是提取的消息
%function result=lsbgetnew(output,len_total,goalfile)
ste_cover=imread('D:\1751\pic\houses02.bmp');
ste_cover=double(ste_cover);
%判断嵌入消息量是否过大
[m,n]=size(ste_cover);
frr=fopen('D:\1751\pic\sec02.txt','w');
%p作为消息嵌入位数计数器,将消息序列写回文本文件
p=1;
for f2=1:n
for f1=1:m
if bitand(ste_cover(f1,f2),1)==1
fwrite(frr,1,'ubit1');
result(p,1)=1;
else
fwrite(frr,0,'ubit1');
result(p,1)=0;
end
if p==len_total
break;
end
p=p+1;
end
if p==len_total
break;
end
end
fclose(frr);
五、exer6.bmp、exer7.bmp图像中隐藏有一段文字,请尝试编写提取程序提取隐藏的信息。
%文件名:lsbget.m
%程序员:李巍
%编写时间:2004.2.29
%函数功能:本函数将完成提取隐秘于LSB上的秘密消息
%输入格式举例:
result=lsbgetrgb('D:\1754\pic\exer6.bmp',944,'D:\1754\secret.txt',2);
%参数说明:
%output是信息隐秘后的图像
%len_total是秘密消息的长度
%goalfile是提取出的秘密消息文件
%result是提取的消息
function result=lsbgetrgb(output,len_total,goalfile,level)
ste_cover=imread(output);
ste_cover=ste_cover(:,:,level);
ste_cover=double(ste_cover);
%判断嵌入消息量是否过大
[m,n]=size(ste_cover);
frr=fopen(goalfile,'a');
%p作为消息嵌入位数计数器,将消息序列写回文本文件
p=1;
for f2=1:n
for f1=1:m
if bitand(ste_cover(f1,f2),1)==1
fwrite(frr,1,'ubit1');
result(p,1)=1;
else
fwrite(frr,0,'ubit1');
result(p,1)=0;
end
if p==len_total
break;
end
p=p+1;
end
if p==len_total
break;
end
end
fclose(frr);
end
六、蓝盾平台隐写题练习
登录蓝盾平台:10.10.84.82
(1) 完成“基于LSB的数字水印嵌入与提取”实验