实验11-基于调色板的信息隐藏技术

 

  • 实验题目(此栏实验前由老师填写)

一、在彩色图像中基于调色板实现隐藏信息。
      (代码见PPT)

clc;
clear;
%读取载体图像
A=imread('lenna.bmp');
[ind,map1]=rgb2ind(A,128);
imwrite(ind,map1,'lenna.bmp');
[x,map]=imread('lenna.bmp','bmp');
wx=x;
[row,col]=size(wx);
wmap=map;
msgfid=fopen('hidden.txt','r');
[msg,count]=fread(msgfid,'ubit1');
fclose(msgfid);
%count=count*8;
%msg = str2bit(msg);
%msg=msg';
oplength=0;
for i=1:256
if map(i,1)~=0||map(i,2)~=0||map(i,3)~=0 
    %检查原调色板中颜色分量值不全为0的数量
oplength=oplength+1;
end
end
%复制调色板
for i=oplength+1:oplength*2
wmap(i,1)=map(i-oplength,1);
wmap(i,2)=map(i-oplength,2);
wmap(i,3)=map(i-oplength,3)+0.0001;

end

for i=1:count

if msg(i,1)==1
wx(i)=x(i)+oplength;
end
end
%imwrite(wx,wmap,'lenaindex1.bmp','bmp');
imwrite(wx,wmap,'hsrgbindex.bmp','bmp');
figure;
subplot(1,2,1);imshow('lenna.bmp');title('原图像');
subplot(1,2,2);imshow('hsrgbindex.bmp');title('隐密图像');

二、对第一题的隐藏的信息编写代码完成提取实现。
      (代码见PPT)


clc;
clear;
%读取隐密图像
[x,map] = imread('hsrgbindex.bmp','bmp');

count=150;
fid=fopen('hidden02.txt', 'w');

oplength=128;
 
 for i=1:count
     if x(i)>oplength
        
          fwrite(fid,1,'ubit1');
     else
      
          fwrite(fid,0,'ubit1');
     end     
 end
  
fclose(fid);    

三、完成小测试4(复习)。

     

 隐藏

%文件名:lsbhide.m
%程序员:李巍
%编写时间:2004.2.29
%函数功能:本函数将完成在LSB上的顺序信息隐秘
%输入格式举例:[ste_cover,len_total]=lsbhide('lenna.bmp','msg.txt','d.bmp');
%参数说明:
%input是信息隐秘载体图像
%file是秘密消息文件
%output是信息隐秘后生成图像
%ste_cover是信息隐秘后图像矩阵 
%len_total是秘密消息的长度,即容量 
[ste_cover,len_total]=lsbhide('baidu.bmp','msgsec.txt','baidu01.bmp')
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

提取 

%文件名:lsbget.m
%程序员:李巍
%编写时间:2004.2.29
%函数功能:本函数将完成提取隐秘于LSB上的秘密消息
%输入格式举例:result=lsbget('d.bmp',1736,'secret.txt');
%参数说明:
%output是信息隐秘后的图像
%len_total是秘密消息的长度
%goalfile是提取出的秘密消息文件
%result是提取的消息 
lsbget('baidu01.bmp',150,'secret.txt');
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

四、小测试5(复习)”

隐藏

 % 提取图像信息并分层 
cover = imread('kgy.bmp') ; 
cover1= cover(:,:,1);
 [row, col] = size(cover1) ; 
msg = imread('baidu.bmp');
%修改图片大小
msg=imresize(msg,[row,col]);
 
% 置载体图像 R 层的低 4bit 为 0
 for i = 1:row
 for j = 1:col 
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
cover1( i, j) = bitor( cover1( i, j) , shiftmsg4( i, j) ) ;
 end 
end 
% 写回并保存 
cover(:,:, 1) = cover1; 
imwrite( cover, 'kgy01.bmp') ;
subplot( 2,2,1) , imshow( 'kgy.bmp') ; title( '载体图像');
subplot(2,2,2);imshow('kgy01.bmp');title('载密图像');

提取

%以下为提取代码,可单独分离为一个脚本
data = imread('kgy01.bmp') ;
  
A = data(:,:,1) ;
[ row, col] = size( A) ;
for i = 1:row 
for j = 1:col 
A( i, j) = bitand( A( i, j) , 15) ; 
end
 end
A = bitshift( A, 4) ; 
% 显示结果
subplot( 221) , imshow( 'kgy.bmp') ; title( '载体图像');
 subplot( 222) , imshow( msg) ; title( '秘密图像'); 
  
subplot( 223) , imshow( data) ; title( '载密图像'); 
imwrite(A,'baidu01.bmp');
subplot( 224) , imshow( A) ; title( '提取的密秘图像');

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值