MATLAB 图像嵌入水印图像程序
原理:
水印的嵌入:
- 对64x64像素的水印图像(可为rgb或灰度图像)进行猫脸变换,得到置乱后的水印图像 W ′ W' W′;
- 对512x512像素的载体图像分割成互不重叠的8x8的小方块,后对每个小块进行DCT离散余弦变换,取变换矩阵中的中频系数构成4x4的矩阵 B i j ( i = 1 , 2 , . . . , m ; j = 1 , 2 , . . . , n ) B_{ij}(i=1,2,...,m; j=1,2,...,n) Bij(i=1,2,...,m;j=1,2,...,n);
- 对 B i j B_{ij} Bij矩阵进行奇异值分解SVD,取最大的奇异值构成矩阵 A A A,再对 A A A进行奇异值分解: A = U S V T A=USV^T A=USVT;
- 将置乱后的水印图像矩阵
W
′
W'
W′叠加到矩阵
S
S
S上,
- D = S + α W ′ D=S+\alpha W' D=S+αW′ (常数 α \alpha α为嵌入因子)
- 奇异值分解 D = U 1 S 1 V 1 T D = U_1S_1V_1^T D=U1S1V1T
- 反变换得 A ′ = U S 1 V T A'=US_1V^T A′=US1VT
- 将 A ′ A' A′中相应的元素替换 B i j B_{ij} Bij中的最大奇异值,将变换后的中频系数矩阵 B i j B_{ij} Bij还原回相应的块中;
- 对每一块嵌入了水印信息的矩阵进行逆DCT变换,最后得到嵌入了水印图像信息的图像
I
′
I'
I′。
水印的提取:
- 对图像I*分成8x8的小块,并对每一个小块进行DCT离散余弦变换;
- 取每一块中的16个中频系数,构成矩阵Bij*; 后对其进行奇异值分解SVD,取最大奇异值构成矩阵A*;
- 设需要提取的水印图像为W*,提取步骤为:
- A = U ∗ S ∗ V ∗ T A=U*S*V*T A=U∗S∗V∗T
- D = U 1 ∗ S ∗ V 1 T D = U_{1}*S*V_1^T D=U1∗S∗V1T
- W ∗ = ( D − S ) / α W^* = (D-S)/\alpha W∗=(D−S)/α
- 将提取出的灰度水印图像经过猫脸逆变换,得到水印图像。
程序
此程序将水印图像添加到载体图像中以进行加密。此程序包含 3 个文件,分别是:
watermark_main.m
: 添加水印的主函数,ArnoldTransform.m
: 猫脸变换函数(arnold transform),InverseArnoldTransform.m
: 猫脸逆变换函数(inverse arnold transform).
watermark_main函数的输入参数为:
base_img_path
: 载体图像路径,watermark_img_path
: 水印图像路径,save_img1_path
: 保存加过水印的图像路径,save_img2_path
: 保存提取的水印图像路径.
该程序需要一个载体图像,即想要使用水印加密的图像和想要嵌入到载体图像中的水印图像。在水印嵌入过程中,载体图像和水印图像会从rgb转换为灰度,水印图像也会被转换成64*64像素。
![](https://user-images.githubusercontent.com/30465494/155265652-cb470611-ec5a-4728-b637-3436fd48592e.png)
这个博客中的程序可从github中下载使用。