实验6-阶段复习

该文详细描述了如何使用MATLAB进行图像处理,包括位平面分离来展示图像的各个位平面,RGB图像的颜色分量分离与重组,以及使用LSB(LeastSignificantBit)顺序和随机隐藏技术隐藏与提取信息的过程。还涉及到了4bit直接替换法的信息隐藏方法,并提供了相应的MATLAB代码示例。
摘要由CSDN通过智能技术生成
  • 实验题目(此栏实验前由老师填写)

  • 位平面分离

编码实现:


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
    1. 读入一个灰度图。

    1. 按位分离出8个位平面,并保存到磁盘上。

    1. 显示各个位平面。

***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的数字水印嵌入与提取”实验

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值