matlab LSB/基于LSB的脆弱水印/DCT 实验源码

基于matlab三种数字水印实现,源码如下
(部分源码来自网络)

LSB水印

主程序 mainlsb.m
piccover=double(rgb2gray(imread('host.bmp')));%载体图像
pic2ray=double(im2bw(imread('data.bmp')));%隐藏信息

%获取两个图像的大小
[M,N] = size(piccover);
[m,n] = size(pic2ray);
%fprintf('M=%f',M);
%fprintf('N=%f',N);
%fprintf('m=%f',m);
%fprintf('n=%f',n);

subplot(3,4,1),imshow(pic2ray,[]);%显示需隐藏的信息
title('原始水印');

subplot(3,4,2),imshow(piccover,[]); %展示封面和隐藏信息后图像的对比
title('原始载体');

pichide=LSB(piccover,pic2ray,M,N,m,n);%M,N为封面行列,m,n为二值图行列,将二值图隐写进封面中
subplot(3,4,3),imshow(pichide,[]);%显示隐藏后图像
imwrite(pichide, 'result1.png'); 
title('嵌入水印后载体');

 for i=1:M
     for j=1:N
      tmp_hou(i,j) = bitget(pichide(i,j),1);%bitget函数首先将X(i,j)处灰度值分解为二进制串,然后取第1位
     end
end
 subplot(3,4,5),imshow(tmp_hou,[]);%显示隐藏后的最低位平面
 title('第1位平面');
 
  for i=1:M
     for j=1:N
      tmp_hou(i,j) = bitget(pichide(i,j),2);%bitget函数首先将X(i,j)处灰度值分解为二进制串,然后取第1位
     end
end
 subplot(3,4,6),imshow(tmp_hou,[]);%显示隐藏后的最低位平面
 title('第2位平面');
 
  for i=1:M
     for j=1:N
      tmp_hou(i,j) = bitget(pichide(i,j),3);%bitget函数首先将X(i,j)处灰度值分解为二进制串,然后取第1位
     end
end
 subplot(3,4,7),imshow(tmp_hou,[]);%显示隐藏后的最低位平面
 title('第3位平面');
 
  for i=1:M
     for j=1:N
      tmp_hou(i,j) = bitget(pichide(i,j),4);%bitget函数首先将X(i,j)处灰度值分解为二进制串,然后取第1位
     end
end
 subplot(3,4,8),imshow(tmp_hou,[]);%显示隐藏后的最低位平面
 title('第4位平面');
 
  for i=1:M
     for j=1:N
      tmp_hou(i,j) = bitget(pichide(i,j),5);%bitget函数首先将X(i,j)处灰度值分解为二进制串,然后取第1位
     end
end
 subplot(3,4,9),imshow(tmp_hou,[]);%显示隐藏后的最低位平面
 title('第5位平面');

 
  for i=1:M
     for j=1:N
      tmp_hou(i,j) = bitget(pichide(i,j),6);%bitget函数首先将X(i,j)处灰度值分解为二进制串,然后取第1位
     end
end
 subplot(3,4,10),imshow(tmp_hou,[]);%显示隐藏后的最低位平面
 title('第6位平面');
 
  for i=1:M
     for j=1:N
      tmp_hou(i,j) = bitget(pichide(i,j),7);%bitget函数首先将X(i,j)处灰度值分解为二进制串,然后取第1位
     end
end
 subplot(3,4,11),imshow(tmp_hou,[]);%显示隐藏后的最低位平面
 title('第7位平面');
 
  for i=1:M
     for j=1:N
      tmp_hou(i,j) = bitget(pichide(i,j),8);%bitget函数首先将X(i,j)处灰度值分解为二进制串,然后取第1位
     end
end
 subplot(3,4,12),imshow(tmp_hou,[]);%显示隐藏后的最低位平面
 title('第8位平面');
 

 picjie=inLSB(pichide,m,n);%提取出隐藏信息
subplot(3,4,4),imshow(picjie,[]);%显示提取信息
%imshow(picjie,[]);
title('提取信息');
嵌入程序 embedLSB.m
function  piccover = LSB( piccover,pic2ray,M,N,m,n ) %piccover封面,pic2ray二值图,M,N封面行列,m,n二值图行列
if(m<=M&&n<=N)
    for i=1:m
        for j=1:n
            if pic2ray(i,j)==1&&mod(piccover(i,j),2)==1
                continue;
            elseif pic2ray(i,j)==1&&mod(piccover(i,j),2)==0
                piccover(i,j)=piccover(i,j)+1;
            elseif pic2ray(i,j)==0&&mod(piccover(i,j),2)==0
                continue;
            elseif pic2ray(i,j)==0 && mod(piccover(i,j),2)==1
                piccover(i,j)=piccover(i,j)-1;
            end
        end         
    end
else
    fprintf('载体对象大小不够!')
end
end

