dct2_embed.m
上传用户:ledlamp
上传日期:2022-07-25
资源大小:1k
文件大小:3k
源码类别:

图形图像处理

开发平台:

Visual C++

  1. %整理自lufei的水印代码(数字水印论坛)
  2. %整理:wyy022
  3. %Project:  Threshold-Based Correlation in DCT mid-band
  4. %           Uses two PN sequences; one for a "0" and another for a "1"
  5. %           水印嵌入
  6. clear all;
  7. % 保存开始时间 
  8. start_time=cputime;
  9. k=10;                           % 设置嵌入强度
  10. blocksize=8;                    % 设置块的大小
  11. midband=[   0,0,0,1,1,1,1,0;    % defines the mid-band frequencies of an 8x8 dct
  12.             0,0,1,1,1,1,0,0;
  13.             0,1,1,1,1,0,0,0;
  14.             1,1,1,1,0,0,0,0;
  15.             1,1,1,0,0,0,0,0;
  16.             1,1,0,0,0,0,0,0;
  17.             1,0,0,0,0,0,0,0;
  18.             0,0,0,0,0,0,0,0 ];
  19.         
  20. % 读入原始图像
  21. file_name='Baboon.bmp';
  22. cover_object=double(imread(file_name));
  23. % 原始图像的行数与列数
  24. Mc=size(cover_object,1);         %原图的行数
  25. Nc=size(cover_object,2);         %原图的列数
  26. % 确定可嵌入的最大信息量
  27. max_message=Mc*Nc/(blocksize^2);
  28. % 读入水印图像
  29. file_name='c.bmp';
  30. message=double(imread(file_name));
  31. %水印图像的行数与列数
  32. Mm=size(message,1);                 %水印图像的行数
  33. Nm=size(message,2);                 %水印图像的列数
  34. figure(1)
  35. imshow(message,[]);
  36. title('水印');
  37. % 将水印图像矩阵转换为0,1组成的向量
  38. message=reshape(message,1,Mm*Nm);
  39. % 检查水印信息是否过大
  40. if (length(message) > max_message)
  41.    error('水印太大')
  42. end
  43. % 将message_vector置为全1向量,并将message写入
  44. message_vector=ones(1,max_message);
  45. message_vector(1:length(message))=message;
  46. % 将cover_object写入watermarked image
  47. watermarked_image=cover_object;
  48. key=1100;
  49. % 重置随机数发生器状态为key
  50. rand('state',key);
  51. % 生成伪随机数
  52. pn_sequence_zero=round(2*(rand(1,sum(sum(midband)))-0.5));  
  53. % 图象分块并嵌入
  54. x=1;
  55. y=1;
  56. for (kk = 1:length(message_vector))
  57.     % 分块进行DCT变换
  58.     dct_block=dct2(cover_object(y:y+blocksize-1,x:x+blocksize-1));
  59.     
  60.     % 如果message_vector==0 并且midband==1,那么嵌入 pn_sequence_zero
  61.     ll=1;
  62.     if (message_vector(kk)==0)
  63.         for ii=1:blocksize
  64.             for jj=1:blocksize
  65.                 if (midband(jj,ii)==1)
  66.                     dct_block(jj,ii)=dct_block(jj,ii)+k*pn_sequence_zero(ll);
  67.                     ll=ll+1;
  68.                 end
  69.             end
  70.         end
  71.     end
  72.     
  73.     % 逆DCT变换
  74.     watermarked_image(y:y+blocksize-1,x:x+blocksize-1)=idct2(dct_block);    
  75.     
  76.     % 移动到下一块
  77.     if (x+blocksize) >= Nc
  78.         x=1;
  79.         y=y+blocksize;
  80.     else
  81.         x=x+blocksize;
  82.     end
  83. end
  84. % 转换为uint8 并将watermarked_image_uint8写入watermarked_image_uint8.bmp
  85. watermarked_image_uint8=uint8(watermarked_image);
  86. imwrite(watermarked_image_uint8,'watermarked_image_uint8.bmp','bmp');
  87. % 显示运行时间
  88. elapsed_time=cputime-start_time,
  89. % 计算psnr
  90. psnr=psnr(cover_object,watermarked_image),
  91. % 显示嵌入水印图象与原始图象
  92. figure(2)
  93. subplot(1,2,1);
  94. imshow(watermarked_image_uint8,[])
  95. title('嵌入水印图像')
  96. subplot(1,2,2)
  97. imshow(cover_object,[]);
  98. title('原始图像');