mmclkbb
2009-04-21, 17:26
谁帮我看看这个程序哪错了,我找不出来,这个程序是在原始彩色图像里嵌入灰度图像实现水印的不可见性和彩色图像的保真性!程序如下:
function watermarkimagergb=embed1(input,watermark,goal, wavelet,level, alpha)
data=imread('lena.bmp');
data=double(data)/255;
datared=data(:,:,3);
[m,n]=size(datared);
dataw=imread('watermark.bmp');
dataw=double(dataw)/255;
row=floor(m/8);
col=floor(n/8);
datared2=zeros(row);
for i=1:row
for j=1:col
datared0=datared(8*(i-1)+1:8*(i-1)+8,8*(j-1)+1:8*(j-1)+8);
[CA1,S]=wavedec2(datared0,level,wavelet);
[U,sigma,V]=svd(CA1);
sigma(1,1)=sigma(1,1)+alpha*dataw(i,j);
CA1=U*sigma*V';
ff=waverec2(CA1,S,wavelet);
datared2(8*(i-1)+1:8*(i-1)+8,8*(j-1)+1:8*(j-1)+8)=ff;
end
end
watermarkimagergb=data;
watermarkimagergb(:,:,3)=datared2;
imwrite(watermarkimagergb,goal);
watermarkimagergb2=imread(goal);
figure(1);
imshow(data);title('原始图像');
figure(2);
imshow(watermarkimagergb2);title('嵌入水印后的RGB图像');
figure(3),imshow(datared);title('B 层图像');
figure(4),imshow(datared2);title('嵌入水印后的B层图像');
Function [count,msg]=embed2(image,watermark,goal,msg,key,level,wavelet,a1,a2)
frr=fopen(msg,'r');
[msg,count]=fread(frr,'ubit1');
fclose(frr);
data0=imread(image);
data0=double(data0)/255;
dataG=data0(:,:,2);
dataB=data0(:,:,3);
dataw=imread(watermark);
dataw=double(dataw);
dataw=Arnold(dataw,Fre,crypt)
%脆弱型水印
[row,col]=size(dataB);
DWT=zeros([row,col]);
row=floor(row/8);
col=floor(col/8);
for i=1:row
for j=1:col
CA2=dataB(8*(i-1)+1:8*(i-1)+8,8*(j-1)+1:8*(j-1)+8);
[A,H,V,D]=dwt2(CA2,wavelet);
[row1,col1]=size(H);
sum=0;
for c=1:row1
for d=1:col1
sum=sum+H(c,d);
end
end
if dataw(i,j)==1
if sum<0
for c=1:row1
for d=1:col1
H(c,d)=H(c,d)+abs(sum)/4+a1;
end
end
end
else
if sum>=0
for c=1:row1
for d=1:col1
H(c,d)=H(c,d)-abs(sum)/4-a1;
end
end
end
end
CA2=idwt2(A,H,V,D,wavelet);
DWT(8*(i-1)+1:8*(i-1)+8,8*(j-1)+1:8*(j-1)+8)=CA2;
End
end
%鲁棒型水印
[CA1,S]=wavedec2(dataG,level,wavelet);
CA=reshape(CA1,512,512);
T=dctmtx(8);
DCTrgb=blkproc(CA,[8 8],'P1*x*P2',T,T');
[row,col]=size(DCTrgb);
row=floor(row/8);
col=floor(col/8);
a=zeros([row col]);
[k1,k2]=randinterval(a,count,key);
for i=1:count
k1(1,i)=(k1(1,i)-1)*8+1;
k2(1,i)=(k2(1,i)-1)*8+1;
end
temp=0;
for i=1:count
if msg(i,1)==0
if DCTrgb(k1(i)+4,k2(i)+1)>DCTrgb(k1(i)+3,k2(i)+2)
temp=DCTrgb(k1(i)+4,k2(i)+1);
DCTrgb(k1(i)+4,k2(i)+1)=DCTrgb(k1(i)+3,k2(i)+2);
DCTrgb(k1(i)+3,k2(i)+2)=temp;
end
else
if DCTrgb(k1(i)+4,k2(i)+1)<DCTrgb(k1(i)+3,k2(i)+2)
temp=DCTrgb(k1(i)+4,k2(i)+1);
DCTrgb(k1(i)+4,k2(i)+1)=DCTrgb(k1(i)+3,k2(i)+2);
DCTrgb(k1(i)+3,k2(i)+2)=temp;
end
end
if DCTrgb(k1(i)+4,k2(i)+1)>DCTrgb(k1(i)+3,k2(i)+2)
DCTrgb(k1(i)+3,k2(i)+2)=DCTrgb(k1(i)+3,k2(i)+2)-a2;
else
DCTrgb(k1(i)+4,k2(i)+1)=DCTrgb(k1(i)+4,k2(i)+1)-a2;
end
end
DCTrgb1=DCTrgb;
CA=blkproc(DCTrgb,[8 8],'P1*x*P2',T',T);
CA1=reshape(CA,1,512*512);
dataG=waverec2(CA1,S,wavelet);
watermarkimagergb=data0;
watermarkimagergb(:,:,3)=DWT;
watermarkimagergb(:,:,2)=dataG;
imwrite(watermarkimagergb,goal,'bmp');
watermarkimagergb2=imread(goal);
figure;
subplot(121);imshow(data0);title('原始图像');
subplot(122);imshow(watermarkimagergb2);title('嵌入水印后的RGB图像');
end
function watermarkimagergb=embed1(input,watermark,goal, wavelet,level, alpha)
data=imread('lena.bmp');
data=double(data)/255;
datared=data(:,:,3);
[m,n]=size(datared);
dataw=imread('watermark.bmp');
dataw=double(dataw)/255;
row=floor(m/8);
col=floor(n/8);
datared2=zeros(row);
for i=1:row
for j=1:col
datared0=datared(8*(i-1)+1:8*(i-1)+8,8*(j-1)+1:8*(j-1)+8);
[CA1,S]=wavedec2(datared0,level,wavelet);
[U,sigma,V]=svd(CA1);
sigma(1,1)=sigma(1,1)+alpha*dataw(i,j);
CA1=U*sigma*V';
ff=waverec2(CA1,S,wavelet);
datared2(8*(i-1)+1:8*(i-1)+8,8*(j-1)+1:8*(j-1)+8)=ff;
end
end
watermarkimagergb=data;
watermarkimagergb(:,:,3)=datared2;
imwrite(watermarkimagergb,goal);
watermarkimagergb2=imread(goal);
figure(1);
imshow(data);title('原始图像');
figure(2);
imshow(watermarkimagergb2);title('嵌入水印后的RGB图像');
figure(3),imshow(datared);title('B 层图像');
figure(4),imshow(datared2);title('嵌入水印后的B层图像');
Function [count,msg]=embed2(image,watermark,goal,msg,key,level,wavelet,a1,a2)
frr=fopen(msg,'r');
[msg,count]=fread(frr,'ubit1');
fclose(frr);
data0=imread(image);
data0=double(data0)/255;
dataG=data0(:,:,2);
dataB=data0(:,:,3);
dataw=imread(watermark);
dataw=double(dataw);
dataw=Arnold(dataw,Fre,crypt)
%脆弱型水印
[row,col]=size(dataB);
DWT=zeros([row,col]);
row=floor(row/8);
col=floor(col/8);
for i=1:row
for j=1:col
CA2=dataB(8*(i-1)+1:8*(i-1)+8,8*(j-1)+1:8*(j-1)+8);
[A,H,V,D]=dwt2(CA2,wavelet);
[row1,col1]=size(H);
sum=0;
for c=1:row1
for d=1:col1
sum=sum+H(c,d);
end
end
if dataw(i,j)==1
if sum<0
for c=1:row1
for d=1:col1
H(c,d)=H(c,d)+abs(sum)/4+a1;
end
end
end
else
if sum>=0
for c=1:row1
for d=1:col1
H(c,d)=H(c,d)-abs(sum)/4-a1;
end
end
end
end
CA2=idwt2(A,H,V,D,wavelet);
DWT(8*(i-1)+1:8*(i-1)+8,8*(j-1)+1:8*(j-1)+8)=CA2;
End
end
%鲁棒型水印
[CA1,S]=wavedec2(dataG,level,wavelet);
CA=reshape(CA1,512,512);
T=dctmtx(8);
DCTrgb=blkproc(CA,[8 8],'P1*x*P2',T,T');
[row,col]=size(DCTrgb);
row=floor(row/8);
col=floor(col/8);
a=zeros([row col]);
[k1,k2]=randinterval(a,count,key);
for i=1:count
k1(1,i)=(k1(1,i)-1)*8+1;
k2(1,i)=(k2(1,i)-1)*8+1;
end
temp=0;
for i=1:count
if msg(i,1)==0
if DCTrgb(k1(i)+4,k2(i)+1)>DCTrgb(k1(i)+3,k2(i)+2)
temp=DCTrgb(k1(i)+4,k2(i)+1);
DCTrgb(k1(i)+4,k2(i)+1)=DCTrgb(k1(i)+3,k2(i)+2);
DCTrgb(k1(i)+3,k2(i)+2)=temp;
end
else
if DCTrgb(k1(i)+4,k2(i)+1)<DCTrgb(k1(i)+3,k2(i)+2)
temp=DCTrgb(k1(i)+4,k2(i)+1);
DCTrgb(k1(i)+4,k2(i)+1)=DCTrgb(k1(i)+3,k2(i)+2);
DCTrgb(k1(i)+3,k2(i)+2)=temp;
end
end
if DCTrgb(k1(i)+4,k2(i)+1)>DCTrgb(k1(i)+3,k2(i)+2)
DCTrgb(k1(i)+3,k2(i)+2)=DCTrgb(k1(i)+3,k2(i)+2)-a2;
else
DCTrgb(k1(i)+4,k2(i)+1)=DCTrgb(k1(i)+4,k2(i)+1)-a2;
end
end
DCTrgb1=DCTrgb;
CA=blkproc(DCTrgb,[8 8],'P1*x*P2',T',T);
CA1=reshape(CA,1,512*512);
dataG=waverec2(CA1,S,wavelet);
watermarkimagergb=data0;
watermarkimagergb(:,:,3)=DWT;
watermarkimagergb(:,:,2)=dataG;
imwrite(watermarkimagergb,goal,'bmp');
watermarkimagergb2=imread(goal);
figure;
subplot(121);imshow(data0);title('原始图像');
subplot(122);imshow(watermarkimagergb2);title('嵌入水印后的RGB图像');
end