基于DCT的信息隐藏

素颜马尾好姑娘i 2024-04-03 11:58 125阅读 0赞

全套资料下载地址:https://download.csdn.net/download/sheziqiong/86763843
全套资料下载地址:https://download.csdn.net/download/sheziqiong/86763843
目 录
1 信息隐藏与数字水印算法的概要设计 1
2 信息隐藏与数字水印算法的可行性分析 2
3 信息隐藏与数字水印算法的详细设计 3
4 编码及测试 4
5 组内分工 6
6 心得 7
7 附录:程序源代码 8
2信息隐藏与数字水印算法的可行性分析
DCT是正交变换,它可以将8x8图像空间表达式转换为频率域,只需要用少量的数据点表示图像;DCT 产生的系数很容易被量化,因此能获得好的块压缩;DCT算法的性能很好,它有快速算法,如采用快速傅立叶变换可以进行高效的运算,因此它在硬件和软件中都容易实现;而且DCT算法是对称的,所以利用逆DCT算法可以用来解压缩图像。在基于DCT的变换编码中,图像是先经分块(8×8或16×16)后再经DCT,这种变换是局部的,只反映了图像某一部分的信息。当然也可以对整幅图像的特点,但是运算速度比分块DCT要慢。图像经DCT后,得到的DCT图像有三个特点:
(1). 系数值全部集中到0值附近(从直方图统计的意义上),动态范围很小,这说明用较小的量化比特数即可表示DCT系数;
(2). DCT变换后图像能量集中在图像的低频部分,即DCT图像中不为零的系数大部分集中在一起(左上角),因此编码效率很高。
(3). 没有保留原图像块的精细结构,从中反映不了原图像块的边缘、轮廓等信息,这一特点是由DCT缺乏时局域性造成的。
在嵌入过程中,水印嵌入经变换后的数据块,不可见性较好;采用比较中频系数法,并参考JEPG压缩模型,提高水印的抗压缩能力;水印的嵌入位置经大量试验选择在分块DCT域的中频段,可在鲁棒性和透明性之间得到较好的协调。

3信息隐藏与数字水印算法的详细设计
(1)DCT数字水印嵌入算法流程
在图片嵌入程序中,首先读取水印图片sss.bmp,通过rgb2gray函数使其变成灰度图,然后通过im2bw函数是水印图像变成二值图,同时记录下水印图像的长rm和宽cm,以同样的方法读取载体图片cover_image.bmp。本文转载自http://www.biyezuopin.vip/onews.asp?id=13912 DCT变换把水印图片分成8X8的矩阵之后,通过after(x+i,y+j)=before(x+i,y+j)+alpha*k(1),在结果矩阵的中频段嵌入水印,然后通过blkproc函数做DCT逆变换后输出保存在markresule.bmp图片中。

在这里插入图片描述

