- 实验题目(此栏实验前由老师填写)
一、在彩色图像中基于调色板实现隐藏信息。
(代码见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( '提取的密秘图像');