基于DCT变换和位平面分解的数字水印嵌入提取算法matlab仿真
1.算法运行效果图预览
2.算法运行软件版本
matlab2022a
3.算法理论概述
基于离散余弦变换(Discrete Cosine Transform, DCT)和位平面分解(Bit-Plane Decomposition)的数字水印嵌入与提取算法,是一种结合了频域与空域特性的稳健数字水印技术。该方法利用DCT变换将图像信号转换到频域,以利于在视觉重要性较低的频率系数中嵌入水印信息;同时,通过位平面分解,可以精细地控制水印嵌入的强度和鲁棒性,保证水印在图像处理操作下的存活率。
3.1 离散余弦变换(DCT)
DCT是将图像从空间域转换到频率域的一种变换方法,常用于图像压缩和数字水印领域。对于一个N×N的图像块X,其二维DCT可表示为:
3.2 位平面分解
位平面分解是将图像的每个像素值按照二进制位分解成多个位平面,第i位平面包含了所有像素值的第i位。对于8位灰度图像,共有8个位平面,最低有效位(LSB)对应第0位平面,最高有效位(MSB)对应第7位平面。
3.3 数字水印嵌入算法
3.4 数字水印提取算法
4.部分核心程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | [Imark,Mwk_binarys] = func_desert(Mwk_binary,RR,CC,4); figure (1); subplot (122); imshow(Imark,[]); title ( '提取水印' ); binary = Mwk_binarys; [n,m] = size ( binary ); [l,h] = size (low_high); gray = zeros (n,m); block_size =(n*m/l)^0.5; for i =1:block_size:n for j =1:block_size:m n1= ceil ( i /block_size); m1= ceil ( j /block_size); a=low_high((n1-1)*(m/block_size)+m1,1); b=low_high((n1-1)*(m/block_size)+m1,2); temp= binary ( i : i +block_size-1, j : j +block_size-1); temp1=temp; dix= temp==0; temp1(dix)=a; dix= find (temp==1); temp1(dix)=b; gray( i : i +block_size-1, j : j +block_size-1)=temp1; end end subplot (121); imshow( uint8 (gray)); %提取水印的性能分析 Imark0 = imread ( '1.bmp' ); Imark0=imresize(Imark0,[64,64]); PSNR(jj) = func_psnr((Imark0),(Imark)); NC(jj) = func_nc((Imark0),(Imark)) ; end figure ; plot (NOISE,PSNR, 'b-o' ); grid on xlabel ( 'noise' ); ylabel ( 'PSNR' ); figure ; plot (NOISE,NC, 'b-o' ); grid on xlabel ( 'noise' ); ylabel ( 'NC' ); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下