提取程序 extractLSB.m
function pichide = inLSB(pichide,m,n)
    for i=1:m
        for j=1:n
            if mod(pichide(i,j),2)==1
                pichide(i,j)=255;
                %fprintf('1');
            else
                pichide(i,j)=0;
                %fprintf('0');
            end
        end
    end
end
实验结果

在这里插入图片描述
在这里插入图片描述

基于LSB的脆弱水印 奇偶校验

主程序mainfragile.m
piccover=rgb2gray(imread('lena.png'));%载体图像

% 获取两个图像的大小
[M,N] = size(piccover);

% 显示载体图像
subplot(2,3,1),imshow(piccover);
title('载体图像');

%嵌入奇偶校验水印
pichidenew=fragile(piccover,M,N);
subplot(2,3,2),imshow(pichidenew);
title('脆弱水印');
imwrite(pichidenew,'fragilewrite.bmp')


picf=imread('fragilewrite1.bmp');
picjie=infragile(picf,M,N);%提取出隐藏信息
subplot(2,3,3),imshow(picjie,[]);%显示提取信息
title('提取信息');



%----------攻击测试-----------------------%

%----------中值攻击----------%
p1=imread('fragilewrite1.bmp');
%p1=medfilt2(p1);%中值滤波
picjie=infragile(p1,M,N);%提取出隐藏信息
subplot(2,3,4),imshow(picjie,[]);%显示提取信息
title('中值滤波攻击');


%----------变小攻击----------%
p2=imread('fragilewrite1.bmp');
%p2=imresize(p2,0.5);%变为0.5倍
picjie=infragile(p2,M,N);%提取出隐藏信息
subplot(2,3,5),imshow(picjie,[]);%显示提取信息
title('变小攻击');

%-------旋转攻击-------%
p3=imread('fragilewrite1.bmp');
p3=imrotate(p3,90);%逆时针旋转90;
picjie=infragile(p3,M,N);%提取出隐藏信息
subplot(2,3,6),imshow(picjie,[]);%显示提取信息
title('旋转攻击');


嵌入程序 embedfragile.m
function  piccover = fragile( piccover,M,N ) %piccover封面,pic2ray二值图,M,N封面行列,m,n二值图行列
    for i=1:M
        for j=1:N
            tmp = 0;
            for k=2:8
                tmp = tmp+bitget(piccover(i,j),k);
            end
            if mod(tmp,2) == 0
                if mod(piccover(i,j),2) == 0
                    piccover(i,j) = piccover(i,j)+1;
                end
            else
                if mod(piccover(i,j),2) == 1
                    piccover(i,j) = piccover(i,j)-1;
                end
            end
        end   
    end
end

提取程序 extractfragile.m
function pichidenew = infragile(pichide,m,n)
    pichidenew = ones(m,n);
    for i=1:m
        for j=1:n
            tmp = 0;
            for k=2:8
                tmp = tmp+bitget(pichide(i,j),k);
            end
            tmp = mod(tmp,2);
            if bitget(pichide(i,j),1)==tmp
                 pichidenew(i,j)=0;
            else
                 pichidenew(i,j)=1;
            end
        end
    end
end

实验结果

在这里插入图片描述
(1) 无攻击时的载体及其实验结果(即实验输出)
在这里插入图片描述
(2) 更改亮度及其实验结果(即实验输出)
在这里插入图片描述
(3) 放大攻击及其实验结果(即实验输出)
在这里插入图片描述

(4) 旋转攻击及其实验结果(即实验输出)

在这里插入图片描述

DCT水印

