马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
上面两图在程序中要用的,小弟学艺不精,一直不知错在哪里,在这里麻烦happy大侠为我审度一下,希
望可以解除谜团,程序前几天也贴过一次,不过不完整,现把完整的程序贴出。
%%%%%%%%%%%%%%%%%%%%%%%%
%这是一个水印加密的算法
%生成随机矩阵C做为公钥,矩阵大小8*8,用来加密一个8位二进制数的。这部分随便看看就行了。
a=round(rand(1,8)*10);
b(1)=2;
for i=2:8
b(i)=2*b(i-1)+a(i);
end
b1=round(b.*rand(1,8));
b2=b-b1;
b3=b1-b2;
p=sum(abs(b3))*sum(abs(b3))+1;
for m=1:8
for n=1:8
A(m,n)=b3(m)*b3(n);
end
end
for m=1:8
for n=1:8
B(m,n)=b2(m)*b1(n);
end
end
C=A+p*B;
%读入二值水印图像,并用C加密之,后经过变换化为一个一维序列
Water=imread('D:\My Essay\草稿\H','bmp'); %logical array
J=im2double(Water);
J=reshape(J,128,8);
for i=1:128
for j=1:8
m(j)=J(i,j); %double array
end
Encry_dec(i,1)=m*C*m'; %double array,加密后成为一个128行的十
进制矩阵
end
Encry_bin=dec2bin(Encry_dec); %char array
[m1,n1]=size(Encry_bin);
m_Encry=m1*n1; %m_Encry也是一个密钥,在提取水印时用
Encry=reshape(Encry_bin,1,m_Encry); %char array
cyc=fix(m_Encry/1024);
cyc1=cyc+1;
cyc2=cyc+2;
%读入载体图像Lena
Lena=imread('D:\My Essay\草稿\Lena','bmp'); %unit8 array
I=im2double(Lena); %double array
%水印的嵌入,DCT变换之类的
for i=1:32
loc2=(i-1)*32+1;
for j=1:32
x=(i-1)*8+1;
y=(j-1)*8+1;
BLOCK=I(x:x+8-1,y:y+8-1); %BLOCK系均为double array
BLOCK_dct=dct2(BLOCK); %图像8、8分块然后DCT
BLOCK_zig=zigzag(BLOCK_dct); %zigzag代码于下面提供
BLOCK_wtrz=BLOCK_zig;
for k=2:cyc2 %嵌入低频分量,从(2,1)处开始,
zigzag排列后的第2个向量
loc1=1024*(k-2)+loc2;
if loc1>m_Encry break;
end
if Encry(loc1)=='0'
BLOCK_wtrz(k)=BLOCK_zig(k)-0.01;
else BLOCK_wtrz(k)=BLOCK_zig(k)+0.01;
end
end
BLOCK_wtr=izigzag(BLOCK_wtrz);
BLOCK_wtrd=idct2(BLOCK_wtr);
Iw(x:x+8-1,y:y+8-1)=BLOCK_wtrd;
loc2=loc2+1;
end
end
%水印析出
count=0;
for i=1:32
dj=(i-1)*32+1;
for j=1:32
x=(i-1)*8+1;
y=(j-1)*8+1;
iBLOCK=I(x:x+8-1,y:y+8-1); %iBLOCK系均为double array
iBLOCKw=Iw(x:x+8-1,y:y+8-1);
iBLOCK_dct=dct2(iBLOCK);
iBLOCKw_dct=dct2(iBLOCKw);
iBLOCK_zig=zigzag(iBLOCK_dct);
iBLOCKw_zig=zigzag(iBLOCKw_dct);
count=count+1;
if m_Encry-count<(1024*cyc)
for i=2:cyc1
d=1024*(i-2)+dj;
if iBLOCKw_zig(i)-iBLOCK_zig(i)<0
Decry(d)=0;
else
Decry(d)=1;
end
end
else
for i=2:cyc2
d=1024*(i-2)+dj; %t=100*(iBLOCKw_zig(i)/iBLOCK_zig(i)-1);
if iBLOCKw_zig(i)-iBLOCK_zig(i)<0
Decry(d)=0;
else
Decry(d)=1;
end
end
end
dj=dj+1;
end
end
Decry_str=num2str(Decry); %char array
Decry_str=strrep(Decry_str,' ','');
为什么嵌入前的Encry和嵌入后的Decry_str不一样呢?理论上应该一样的啊!
zigzag函数:
%之字形排列,这里仅设为8*8的矩阵
function Mnew=zigzag(Mold)
Mnew=[Mold(1,1) Mold(1,2) Mold(2,1) Mold(3,1) Mold(2,2) Mold(1,3) Mold(1,4) Mold(2,3) Mold(3,2) Mold(4,1) Mold(5,1) Mold(4,2) Mold(3,3) Mold(2,4) Mold(1,5) Mold(1,6) Mold(2,5) Mold(3,4) Mold(4,3) Mold(5,2) Mold(6,1) Mold(7,1) Mold(6,2) Mold(5,3) Mold(4,4) Mold(3,5) Mold(2,6) Mold(1,7) Mold(1,8) Mold(2,7) Mold(3,6) Mold(4,5) Mold(5,4) Mold(6,3) Mold(7,2) Mold(8,1) Mold(8,2) Mold(7,3) Mold(6,4) Mold(5,5) Mold(4,6) Mold(3,7) Mold(2,8) Mold(3,8) Mold(4,7) Mold(5,6) Mold(6,5) Mold(7,4) Mold(8,3) Mold(8,4) Mold(7,5) Mold(6,6) Mold(5,7) Mold(4,8) Mold(5,8) Mold(6,7) Mold(7,6) Mold(8,5) Mold(8,6) Mold(7,7) Mold(6,8) Mold(7,8) Mold(8,7) Mold(8,8)];
iizigzag函数
%实现之字形变换后再变回来
function Mnew=izigzag(Mold)
Mnew=[Mold(1) Mold(2) Mold(6) Mold(7) Mold(15) Mold(16) Mold(28) Mold(29);Mold(3) Mold(5) Mold(8) Mold(14) Mold(17) Mold(27) Mold(30) Mold(43);Mold(4) Mold(9) Mold(13) Mold(18) Mold(26) Mold(31) Mold(42) Mold(44);Mold(10) Mold(12) Mold(19) Mold(25) Mold(32) Mold(41) Mold(45) Mold(54);Mold(11) Mold(20) Mold(24) Mold(33) Mold(40) Mold(46) Mold(53) Mold(55);Mold(21) Mold(23) Mold(34) Mold(39) Mold(47) Mold(52) Mold(56) Mold(61);Mold(22) Mold(35) Mold(38) Mold(48) Mold(51) Mold(57) Mold(60) Mold(62);Mold(36) Mold(37) Mold(49) Mold(50) Mold(58) Mold(59) Mold(63) Mold(64)];
[ 本帖最后由 lxq 于 2007-2-1 14:40 编辑 ] |