下面的这个是零水印------------------------------------------
%嵌入程序
%读取水印图像存入变量w做水印信号
szImFilename='Image_watermark.bmp';
w=imread(szImFilename);
w=im2bw(w);
key=32;
w=Arnold(w,key,0,1,0);
[m,n]=size(w);
Im_m=m;
Im_n=n;
mn=m*n;
w1=reshape(w,mn,1);
%利用logistic映射产生混沌序列
c=logistic(3.5713,0.6,mn);
%水印加密
w1_c=bitxor(w1,c);
%重复编码长度L
L=5;
l=L*mn;
w2_c=EnCode(w1_c,L,mn);
%产生PN序列
PN=GetPN(32,L,0.035);
%编码调制
w2_c=EnCodeXor(w2_c,mn,PN,L);
%读取原始音频信号存入I
szFilename='4_wav.wav'; %'3.wav';
[I,fs,nbits]=wavread(szFilename);
%用变量I_len存储音频I的长度,I_n为声道个数
[I_len,I_n]=size(I);
%自适分段长度
len_seg=2^floor(log2(I_len/l));
%分段个数
num_seg=floor(I_len/len_seg);
if num_seg < l
error('分段个数不够');
return;
end
last_seg=I_len-num_seg*len_seg;
%>>>>>>>>>>>>>>>>>>>>>>>>>>>计算比值r<<<<<<<<<<<<<<<<<<<<<<<<<<<
c0=0;
c1=0;
for i=1:l
if w2_c(i) == 0
c0=c0+1;
else
c1=c1+1;
end
end
r=c0/c1;
% 建立元胞B,每个音频数据段I(m)是B的一个元素
B=cell(num_seg,1);
k=1;
th=num_seg*len_seg;
% 当k小于th的长度时,矩阵I每len_seg行作为一个音频数据段存入元胞B中
while(k<th)
i=k:(k+len_seg-1);
m=(k+len_seg-1)/len_seg;
B{m,1}=I(i,1);
k=k+len_seg;
end
% 建立数组E,并将元胞B中小波变换了的元素的近似分量平均值存入数组E中
E=zeros(num_seg,1);
for i=1:num_seg
[c_,l_]=wavedec(B{i,1},3,'db4');
ca3=appcoef(c_,l_,'db4',3); %提取3级小波变换的近似分量(低频系数)
ca3_len=length(ca3);
E(i)=sum(ca3(:,1))/ca3_len;
end
[E1,index]=sort(E,'ascend');
%>>>>>>>>>>>>>>>>>>>>>>>>>>>计算阀值T<<<<<<<<<<<<<<<<<<<<<<<<<<<
K=floor(r*num_seg/(r+1));
T=E1(K);
clear B;clear E1;clear index;
%>>>>>>>>>>>>>>>>>>>>>>>>>>>生成索引向量N<<<<<<<<<<<<<<<<<<<<<<<<<<<
%分类映射
E_x=zeros(num_seg,2);
x0=0;
x1=0;
for i=1:num_seg
if E(i) >= T
E_x(i,1)=1;
E_x(i,2)=i;
x1=x1+1;
else
E_x(i,1)=0;
E_x(i,2)=i;
x0=x0+1;
end
end
%从E中分离数据
E_a=zeros(x1,2);
E_b=zeros(x0,2);
i1=1;
i2=1;
for i=1:num_seg
if E(i) >= T
E_a(i1,1)=1;
E_a(i1,2)=i;
i1=i1+1;
else
E_b(i2,1)=0;
E_b(i2,2)=i;
i2=i2+1;
end
end
%从E_a,E_b中选取特征数据
N=zeros(l,2);
i_a=1;
i_b=1;
for i=1:l
if w2_c(i) == 1
N(i,1)=1;
N(i,2)=E_a(i_a,2);
i_a=i_a+1;
else
N(i,1)=0;
N(i,2)=E_b(i_b,2);
i_b=i_b+1;
end
end
%>>>>>>>>>>>>>>>>>>>>>>>>>>>写入文件保存<<<<<<<<<<<<<<<<<<<<<<<<<<<
%disp(T)
%disp(E_x)
nIndex=strfind(szFilename,'.');
nSizeInd=size(nIndex);
j=nIndex(nSizeInd(2));
for i=1:(j-1)
szSaveFile(i)=szFilename(i);
end
szSaveFile=strcat(szSaveFile,'_WaterMark_Info','.txt');
[fid,Msg]=fopen(szSaveFile,'wt');
if fid == -1
error(Msg);
return;
end
fprintf(fid,'[WAV_File]\n');
fprintf(fid,'FileName=%s\n',szFilename);
wav_info=[fs,nbits,I_len,I_n];
wav_info_str={'fs','nbits','I_len','I_n'};
fprintf(fid,'[WAV_Info]\n');
wav_info_strlen=length(wav_info_str);
for i=1:wav_info_strlen
temp_str=char(wav_info_str(i));
fprintf(fid,'%s=%ld\n',temp_str,wav_info(i));
end
fprintf(fid,'[Img_File]\n');
fprintf(fid,'ImageName=%s\n',szImFilename);
fprintf(fid,'ImageSize=%dx%d\n',Im_m,Im_n);
fprintf(fid,'[WaterMark_Info]\n');
WaterMark_info=[len_seg,num_seg,last_seg,L,r,K,T];
WaterMark_info_str={'len_seg','num_seg','last_seg','L','r','K','T'};
WaterMark_info_strlen=length(WaterMark_info_str);
for i=1:WaterMark_info_strlen
temp_str=char(WaterMark_info_str(i));
fprintf(fid,'%s=%ld\n',temp_str,WaterMark_info(i));
end
fprintf(fid,'E_x Size=%ldx%d\n',num_seg,2);
for i=1:num_seg
fprintf(fid,'%d %ld\n',E_x(i,1),E_x(i,2));
end
fprintf(fid,'N Size=%ldx%d\n',l,2);
for i=1:l
fprintf(fid,'%d %ld\n',N(i,1),N(i,2));
end
fclose(fid);
clear;
------------------------------------------分割线------------------------------------------
%提取程序
%获取原始水印配置信息
szSaveFile='4_wav_WaterMark_Info.txt';
[fid,Msg]=fopen(szSaveFile,'rt');
if fid == -1
error(Msg);
return;
end
szText=fscanf(fid,'%s/n');
if strcmp(szText,'[WAV_File]\n')
error('error WM_Info header--->[WAV_File]');
return;
end
szText=fscanf(fid,'%s/n');
szOrg_Filename=sscanf(szText,'FileName=%s');
szText=fscanf(fid,'%s/n');
if strcmp(szText,'[WAV_Info]\n')
error('error WM_Info header--->[WAV_Info]');
return;
end
fs=0;
nbits=0;
I_len=0;
I_n=0;
wav_info=[fs,nbits,I_len,I_n];
wav_info_str={'fs=%ld','nbits=%ld','I_len=%ld','I_n=%ld'};
wav_info_strlen=length(wav_info_str);
for i=1:wav_info_strlen
szText=fscanf(fid,'%s/n');
temp_str=char(wav_info_str(i));
wav_info(i)=sscanf(szText,temp_str);
end
fs=wav_info(1);
nbits=wav_info(2);
I_len=wav_info(3);
I_n=wav_info(4);
szText=fscanf(fid,'%s/n');
if strcmp(szText,'[Img_File]\n')
error('error WM_Info header--->[Img_File]');
return;
end
szText=fscanf(fid,'%s/n');
Im_name=sscanf(szText,'ImageName=%s');
szText=fscanf(fid,'%s/n');
[Im_mn,nCount]=sscanf(szText,'ImageSize=%dx%d');
Im_m=Im_mn(1);
Im_n=Im_mn(2);
szText=fscanf(fid,'%s/n');
if strcmp(szText,'[WaterMark_Info]\n')
error('error WM_Info header--->[WaterMark_Info]');
return;
end
len_seg=0;
num_seg=0;
last_seg=0;
L=0;
r=0;
K=0;
T=0;
WaterMark_info=[len_seg,num_seg,last_seg,L,r,K,T];
WaterMark_info_str={'len_seg=%ld','num_seg=%ld','last_seg=%ld','L=%d','r=%f','K=%ld','T=%f'};
WaterMark_info_strlen=length(WaterMark_info_str);
for i=1:WaterMark_info_strlen
szText=fscanf(fid,'%s/n');
temp_str=char(WaterMark_info_str(i));
%fprintf(fid,'%s=%ld\n',temp_str,WaterMark_info(i));
WaterMark_info(i)=sscanf(szText,temp_str);
end
len_seg=WaterMark_info(1);
num_seg=WaterMark_info(2);
last_seg=WaterMark_info(3);
L=WaterMark_info(4);
r=WaterMark_info(5);
K=WaterMark_info(6);
T=WaterMark_info(7);
szText=fscanf(fid,'%s%c%s/n');
E_x_size=sscanf(szText,'E_x Size=%ldx%d\n');
E_x=zeros(E_x_size(1),E_x_size(2));
for i=1:E_x_size(1)
%fprintf(fid,'%d %ld\n',E_x(i,1),E_x(i,2));
szText=fscanf(fid,'%s%c%s/n');
E_x_Data=sscanf(szText,'%d %ld\n');
E_x(i,1)=E_x_Data(1,1);
E_x(i,2)=E_x_Data(2,1);
end
szText=fscanf(fid,'%s%c%s/n');
N_Size=sscanf(szText,'N Size=%ldx%d\n');
l=N_Size(1);
N=zeros(N_Size(1),N_Size(2));
for i=1:l
%fprintf(fid,'%d %ld\n',N(i,1),N(i,2));
szText=fscanf(fid,'%s%c%s/n');
N_Data=sscanf(szText,'%d %ld\n');
N(i,1)=N_Data(1,1);
N(i,2)=N_Data(2,1);
end
mn=Im_m*Im_n;
%读取待检测音频信号存入I1
szFilename='4_wav.wav';
[I1,fs,nbits]=wavread(szFilename);
%用变量I_len存储音频I的长度,I_n为声道个数
[I1_len,I1_n]=size(I1);
I1_new=zeros(I_len,1);
%是否插值处理
if I1_len<I_len
I1_new=lagrange(I1,I1_len,I_len); %插值处理 线性伸缩恢复
elseif I1_len>I_len
clear I1_new;
I1_new=zeros(I1_len,1);
else
I1_new(:,1)=I1(:,1);
end
%重新计算num_seg,last_seg
num_seg=floor(I1_len/len_seg);
last_seg=I1_len-num_seg*len_seg;
% 建立元胞B,每个音频数据段I(m)是B的一个元素
B=cell(num_seg,1);
k=1;
th=num_seg*len_seg;
% 当k小于th的长度时,矩阵I每len_seg行作为一个音频数据段存入元胞B中
while(k<th)
i=k:(k+len_seg-1);
m=(k+len_seg-1)/len_seg;
B{m,1}=I1_new(i,1);
k=k+len_seg;
end
% 建立数组E,并将元胞B中小波变换了的元素的近似分量平均值存入数组E中
w2_c=zeros(l,1);
w1_c=zeros(l,1);
for i=1:l
index=N(i,2);
[c_,l_]=wavedec(B{index,1},3,'db4');
ca3=appcoef(c_,l_,'db4',3); %提取3级小波变换的近似分量(低频系数)
ca3_len=length(ca3);
E_avg=sum(ca3(:,1))/ca3_len;
if E_avg >= T
w2_c(i)=1;
else
w2_c(i)=0;
end
end
clear B;
%利用logistic映射产生混沌序列
c=logistic(3.5713,0.6,mn);
%产生PN序列
%L=5;
PN=GetPN(32,L,0.035);
%编码调制
w2_c=EnCodeXor(w2_c,mn,PN,L);
%编码分段相加
w_c=zeros(mn,1);
for j=1:mn
tp=0;
for i=1:L
tp=tp+w2_c((j-1)*L+i);
end
w_c(j)=tp;
end
w_T=floor(L/2);
w_1=zeros(mn,1);
for i=1:mn
if w_c(i)>w_T
w_1(i)=1;
else
w_1(i)=0;
end
end
%水印解密
w_2=bitxor(w_1