图2.DCT数字水印嵌入算法流程

  1. markbefore=imread('sss.bmp');
  2. markbefore2=rgb2gray(markbefore);
  3. mark=im2bw(markbefore2); %使水印图像变为二值图
  4. figure(1); %打开窗口
  5. subplot(2,3,1); %该窗口内的图像可以有两行三列
  6. imshow(mark),title('水印图像'); %显示水印图像
  7. [rm,cm]=size(mark); %计算水印图像的长宽
  8. cover_image=imread('carrier_image.bmp');
  9. cover_image=rgb2gray(cover_image);
  10. subplot(2,3,2),imshow(cover_image,[]),title('载体图像'); %[]表示显示时灰度范围为image上的灰度最小值到最大值
  11. before=blkproc(cover_image,[8 8],'dct2'); %将载体图像的灰度层分为8×8的小块,每一块内做二维DCT变换,结果记入矩阵before
  12. I=mark;
  13. alpha=30; %尺度因子,控制水印添加的强度,决定了频域系数被修改的幅度
  14. k1=randn(1,8); %产生两个不同的随机序列
  15. k2=randn(1,8);
  16. after=before; %初始化载入水印的结果矩阵
  17. for i=1:rm %在中频段嵌入水印
  18. for j=1:cm
  19. x=(i-1)*8;
  20. y=(j-1)*8;
  21. if mark(i,j)==1
  22. k=k1;
  23. else
  24. k=k2;
  25. end;
  26. after(x+1,y+8)=before(x+1,y+8)+alpha*k(1);
  27. after(x+2,y+7)=before(x+2,y+7)+alpha*k(2);
  28. after(x+3,y+6)=before(x+3,y+6)+alpha*k(3);
  29. after(x+4,y+5)=before(x+4,y+5)+alpha*k(4);
  30. after(x+5,y+4)=before(x+5,y+4)+alpha*k(5);
  31. after(x+6,y+3)=before(x+6,y+3)+alpha*k(6);
  32. after(x+7,y+2)=before(x+7,y+2)+alpha*k(7);
  33. after(x+8,y+1)=before(x+8,y+1)+alpha*k(8);
  34. end;
  35. end;
  36. result=blkproc(after,[8 8],'idct2'); %将经处理的图像分为8×8的小块,每一块内做二维DCT逆变换
  37. result = uint8(result);
  38. imwrite(result,'markresule.bmp','bmp'); %存储添加水印后的图像
  39. subplot(2,3,3),imshow(result,[]),title('嵌入水印的图像'); %显示添加水印后的图像
  40. %定义一个空空间来存储提取的水印
  41. disp('请选择对图像的攻击方式:');
  42. disp('1.添加白噪声');
  43. disp('2.高斯低通滤波处理');
  44. disp('3.对图像进行部分剪切');
  45. disp('4.将图像旋转十度');
  46. disp('5.将图像压缩处理');
  47. disp('6.添加椒盐噪声');
  48. disp('7.不处理图像,直接显示提取水印');
  49. disp('输入其它数字则直接显示提取水印');
  50. choice=input('请输入选择:');
  51. figure(1);
  52. switch choice %读入输入的选择 withmark为等待提取水印的图像
  53. case 1
  54. result_1=result;
  55. withmark=imnoise(result_1,'gaussian',0.02); %加入高斯白噪声
  56. subplot(2,3,4);
  57. imshow(withmark,[]);
  58. title('加入高斯白噪声后的图像'); %显示加了高斯白噪声的图像
  59. case 2
  60. result_2=result;
  61. H=fspecial('gaussian',[4,4],0.2);
  62. result_2=imfilter(result_2,H);
  63. subplot(2,3,4);
  64. imshow(result_2,[]);
  65. title('高斯低通滤波后图像');
  66. withmark=result_2;
  67. case 3
  68. result_3=result;
  69. result_3(1:64,1:400)=512; %使图像上方被剪裁
  70. subplot(2,3,4);
  71. imshow(result_3);
  72. title('上方剪切后图像');
  73. withmark=result_3;
  74. case 4
  75. result_4=imrotate(result,10,'bilinear','crop'); %双线性插值算法旋转10
  76. subplot(2,3,4);
  77. imshow(result_4);
  78. title('旋转10度后图像');
  79. withmark=result_4;
  80. case 5
  81. result_5 = result;
  82. result_5=im2double(result_5);
  83. cnum=10;
  84. dctm=dctmtx(8);
  85. P1=dctm;
  86. P2=dctm.';
  87. imageDCT=blkproc(result_5,[8,8],'P1*x*P2',dctm,dctm.');
  88. DCTvar=im2col(imageDCT,[8,8],'distinct').';
  89. n=size(DCTvar,1);
  90. DCTvar=(sum(DCTvar.*DCTvar)-(sum(DCTvar)/n).^2)/n;
  91. [dum,order]=sort(DCTvar);
  92. cnum=64-cnum;
  93. mask=ones(8,8);
  94. mask(order(1:cnum))=zeros(1,cnum);
  95. im88=zeros(9,9);
  96. im88(1:8,1:8)=mask;
  97. im128128=kron(im88(1:8,1:8),ones(16));
  98. dctm=dctmtx(8);
  99. P1=dctm.';
  100. P2=mask(1:8,1:8);
  101. P3=dctm;
  102. result_5=blkproc(imageDCT,[8,8],'P1*(x.*P2)*P3',dctm.',mask(1:8,1:8),dctm);
  103. WImage5cl=mat2gray(result_5);
  104. subplot(2,3,4);
  105. imshow(WImage5cl);
  106. title('JPEG压缩后图像');
  107. withmark=WImage5cl;
  108. case 6
  109. result_6=result;
  110. withmark=imnoise(result_6,'salt & pepper',0.02); %加入椒盐躁声
  111. subplot(2,3,4);
  112. imshow(withmark,[]);
  113. title('加入椒盐噪声后的图像'); %显示加了椒盐噪声的图像
  114. case 7
  115. subplot(2,3,4);
  116. imshow(result,[]);
  117. title('未受攻击的水印图像');
  118. withmark=result;
  119. otherwise
  120. disp('输入数字选择无效,图像未受攻击,直接提取水印');
  121. subplot(2,3,4);
  122. imshow(result,[]);
  123. title('未受攻击的水印图像');
  124. withmark=result;
  125. end
  126. after_2=blkproc(withmark,[8,8],'dct2'); %此步开始提取水印,将灰度层分块进行DCT变换
  127. p=zeros(1,8); %初始化提取数值用的矩阵
  128. mark_2 = zeros(rm,cm);
  129. for i=1:rm
  130. for j=1:cm
  131. x=(i-1)*8;y=(j-1)*8;
  132. p(1)=after_2(x+1,y+8); %将之前改变过数值的点的数值提取出来
  133. p(2)=after_2(x+2,y+7);
  134. p(3)=after_2(x+3,y+6);
  135. p(4)=after_2(x+4,y+5);
  136. p(5)=after_2(x+5,y+4);
  137. p(6)=after_2(x+6,y+3);
  138. p(7)=after_2(x+7,y+2);
  139. p(8)=after_2(x+8,y+1);
  140. if corr2(p,k1)>corr2(p,k2) %corr2计算两个矩阵的相似度,越接近1相似度越大
  141. mark_2(i,j)=1; %比较提取出来的数值与随机频率k1和k2的相似度,还原水印图样
  142. else
  143. mark_2(i,j)=0;
  144. end
  145. end
  146. end
  147. subplot(2,3,5);
  148. mark_2 = uint8(mark_2);
  149. imshow(mark_2,[]),title('提取出的水印');
  150. subplot(2,3,6);
  151. imshow(mark),title('原嵌入水印');
  152. N=correlation(mark_2,mark);
  153. disp('原水印图像与提取水印图像互相关系数:')
  154. disp(N);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
全套资料下载地址:https://download.csdn.net/download/sheziqiong/86763843
全套资料下载地址:https://download.csdn.net/download/sheziqiong/86763843

发表评论

表情:
评论列表 (有 0 条评论,125人围观)

还没有评论,来说两句吧...

相关阅读

    相关 dct变换(dct变换矩阵)

    什么是DCT变速器? 1。双离合器变速器(DCT)仍然像手动变速器一样是由众多齿轮、同步器、液压控制单元、电子控制单元和各轴等部件组成的,速比变化靠计算机控制来实现,而且

    相关 隐藏apache版本信息

    当开启Apache服务的时候,他人可能通过F12找到你的Apache版本号,从而利用一些已知的漏洞或者零day漏洞来进行攻击。所以为了减少一点——仅仅是一点的风险,我们可以隐藏