matlab仿真实现基于DWT的邻近值水印算法代码
时间: 2023-10-16 19:06:18 浏览: 134
以下是基于DWT的邻近值水印算法的Matlab实现代码:
```matlab
% 加载原始图像
I = imread('lena.png');
% 将原始图像转换为灰度图像
I = rgb2gray(I);
% 显示原始图像
subplot(2,2,1);
imshow(I);
title('原始图像');
% 加载水印图像
W = imread('watermark.png');
% 将水印图像转换为二值图像
W = im2bw(W, 0.5);
% 显示水印图像
subplot(2,2,2);
imshow(W);
title('水印图像');
% 对原始图像进行DWT变换
[C, S] = wavedec2(I, 2, 'haar');
% 获取第二层DWT系数
[H, V, D] = detcoef2('all', C, S, 2);
A = appcoef2(C, S, 'haar', 2);
% 对水印图像进行重复扩展
W = repmat(W, [1, 1, size(H, 3)]);
% 将水印图像嵌入到DWT系数中
H = embed_watermark(H, W);
V = embed_watermark(V, W);
D = embed_watermark(D, W);
% 重建DWT系数
C = [A(:); H(:); V(:); D(:)];
I_watermark = waverec2(C, S, 'haar');
% 显示加水印后的图像
subplot(2,2,3);
imshow(I_watermark, []);
title('加水印后的图像');
% 提取水印图像
W_extract = extract_watermark(H);
% 显示提取出的水印图像
subplot(2,2,4);
imshow(W_extract);
title('提取出的水印图像');
% 嵌入水印函数
function X_watermark = embed_watermark(X, W)
% 获取邻近值
X_near = round(X/2)*2;
% 将水印图像转换为-1和1
W(W == 0) = -1;
% 嵌入水印
X_watermark = X_near + W;
end
% 提取水印函数
function W = extract_watermark(X)
% 获取邻近值
X_near = round(X/2)*2;
% 提取水印
W = (X - X_near) / 2;
% 将水印转换为0和1
W(W < 0) = 0;
W(W >= 0) = 1;
end
```
注意:在使用该代码时,需要将lena.png和watermark.png替换为自己的图像,并且需要将水印图像转换为二值图像。
阅读全文