panhao1102
2008-06-09, 01:44
%用矩阵分解法嵌入数字水印
Z=double(imread('d:/2.bmp'));
Mc=size(Z,1);%图像高度
Nc=size(Z,2);%图像宽度
c=Mc/8;d=Nc/8; m=c*d;
blocksize=8; %将图像分为 8x8 块
%设定嵌入信息的矩阵B
B=[ 1 0 1 0 1 1 0 1
1 0 1 0 1 0 1 1
0 1 1 0 0 0 0 0
0 1 0 1 1 1 0 0
0 1 0 0 0 1 0 0
1 0 0 1 1 1 1 1
0 1 1 1 0 0 1 0
1 0 1 1 1 1 1 0];
ZM=floor(Z./2)*2;%向负无穷大方向取整
x=1;y=1;
for(kk=1:m)
[q,u]=qr(ZM(x:x+blocksize-1,y:y+blocksize-1)); %qr分解 满足ZM=q*u,u为一个上三角矩阵
tra=floor(trace(abs(u))*10000); % trace对角元素取和
for ii=1:blocksize
for jj=1:blocksize
if (B(ii,jj)==1&tra~=0)
ZM(x+ii-1,y+jj-1)=ZM(x+ii-1,y+jj-1)+mod(tra,2);
tra=floor(tra/2);
end
end
end
if(y+blocksize)>=Nc
y=1;x=x+blocksize;
else
y=y+blocksize;
end
end
Z1=imread('d:/2.bmp');
figure,
subplot(2,2,1);imshow(Z1,[]);title('原图');
subplot(2,2,2);imshow(ZM,[]);title('嵌入水印后的图象');
%进行图像攻击
ZB=double(imread('d:/1.bmp'));
ZM(65:136,209:256)=ZB(209:280,289:336);
ZA=uint8(ZM);
subplot(2,2,3); imshow(ZA,[]);title('攻击后图像');
imwrite(ZA,'watermarked.bmp','bmp');
%水印的提取和改动识别
Z=double(imread('watermarked.bmp'));
Mc=size(Z,1);%图像高度
Nc=size(Z,2);%图像宽度
c=Mc/8;d=Nc/8;m=c*d;
blocksize=8; %将图像分为 8x8 块
%设定信息提取的矩阵
B=[ 1 0 1 0 1 1 0 1
1 0 1 0 1 0 1 1
0 1 1 0 0 0 0 0
0 1 0 1 1 1 0 0
0 1 0 0 0 1 0 0
1 0 0 1 1 1 1 1
0 1 1 1 0 0 1 0
1 0 1 1 1 1 1 0];
ZM=floor(Z./2)*2;
ZX=Z-ZM;
x=1;y=1;
for(kk=1:m)
[q,u]=qr(ZM(x:x+blocksize-1,y:y+blocksize-1)); %qr分解
tra=floor(trace(abs(u))*10000);
k=0;
tra1=0;
trae=tra;
for ii=1:blocksize
for jj=1:blocksize
if (B(ii,jj)==1&tra~=0)
tra1=ZX(x+ii-1,y+jj-1)*2^k+tra1;
k=k+1;
trae=floor(trae/2);
end
end
end
if(tra1~=tra)
%Z(x:x+blocksize-1,y:y+blocksize-1)=Z(x:x+blocksize-1,y:y+blocksize-1);
%else
Z(x:x+blocksize-1,y:y+blocksize-1)=1;
end
if(y+blocksize)>=Nc
y=1;x=x+blocksize;
else
y=y+blocksize;
end
end
ZA=uint8(Z);
subplot(2,2,4);imshow(ZA,[]);title('识别改动的图像');
这个是我的数字水印嵌入和提取的算法,但是不能抵抗精密的拼贴攻击。翻阅论文,给出下面的改进算法,但我不知道具体怎么编写,自己编写总是出错,请指教。
改进算法:
Bs=blocksize;
x=9;y=9;
for(kk=1:m)
mean=mean2(ZM(y-4:y+Bs-1+4,x-4:x+Bs-1+4));
mean=mod(floor(mean*10),10);
meann=mean; i=0;
while (meann~=0)
ZM(y+Bs-1,x+Bs-4+i)=ZM(y+Bs-1,x+Bs-4+i)+mod(meann,2);
meann=floor(meann/2);
i=i+1;
end
if (x+2*Bs)>=Nc
x=9;y=y+Bs;
else
x=x+Bs;
end
end
Z=double(imread('d:/2.bmp'));
Mc=size(Z,1);%图像高度
Nc=size(Z,2);%图像宽度
c=Mc/8;d=Nc/8; m=c*d;
blocksize=8; %将图像分为 8x8 块
%设定嵌入信息的矩阵B
B=[ 1 0 1 0 1 1 0 1
1 0 1 0 1 0 1 1
0 1 1 0 0 0 0 0
0 1 0 1 1 1 0 0
0 1 0 0 0 1 0 0
1 0 0 1 1 1 1 1
0 1 1 1 0 0 1 0
1 0 1 1 1 1 1 0];
ZM=floor(Z./2)*2;%向负无穷大方向取整
x=1;y=1;
for(kk=1:m)
[q,u]=qr(ZM(x:x+blocksize-1,y:y+blocksize-1)); %qr分解 满足ZM=q*u,u为一个上三角矩阵
tra=floor(trace(abs(u))*10000); % trace对角元素取和
for ii=1:blocksize
for jj=1:blocksize
if (B(ii,jj)==1&tra~=0)
ZM(x+ii-1,y+jj-1)=ZM(x+ii-1,y+jj-1)+mod(tra,2);
tra=floor(tra/2);
end
end
end
if(y+blocksize)>=Nc
y=1;x=x+blocksize;
else
y=y+blocksize;
end
end
Z1=imread('d:/2.bmp');
figure,
subplot(2,2,1);imshow(Z1,[]);title('原图');
subplot(2,2,2);imshow(ZM,[]);title('嵌入水印后的图象');
%进行图像攻击
ZB=double(imread('d:/1.bmp'));
ZM(65:136,209:256)=ZB(209:280,289:336);
ZA=uint8(ZM);
subplot(2,2,3); imshow(ZA,[]);title('攻击后图像');
imwrite(ZA,'watermarked.bmp','bmp');
%水印的提取和改动识别
Z=double(imread('watermarked.bmp'));
Mc=size(Z,1);%图像高度
Nc=size(Z,2);%图像宽度
c=Mc/8;d=Nc/8;m=c*d;
blocksize=8; %将图像分为 8x8 块
%设定信息提取的矩阵
B=[ 1 0 1 0 1 1 0 1
1 0 1 0 1 0 1 1
0 1 1 0 0 0 0 0
0 1 0 1 1 1 0 0
0 1 0 0 0 1 0 0
1 0 0 1 1 1 1 1
0 1 1 1 0 0 1 0
1 0 1 1 1 1 1 0];
ZM=floor(Z./2)*2;
ZX=Z-ZM;
x=1;y=1;
for(kk=1:m)
[q,u]=qr(ZM(x:x+blocksize-1,y:y+blocksize-1)); %qr分解
tra=floor(trace(abs(u))*10000);
k=0;
tra1=0;
trae=tra;
for ii=1:blocksize
for jj=1:blocksize
if (B(ii,jj)==1&tra~=0)
tra1=ZX(x+ii-1,y+jj-1)*2^k+tra1;
k=k+1;
trae=floor(trae/2);
end
end
end
if(tra1~=tra)
%Z(x:x+blocksize-1,y:y+blocksize-1)=Z(x:x+blocksize-1,y:y+blocksize-1);
%else
Z(x:x+blocksize-1,y:y+blocksize-1)=1;
end
if(y+blocksize)>=Nc
y=1;x=x+blocksize;
else
y=y+blocksize;
end
end
ZA=uint8(Z);
subplot(2,2,4);imshow(ZA,[]);title('识别改动的图像');
这个是我的数字水印嵌入和提取的算法,但是不能抵抗精密的拼贴攻击。翻阅论文,给出下面的改进算法,但我不知道具体怎么编写,自己编写总是出错,请指教。
改进算法:
Bs=blocksize;
x=9;y=9;
for(kk=1:m)
mean=mean2(ZM(y-4:y+Bs-1+4,x-4:x+Bs-1+4));
mean=mod(floor(mean*10),10);
meann=mean; i=0;
while (meann~=0)
ZM(y+Bs-1,x+Bs-4+i)=ZM(y+Bs-1,x+Bs-4+i)+mod(meann,2);
meann=floor(meann/2);
i=i+1;
end
if (x+2*Bs)>=Nc
x=9;y=y+Bs;
else
x=x+Bs;
end
end