% 原始图像和水印图像
original_image = imread(‘lena.jpg’);
watermark_image = imread(‘watermark.png’);
% 离散小波变换
[cA, cH, cV, cD] = dwt2(original_image, ‘db4’);
% 水印嵌入
alpha = 0.1; % 嵌入强度因子
watermarked_cH = cH + alpha * watermark_image;
watermarked_image = idwt2(cA, watermarked_cH, cV, cD, ‘db4’);
% 水印提取
extracted_watermark = (watermarked_image - original_image) / alpha;
% 计算归一化相关系数(NC)
nc = normxcorr2(watermark_image, extracted_watermark);
nc = nc(size(watermark_image,1):end-size(watermark_image,1)+1, …
size(watermark_image,2):end-size(watermark_image,2)+1);
% 显示结果
figure;
subplot(1,3,1);
imshow(original_image);
title(‘原始图像’);
subplot(1,3,2);
imshow(watermarked_image);
title(‘嵌入水印后的图像’);
subplot(1,3,3);
imshow(extracted_watermark);
title(‘提取的水印’);
disp(['水印与原水印的归一化相关系数(NC): ', num2str(nc)]);
主要步骤如下:
读取原始图像和水印图像。
对原始图像进行离散小波变换,得到各个子带系数。
在高频子带系数(cH)中嵌入水印图像,并通过逆小波变换得到含水印的图像。
从含水印的图像中提取水印,并计算与原水印的归一化相关系数(NC)。
显示原始图像、含水印的图像和提取的水印。
NC值越接近于1,表示提取的水印与原水印的相似度越高,水印嵌入效果越好。一般情况下,NC > 0.75 可以认为水印提取成功。
在实际应用中,您可以根据需要调整嵌入强度因子alpha,以平衡水印不可见性和鲁棒性。您还可以尝试使用其他小波基函数,或者采用更复杂的水印嵌入和提取算法,如基于奇异值分解的方法。