信号隐藏是一种常见的数字水印技术,用于将信息嵌入到数字信号中,以保护知识产权和版权。其中,基于奇异值分解(SVD)和小波变换算法是一种常见的水印嵌入和提取方法。本文将介绍这种算法的实现,并附带Matlab代码。
首先,我们需要对原始图像进行SVD分解,得到三个矩阵——U、S和V。然后,将待嵌入的水印图像进行小波变换,得到小波系数矩阵C。接着,将S矩阵中的前n个奇异值替换为水印矩阵的小波系数,形成新的S矩阵S’。最后,使用替换后的S’、U和V矩阵重构出嵌入了水印的新的图像。
水印的提取过程也比较简单。首先,对新图像进行SVD分解,获得新的U、S和V矩阵。接着,将S’矩阵与原始S矩阵相减得到差异矩阵E。然后,对E矩阵进行小波变换,得到小波系数矩阵C’。最后,根据C’矩阵的系数值判断是否存在水印。
下面是使用Matlab实现该算法的代码:
%% 加载原始图像
img = imread(‘lena.bmp’);
%% 嵌入水印图像
watermark = imread(‘watermark.bmp’);
[U, S, V] = svd(double(img));
[C, S1] = wavedec2(watermark, 3, ‘db4’);
n = 50; % 替换前50个奇异值
S(1:n, 1:n) =