Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#1 |
初级会员
注册日期: 2009-04-21
年龄: 38
帖子: 1
声望力: 0 ![]() |
![]()
谁帮我看看这个程序哪错了,我找不出来,这个程序是在原始彩色图像里嵌入灰度图像实现水印的不可见性和彩色图像的保真性!程序如下:
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 |
![]() |
![]() |