数字水印的嵌入
代码是用matlab写的
基于空域的最低有效位替换算法(LSBR)
采用LSBR,将秘密分别顺序隐藏到rgb图像的r、g、b各个层,将秘密的每一位嵌入到载体各像素的最低的一位
载体
秘密
含有秘密的载体
提取的秘密
隐藏代码:
cover=imread('C:\Users\Desktop\c.bmp');
secret=imread('C:\Users\Desktop\s.bmp');
coverr=cover(:,:,1);
coverg=cover(:,:,2);
coverb=cover(:,:,3);
[p,q]=size(secret);
p=uint32(p);
q=uint32(q);
for i=1:p
for j=1:q
switch(mod(j,3))
case 1
coverr(i,j)=bitor(bitshift (bitshift(coverr(i,j),-1),1) ,uint8(secret(i,j)));
case 2
coverg(i,j)=bitor(bitshift (bitshift(coverg(i,j),-1),1) ,uint8(secret(i,j)));
case 0
coverb(i,j)=bitor(bitshift (bitshift(coverb(i,j),-1),1) ,uint8(secret(i,j)));
end
end
end
imwrite(cat(3,coverr,coverg,coverb),'C:\Users\Desktop\ste.bmp');
提取代码:
ste=imread('C:\Users\Desktop\ste.bmp');
ster=ste(:,:,1);
steg=ste(:,:,2);
steb=ste(:,:,3);
s=[256,256];
for i=1:256
for j=1:256
switch(mod(j,3))
case 1
s(i,j)=bitshift(bitshift(ster(i,j),7),-7);
case 2
s(i,j)=bitshift(bitshift(steg(i,j),7),-7);
case 0
s(i,j)=bitshift(bitshift(steb(i,j),7),-7);
end
end
end
imwrite(s,'C:\Users\Desktop\secret.bmp');
Jsteg算法的实现
在JPEG图像的DCT系数上进行LSB替换,实现秘密信息的嵌入
Jpg的图像相比bmp隐写容量更小,开始选的256*256的图像就不能完全嵌入。在量化后的dct系数上嵌入时要注意dc系数不嵌,0与1也不嵌。
载体
秘密
含有秘密的载体
提取的秘密
嵌入代码:
cover=jpeg_read('C:\Users\Desktop\c.jpg');
secret=imread('C:\Users\Desktop\t.bmp');
secret1=reshape(secret,1,[]);
[p,q]=size(cover.coef_arrays{1,1});
p=uint32(p);
q=uint32(q);
%cover1=reshape(cover.coef_arrays{1,1},1,[]);
%hist(cover1,20);
num=1;
for i=1:p
for j=1:q
if(num==64*64+1)
break;
else
if ( mod(i,8) == 1 && mod(j,8) == 1)
continue;
elseif (cover.coef_arrays{1,1}(i,j) == 0)
continue;
elseif(cover.coef_arrays{1,1}(i,j) == 1)
continue;
else
cover.coef_arrays{1,1}(i,j) = cover.coef_arrays{1,1}(i,j) - mod(cover.coef_arrays{1,1}(i,j), 2) + secret1(num);
num=num+1;
end
end
end
end
jpeg_write(cover,'C:\Users\Desktop\ste.jpg');
提取代码:
cover=jpeg_read('C:\Users\Desktop\ste.jpg');
[p,q]=size(cover.coef_arrays{1,1});
%ste=reshape(cover.coef_arrays{1,1},1,[]);
%hist(ste,20);
p=uint32(p);
q=uint32(q);
num=1;
for i=1:p
for j=1:q
if(num==64*64+1)
break;
else
if ( mod(i,8) == 1 && mod(j,8) == 1)
continue;
elseif (cover.coef_arrays{1,1}(i,j) == 0)
continue;
elseif(cover.coef_arrays{1,1}(i,j) == 1)
continue;
else
secret(num) = mod(cover.coef_arrays{1,1}(i,j), 2);
num=num+1;
end
end
end
end
secret1=reshape(secret,[64,64]);
imwrite(secret1,'C:\Users\Desktop\secretste.bmp');
隐写分析方法—卡方统计分析
在上一步jsteg嵌入和提取代码中分别加入下面代码即可:
cover1=reshape(cover.coef_arrays{1,1},1,[]);
hist(cover1,20);
ste=reshape(cover.coef_arrays{1,1},1,[]);
hist(ste,20);
因为在嵌入时选择的图像过小,卡方分析可能效果不明显。但当时选大了,又嵌不进去。
对载体的统计直方图:
对含有秘密的载体的统计直方图: