?? 提取代碼.txt
字號:
clear all;
blocksize=8;
midband=[0,0,0,1,1,1,1,0;
0,0,1,1,1,1,0,0;
0,1,1,1,1,0,0,0;
1,1,1,1,0,0,0,0;
1,1,1,0,0,0,0,0;
1,1,0,0,0,0,0,0;
1,0,0,0,0,0,0,0;
0,0,0,0,0,0,0,0];
cover_object=double(imread(lena.bmp)); % 讀入原宿主圖像
watermarked_image=double(imread(dct2_watermarked.bmp)); % 讀入待檢測圖像
Mw=size(watermarked_image,1);Nw=size(watermarked_image,2);
c=Mw/8;d=Nw/8;m=c*d;
orig_watermark=double(imread(copyright.bmp)); % 讀入水印圖像
Mo=size(orig_watermark,1);No=size(orig_watermark,2);n=Mo*No;
rand('state',7); % 設置相同的隨機生成器狀態J=7,
% 作為檢測時的系統密鑰K
pn_sequence_zero=round(rand(1,sum(sum(midband)))); % 生成相同的偽隨機序列
% 提取水印
x=1;y=1;
for(kk=1:m)
% 原始圖像和待檢測圖像分別分塊DCT變換
dct_block1=dct2(watermarked_imgae(y:y+blocksize-1,x:x+blocksize-1));
dct_block2=dct2(cover_object(y:y+blocksize-1,x:x+blocksize-1));
ll=1;
for ii=1:blocksize
for jj=1:blocksize
if(midband(jj,ii)==1)
sequence(ll)=dct_block1(jj,ii)-dct_block2(jj,ii);
ll=ll+1;
end
end
end
% 計算兩個序列的相關性
if(sequence==0)
correlation(kk)=0;
else
correlation(kk)=corr2(pn_sequence_zero,sequence);
end
% 換行
if(x+blocksize)>=Nw
x=1;y=y+blocksize;
else
x=x+blocksize;\
end
end
% 相關性大于0.5嵌入0,不大于0.5則表明曾經被嵌入
for(kk=1:m)
if(correlation(kk)>0.5)
message_vector(kk)=0;
else
message_vector(kk)=1;
end
end
% 計算原始圖像的方差
xx=1;
for j=1:c
for i=1:d
pjhd(xx)=1/64*sum(sum(cover_object((1+(j-1)*8):j*8,(1+(i-1)*8):i*8)));
fc(xx)=1/64*sum(sum((cover_object((1+(j-1)*8):j*8,(1+(i-1)*8):i*8)-pjhd(xx)).^2));
xx=xx+1;
end
end
% 取出方差最大的前n塊
A=sort(fc);B=A((c*d-n+1):c*d);
% 根據原始圖像方差最大的前n塊的位置把水印信息提取出來
fc_o=ones(1,n);
for g=1:n
for h=1:c*d
if B(g)==fc(h)
fc_o(g)=message_vector(h);
h=c*d;
end
end
end
message_vector=fc_o;
% 重組嵌入的圖像信息
message=reshape(message_vector(1:Mo*No),Mo,No);
% 計算提取的水印和原始水印的相似程度
sim=corr2(orig_watermark,message)
% 把水印信息保存名為“message.bmp”的位圖圖像
imwrite(message,'message.bmp',bmp);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -