基于 MATLAB 实现的 DCT 域的信息隐藏

张开发
2026/4/20 9:23:09 15 分钟阅读

分享文章

基于 MATLAB 实现的 DCT 域的信息隐藏
♻️ 资源大小2.81MB➡️资源下载https://download.csdn.net/download/s1t16/874253941. DCT 域的信息隐藏图像压缩标准JPEG的核心——二维 DCT 变换。在 DCT 域中的信息隐藏可以有效地抵抗 JPEG 有损压缩。2. 基本隐藏算法以一定的方式挑选一些中频系数在这些中频系数中叠加秘密信息所有中频系数固定位置的中频系数随机挑选中频系数选择最大的几个中频系数2.1. 算法一在选出的中频系数中叠加秘密信息x(i,j)x(i,j)amix(i,j) DCT系数x(i,j) 隐藏后的 DCT 系数mi 第 i 个秘密信息比特a 可调参数控制嵌入强度2.2. 算法二在选出的中频系数中叠加秘密信息x(i,j)x(i,j)(1ami)方法一每个系数上嵌入的强度相同方法二根据系数的大小成比例地嵌入是对方法一的改进缺点此两算法的提取需要原始图像2.3. 算法三不需要原始载体的信息隐藏方法利用载体中两个特定数的相对大小来代表隐藏的信息。2.3.1. 嵌入载体图像分为 8 × 8 的块做二维 DCT 变换伪随机地选择一个图像块 Bi 分别选择其中的两个位置比如用 (u1,v1) 和 (u2,v2) 代表所选定的两个系数的坐标如果 Bi(u1,v1)Bi(u2,v2) 代表隐藏 1 如果相反则交换两系数。如果 Bi(u1,v1)Bi(u2,v2) 代表隐藏 0 如果相反则交换两系数。2.3.2. 提取接收者进行二维 DCT 变换比较每一块中约定位置的 DCT 系数值根据其相对大小得到隐藏信息的比特串从而恢复出秘密信息。特点不需原始图像。注意如果选定位置的两个系数相差太大则对图像影响较大。应选择相近的值如中频系数。2.4. 算法四算法三的扩展利用DCT中频系数中的三个系数之间的相对关系来对秘密信息进行编码。2.4.1. 嵌入选择三个位置 (u1,v1) (u2,v2) (u3,v3) 嵌入 1令 Bi(u1,v1)Bi(u3,v3)D Bi(u2,v2)Bi(u3,v3)D 。嵌入 0令 Bi(u1,v1)Bi(u3,v3)-D Bi(u2,v2)Bi(u3,v3)-D 。如果数据不符则修改这三个系数值使得它们满足上述关系。其中参数 D 的选择要考虑隐藏的健壮性和不可察觉性之间的平衡D 越大隐藏算法对于图像处理就越健壮但是对图像的改动就越大越容易引起察觉。如果需要做的修改太大则放弃该块将其标识为“无效”。“无效”对这三个系数做小量的修改使得它们满足下面条件之一Bi(u1,v1)≤Bi(u3,v3)≤Bi(u2,v2) 或 Bi(u1,v1)≥Bi(u3,v3)≥Bi(u2,v2)2.4.2. 提取对图像进行 DCT 变换比较每一块相应三个位置的系数从它们之间的关系可以判断隐藏的是信息“1”、“0”还是“无效”块这样就可以恢复秘密信息。3. 代码实现与解释使用 MATLAB 实现了第三个算法即 2.3. 中的利用利用载体中两个特定数的相对大小来代表隐藏信息的方法不需要原始载体的信息用 decode.m 实现秘密信息嵌入用 encode.m 实现秘密信息提取字符串处理的函数与上一个实验使用的是一样的目的是将字符串编码为二进制比特流或者将二进制比特流解码为字符串。3.1. encode.mclear; msgfidfopen(隐藏信息.txt,r);%打开秘密文件,读入秘密信息 [msg,count]fread(msgfid); fclose(msgfid); msgstr2bit(msg); ends[0,0,0,0,0,0,0,0];%结尾标记 msg[msg,ends]; msgmsg; [len col]size(msg); %读取载体图像进行DCT变换 ioimread(载体图片.bmp); iodouble(io)/255; outputio; i1io(:,:,2);%取图像的第二层来隐藏 Tdctmtx(8);%对图像进行分块 DCTrgbblkproc(i1,[8 8],P1*x*P2,T,T);%对图像分块进行DCT变换 [row,col]size(DCTrgb); rowfloor(row/8); colfloor(col/8); %顺序信息嵌入 countcount*88;%需要加上结尾信息长度 alpha0.03;%Alpha系数用于控制差值大小 temp0; for i1:count; if msg(i,1)0 if DCTrgb(i2,i1)DCTrgb(i3,i6) %选择(3,2)和(4,7)这一对系数 tempDCTrgb(i2,i1); DCTrgb(i2,i1)DCTrgb(i3,i6); DCTrgb(i3,i6)temp; end else if DCTrgb(i2,i1)DCTrgb(i3,i6) tempDCTrgb(i2,i1); DCTrgb(i2,i1)DCTrgb(i3,i6); DCTrgb(i3,i6)temp; end end if DCTrgb(i2,i1)DCTrgb(i3,i6) DCTrgb(i2,i1)DCTrgb(i2,i1)-alpha;%将原本小的系数调整更小使得系数差别变大 else DCTrgb(i3,i6)DCTrgb(i3,i6)-alpha; end end %将信息写回并保存 wiblkproc(DCTrgb,[8 8],P1*x*P2,T,T);%对DCTrgb进行逆变换 outputio; output(:,:,2)wi; imwrite(output,载体图片_隐藏信息.bmp); %显示结果对比 figure; subplot(1,2,1);imshow(载体图片.bmp);title(原始图像); subplot(1,2,2);imshow(载体图片_隐藏信息.bmp);title(嵌入信息图像);首先对需要嵌入的信息做一个预处理加上一个结尾标记目的是方便解码时能够正确的提取需要的信息去除掉冗余信息。然后彩色图片有 RGB 三层信息只需要一层来隐藏信息即可这里取的是第二层来做 DCT 变换隐藏信息。嵌入信息过程中 Alpha 系数用于控制差值大小将两个系数的差值放大可以保证提取信息的正确性但是过大会暴露出载体图片的变化。接下来会做一个对比。3.2. decode.mclear; wiimread(载体图片_隐藏信息.bmp);%读取携密图像 widouble(wi)/255; wiwi(:,:,2);%取图像的第二层来提取 Tdctmtx(8);%对图像进行分块 DCTcheckblkproc(wi,[8 8],P1*x*P2,T,T);%对图像分块进行DCT变换 %提取信息 for i1:256 %256为隐藏的秘密信息的比特数 if DCTcheck(i2,i1)DCTcheck(i3,i6) message(i)1; else message(i)0; end end %对信息进行处理过滤掉其他信息 ends[0,0,0,0,0,0,0,0];%结尾标记 l0; for i1:8:256 %因为每个字符编码为8位所以间隔为8 if message(i:i7)ends li-1; end end message0message(1:l); %将提取信息写入文件保存 outbit2str(message0); fidfopen(提取信息.txt, wt); fwrite(fid, out); fclose(fid);提取同样是从 RGB 图片的第二层提取需要做的特殊处理的是将结尾标记之后的信息去掉就能得到隐藏信息。4. 实验结果展示实验中 Alpha 系数是可变的接下来对比一下改变它的效果以确定一个合适的值。4.1. Alpha 0.034.2. Alpha 0.14.3. Alpha 0.54.4. Alpha 1从图中可以看出Alpha 0.1 时就已经隐约能看到对角线上有痕迹0.5 和 1 时都特别明显所以实验中我还是选择了比较小的 0.03 来作为差值。最终结果见 载体图片_隐藏信息.bmp4.5. 待隐藏秘密信息隐藏信息.txt4.6. 从图片提取的秘密信息提取信息.txt可以看出信息能够完美提取出来。

更多文章