嵌入程序 embed.m
msgfid=fopen('hidden.txt','r');%%打开秘密⽂件,读⼊秘密信息
[msg,count]=fread(msgfid);
count=count*8;
alpha=0.02;
fclose(msgfid);
msg=str2bit(msg)';
[len,col]=size(msg);
io=imread('lena.bmp');%读取载体图像
io=double(io)/255;
output=io;
i1=io(:,:,1);%取图像的⼀层来隐藏
T=dctmtx(8);%对图像进⾏分块
DCTrgb=blkproc(i1,[8 8],'P1*x*P2',T,T');%对图像分块进⾏ DCT 变换
[row,col]=size(DCTrgb);
row=floor(row/8);
col=floor(col/8); % 顺序信息嵌⼊
temp=0;
for i=1:count;
if msg(i,1)==0
if DCTrgb(i+4,i+1)<DCTrgb(i+3,i+2) %选择(5,2)(4,3)这对系数
temp=DCTrgb(i+4,i+1);
DCTrgb(i+4,i+1)=DCTrgb(i+3,i+2);
DCTrgb(i+3,i+2)=temp;
end
else
if DCTrgb(i+4,i+1)>DCTrgb(i+3,i+2)
temp=DCTrgb(i+4,i+1);
DCTrgb(i+4,i+1)=DCTrgb(i+3,i+2);
DCTrgb(i+3,i+2)=temp;
end
end
if DCTrgb(i+4,i+1)<DCTrgb(i+3,i+2)
DCTrgb(i+4,i+1)=DCTrgb(i+4,i+1)-alpha;%将原本的系数调整,使得系数差别变更⼤
else
DCTrgb(i+3,i+2)=DCTrgb(i+3,i+2)-alpha;
end
end
wi=blkproc(DCTrgb,[8 8],'P1*x*P2',T',T);
output=io;
output(:,:,1)=wi;
imwrite(output,'watermarkedlena.bmp');
figure;
subplot(1,2,1);imshow('lena.bmp');title('原始图像');
subplot(1,2,2);imshow('watermarkedlena.bmp');title('嵌入图像');

str2bit函数
function msg_bits = str2bit(msgStr)
msgBin = de2bi(int8(msgStr),8,'left-msb');
len = size(msgBin,1).*size(msgBin,2);
msg_bits = reshape(double(msgBin).',len,1).';
end
提取程序 extract.m
wi=imread('watermarkedlena.bmp');%读取携秘图像
wf=imread('lena.bmp');%读取携秘图像
wi=double(wi)/255;
wi=wi(:,:,1);%取图像的⼀层来提取
T=dctmtx(8);%对图像进⾏分块
DCTcheck=blkproc(wi,[8 8],'P1*x*P2',T,T');%对图像分块进⾏ DCT 变换
for i=1:80 %80 为隐藏的秘密信息的⽐特数
if DCTcheck(i+4,i+1)<=DCTcheck(i+3,i+2)
message(i,1)=1;
else
message(i,1)=0;
end
end
out=bit2str(message);
fid=fopen('message.txt', 'wt');
fwrite(fid,out)
fclose(fid);


%----------攻击测试-----------------------%

%----------中值攻击----------%
p1=imread('watermarkedlena.bmp');%读取携秘图像
p1=double(p1(:,:,1));
p1=medfilt2(p1);%中值滤波
wf=imread('lena.bmp');%读取携秘图像
p1=double(p1)/255;
p1=p1(:,:,1);%取图像的⼀层来提取
T=dctmtx(8);%对图像进⾏分块
DCTcheck=blkproc(p1,[8 8],'P1*x*P2',T,T');%对图像分块进⾏ DCT 变换
for i=1:80 %80 为隐藏的秘密信息的⽐特数
if DCTcheck(i+4,i+1)<=DCTcheck(i+3,i+2)
message(i,1)=1;
else
message(i,1)=0;
end
end
out=bit2str(message);
fid=fopen('message1.txt', 'wt');
fwrite(fid,out)
fclose(fid);

%----------变小攻击----------%
p2=imread('watermarkedlena.bmp');%读取携秘图像
p2=imresize(p2,0.5);%变为0.5倍
wf=imread('lena.bmp');%读取携秘图像
p2=double(p2)/255;
p2=p2(:,:,1);%取图像的⼀层来提取
T=dctmtx(8);%对图像进⾏分块
DCTcheck=blkproc(p2,[8 8],'P1*x*P2',T,T');%对图像分块进⾏ DCT 变换
for i=1:80 %80 为隐藏的秘密信息的⽐特数
if DCTcheck(i+4,i+1)<=DCTcheck(i+3,i+2)
message(i,1)=1;
else
message(i,1)=0;
end
end
out=bit2str(message);
fid=fopen('message2.txt', 'wt');
fwrite(fid,out)
fclose(fid);

%-------旋转攻击-------%
p3=imread('watermarkedlena.bmp');%读取携秘图像
p3=imrotate(p3,90);%逆时针旋转90;
wf=imread('lena.bmp');%读取携秘图像
p3=double(p3)/255;
p3=p3(:,:,1);%取图像的⼀层来提取
T=dctmtx(8);%对图像进⾏分块
DCTcheck=blkproc(p3,[8 8],'P1*x*P2',T,T');%对图像分块进⾏ DCT 变换
for i=1:80 %80 为隐藏的秘密信息的⽐特数
if DCTcheck(i+4,i+1)<=DCTcheck(i+3,i+2)
message(i,1)=1;
else
message(i,1)=0;
end
end
out=bit2str(message);
fid=fopen('message3.txt', 'wt');
fwrite(fid,out)
fclose(fid);

bit2str函数
function message = bit2str(databits)
for i=1:(length(databits)/8)
m=i-1;
bits_str=strcat(num2str(databits(m*8+1)),num2str(databits(m*8+2)),...
num2str(databits(m*8+3)),num2str(databits(m*8+4)),num2str(databits(m*8+5)),...
num2str(databits(m*8+6)),num2str(databits(m*8+7)),num2str(databits(m*8+8)));
message(i)=bin2dec(bits_str);
end
实验结果

在这里插入图片描述
(1) 无攻击时的实验结果(即实验输出)

在这里插入图片描述
(2) 变小攻击及其实验结果(即实验输出)
在这里插入图片描述

注:DCT水印支持字符串的加密,若需算误码率,可取消字符串与二进制串的转化操作,通过二进制串计算误码率 。

  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值