%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Global MarkFile = 'H:\gg\源代码\视频水印代码\代码\njmark.bmp'; % 水印图像文件 YUVFile = 'miss.qcif'; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% message = imread(MarkFile); %读入水印图像“copyright.bmp”并转换为双精度数组 Mm = size(message,1); %计算图像的高度 Nm = size(message,2); %计算图像的宽度 Q=10; %步长 n=32; blocksize=8; N=Mm*Nm; Ns=ceil(N*8/n); k=1; FN = 10; %frame number %灰度图象预处理 figure, imshow(message); % 显示水印图像 message = reshape(message,1,Mm*Nm); W = zeros(1,Nm*Mm*8); for(i=1:N) temp=message(i); for(j=1:8) W(k)=bitget(bitand(temp,1),1); temp=bitshift(temp,-1); k=k+1; end end %读入视频帧 [cover_object,imgRgb]=loadFileYuv('miss.yuv',176,144,[1:FN]); for i=1:FN yuv(:,:,:,i)=rgb2ycbcr(cover_object(i).cdata); Y(:,:,i)=double(yuv(:,:,1,i));%Y中存储的是视频序列的亮度分量 YY(:,:,i)=Y(:,:,i); end %img1 = uint8(yuv(:,:,1,1)) figure,imshow(uint8(Y(:,:,1))); % 显示嵌入前视频第一帧 %figure,imshow(imgRgb); %movie(cover_object(1)); %镜头切分 %分块8*8的DCT变换,确定嵌入的起始位置 MaxDC=0; MinDC=65536; for(i=1:FN) for(j=1:blocksize:137) for(k=1:blocksize:169) Y(j:j+blocksize-1,k:k+blocksize-1,i)=dct2(Y(j:j+blocksize-1,k:k+blocksize-1,i)); if(Y(j,k,i)>MaxDC) MaxDC=Y(j,k,i); end if(Y(j,k,i)=MinDC1) if(Y(j,k,i)<=MaxDC1) p = n * floor((Y(j,k,i)-MinDC1)/d); temp=reshape(Y(j:j+blocksize-1,k:k+blocksize-1,i),1,64); for c = 1:n H = round(temp(A(c))/Q); if(W(p+c)==mod(H,2)) q = H; else q = H + 1; end temp(A(c))=q*Q; end flag(p/n+1) = 1; Y(j:j+blocksize-1,k:k+blocksize-1,i)=reshape(temp,8,8); end end Y(j:j+blocksize-1,k:k+blocksize-1,i)=idct2(Y(j:j+blocksize-1,k:k+blocksize-1,i)); end end end figure,imshow(uint8(Y(:,:,1,1))); % 显示嵌入后视频第一帧 for i=1:FN yuv(:,:,1,i)=Y(:,:,i); a=rgb2ycbcr(cover_object(i).cdata); a(:,:,1)=yuv(:,:,1,i); y=ycbcr2rgb(a); cover_object(i).cdata=y; end %movie(cover_object(1)); saveFileYuv(cover_object, 'save.yuv', 'w'); img1 = yuv(1:8,1:8,1,1) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %提取算法 [cover_object,imgRgb]=loadFileYuv('save.yuv',176,144,[1:FN]); for i=1:FN yuv2(:,:,:,i)=rgb2ycbcr(cover_object(i).cdata); Y2(:,:,i)=double(yuv2(:,:,1,i));%Y中存储的是视频序列的亮度分量 end img2 = Y2(1:8,1:8,1) blocksize=8; MaxDC3=0; MinDC3=65536; %Y2 = Y; for(i=1:FN) for(j=1:blocksize:137) for(k=1:blocksize:169) Y2(j:j+blocksize-1,k:k+blocksize-1,i)=dct2(Y2(j:j+blocksize-1,k:k+blocksize-1,i)); if(Y2(j,k,i)>MaxDC3) MaxDC3=Y2(j,k,i); end if(Y2(j,k,i)=MinDC4) if(Y2(j,k,i)<=MaxDC4) p1 = n * floor((Y2(j,k,i)-MinDC4)/d2); temp=reshape(Y2(j:j+blocksize-1,k:k+blocksize-1,i),1,64); for c=1:n H1=round(temp(A(c))/Q); W1(p1+c)=mod(H1,2); end end end end end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% watermark=zeros(1,Mm*Nm); k=1; for(i=1:8:N*8-7) for(j=1:8) watermark(k)=watermark(k)+W1(i+j-1)*2^(j-1); end if(watermark(k)<128) watermark(k) = 0; else watermark(k) = 255; end k=k+1; end watermark=reshape(watermark,Mm,Nm); figure,imshow(uint8(watermark),[]); count = 0; for i=1:256 if(flag(i)==1) count = count + 1; end end for f=1:FN%计算每帧的PSNR值 P(f)=PSNR(Y(:,:,f),YY(:,:,f)); end count PSNR %%%%%%%%