www.gusucode.com > 给图片增加水印项目matlab源码程序 > DCT_watermark.m
clear;clc size=512; block=8; blockno=size/block; LENGTH=size*size/64; Alpha1=0.02; Alpha2=0.02; T1=100; I=zeros(size,size); D=zeros(size,size); BW=zeros(size,size); block_dct1=zeros(block,block); i=imread('watermark64by64.png'); mark=reshape(i,1,LENGTH); figure;imshow(i);title('水印'); %subplot(3,2,1);plot(mark);title('水印'); %显示原图 figure;I=imread('lena512512.jpg'); I0=I; imshow(I);title('原始图像'); % BW=edge(I,'canny');figure;;imshow(BW); % title('edge of origine image'); %嵌入水印 k=1; for m=1:blockno for n=1:blockno x=(m-1)*block+1; y=(n-1)*block+1; block_dct1=I(x:x+block-1,y:y+block-1); block_dct1=dct2(block_dct1); BW_8_8=BW(x:x+block-1,y:y+block-1); if m<=1|n<=1 T=0; else T=sum(BW_8_8); T=sum(T); end if T>T1 Alpha=Alpha2; else Alpha=Alpha1; end block_dct1(1,1)=block_dct1(1,1)*(1+Alpha*mark(k)); block_dct1=idct2(block_dct1); D(x:x+block-1,y:y+block-1)=block_dct1; k=k+1; end end figure;imshow(D,[]);title('嵌入水印后的图像'); %提取水印 k=1; mark1=[]; for m=1:blockno for n=1:blockno x=(m-1)*block+1; y=(n-1)*block+1; block_dct1=D(x:x+block-1,y:y+block-1); block_dct0=I0(x:x+block-1,y:y+block-1); block_dct1=dct2(block_dct1); block_dct0=dct2(block_dct0); BW_8_8=BW(x:x+block-1,y:y+block-1); if m<=1|n<=1 T=0; else T=sum(BW_8_8); T=sum(T); end if T>T1 Alpha=Alpha2; else Alpha=Alpha1; end mark1(k)=(block_dct1(1,1)/block_dct0(1,1)-1)/Alpha; k=k+1; end end mark1=reshape(mark1,64,64); figure imshow(mark1) title('提取的水印')