zunny 发表于 2006-4-23 15:38

[求助]有难请救

forimg.php?url=http://hhttp://202.118.250.107/vibbbs/VibUploadFiles/attachments/dvbbs/2006-4/200642314543584245.bmp
forimg.php?url=http://hhttp://202.118.250.107/vibbbs/VibUploadFiles/attachments/dvbbs/2006-4/200642314544734894.bmp
上面两图在程序中要用的,小弟学艺不精,一直不知错在哪里,在这里麻烦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
=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=;

iizigzag函数
%实现之字形变换后再变回来
function Mnew=izigzag(Mold)
Mnew=;

[ 本帖最后由 lxq 于 2007-2-1 14:40 编辑 ]

zunny 发表于 2006-4-24 14:56

happy大侠,慧眼看题啊!等待中……

zunny 发表于 2006-4-25 14:11

happy大侠,不要对我的问题视而不见啊<BR><BR><BR><BR>
页: [1]
查看完整版本: [求助]有难请救