![]() |
[求助]DCT数字水印的问题
%DCT水印嵌入源代码
%%以字符串为嵌入水印 %定义常量 size=256; block=8; blockno=size/block;%一行有32格 LENGTH=size*size/64; Alpha1=0.025; Alpha2=0.1; T1=3; I=zeros(size,size);%产生全矩阵 D=zeros(size,size); BW=zeros(size,size); Block_dct1=zeros(block,block); %产生水印,并显示水印信息; subplot(3,2,1); Info='dcf'; InfoStrSize=length(Info); %将字符串转换为位数组 array=zeros(1,InfoStrSize*8); for m=1:InfoStrSize Infochar=double(Info(m)); %% 'c'为99 for n=1:8 array(8*(m-1)+n)=bitget(Infochar,n);%%获得Infochar第n位的值 end end plot(array); title('原始水印信息'); %显示原图 subplot(3,2,2); i=imread('lena.bmp'); imshow(i,[]); title('原始图像') %显示prewitt为算子的边缘图 BW=edge(i,'prewitt'); subplot(3,2,3);imshow(BW); Title('原始图像边缘图'); %嵌入水印 l=1; k=1; for m=1:blockno for n=1:blockno x=(m-1)*block+1; y=(n-1)*block+1;%算出每格图像的坐标(x,y),block=8,8*8的图像小格 block_dct1=i(x:x+block-1,y:y+block-1);%取原始图像小格中的像素点到block_dct1矩阵中。 block_dct1=dct2(block_dct1);%对二维数组进行离散余弦变换。dct是有损压缩如jpeg使用的技术。Dct是可逆的运算 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; %block_dct1(1,1)=block_dct1(1,1)*(1+Alpha*mark(k)); if l<=(InfoStrSize*8) block_dct1(1,1)=block_dct1(1,1)*(1+Alpha*array(l)); l=l+1; end else Alpha=Alpha1; % block_dct1(1,1)=block_dct1(1,1)*(1+Alpha*mark(k)); end Block_dct=idct2(block_dct1); D(x:x+block-1,y:y+block-1)=Block_dct; k=k+1; end end %显示嵌入水印后的图像 subplot(3,2,4);imshow(D,[]);title('嵌入水印图像') %保存该图像 D=uint8(D); imwrite(D,'marked.bmp'); |
所有时间均为北京时间。现在的时间是 14:23。 |
Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.