实验1. 仿真实现基于DWT的邻近值水印算法。水印的嵌入过程:(1)对载体图像做一级小波变换;(2)利用邻近值算法(P95),在HL1(或LH1)系数中嵌入水印数据(二值数据);邻近值算法的思想:设定步长a,对于数值,根据水印比特的取值0或1,修改的值。当要嵌入1时,取为最接近的偶数个a的值;当要嵌入0时,取为最接近的奇数个a的值。(3)嵌入水印后,对系数做一级小波逆变换,得到含水印图像。水印的提取过程:(1)对含水印图像做一级小波变换;(2)利用邻近值算法,从含水印图像一级小波变换的HL1(或LH1)系数中提取出水印信息,即:当最接近偶数时,则水印信息为1;当最接近奇数时,则水印信息为0。要求:给出代码,并给出原始载体图像、水印图像、含水印图像以及提取的水印图像。matlab代码
时间: 2024-02-15 15:03:48 浏览: 142
基于DWT-DCT-SVD算法的音频水印嵌入和提取算法MATLAB仿真,
5星 · 资源好评率100%
以下是基于DWT的邻近值水印算法的MATLAB代码,包括水印嵌入和提取过程。
```matlab
% 读入原始载体图像和水印图像
carrier = imread('carrier.png');
watermark = imread('watermark.png');
% 将载体图像和水印图像转为灰度图像
carrier_gray = rgb2gray(carrier);
watermark_gray = rgb2gray(watermark);
% 进行一级小波变换
[LL1, HL1, LH1, HH1] = dwt2(carrier_gray, 'haar');
% 获取HL1系数矩阵的大小
[m, n] = size(HL1);
% 水印比特序列
watermark_bits = reshape(watermark_gray, 1, []);
watermark_bits = watermark_bits > 128;
% 步长设为2
a = 2;
% 嵌入水印
for i = 1:length(watermark_bits)
if watermark_bits(i) == 1
% 对于嵌入比特为1的系数,取最接近的偶数个a的值
HL1(i) = round(HL1(i) / a) * a;
else
% 对于嵌入比特为0的系数,取最接近的奇数个a的值
HL1(i) = round(HL1(i) / a + 0.5) * a - 1;
end
end
% 进行一级小波逆变换,得到含水印图像
watermarked = idwt2(LL1, HL1, LH1, HH1, 'haar');
% 进行一级小波变换
[LL1_wm, HL1_wm, LH1_wm, HH1_wm] = dwt2(watermarked, 'haar');
% 提取水印
watermark_bits_extracted = zeros(1, length(watermark_bits));
for i = 1:length(watermark_bits)
if mod(HL1_wm(i), a) == 0
% 最接近偶数个a的值,提取出的水印比特为1
watermark_bits_extracted(i) = 1;
else
% 最接近奇数个a的值,提取出的水印比特为0
watermark_bits_extracted(i) = 0;
end
end
% 将提取出的水印比特序列转为图像
watermark_extracted = reshape(watermark_bits_extracted, size(watermark_gray));
watermark_extracted = watermark_extracted * 255;
% 显示原始载体图像、水印图像、含水印图像和提取出的水印图像
subplot(2, 2, 1), imshow(carrier), title('Original carrier image');
subplot(2, 2, 2), imshow(watermark), title('Watermark image');
subplot(2, 2, 3), imshow(watermarked, []), title('Watermarked image');
subplot(2, 2, 4), imshow(watermark_extracted), title('Extracted watermark image');
% 保存含水印图像和提取出的水印图像
imwrite(watermarked, 'watermarked.png');
imwrite(watermark_extracted, 'watermark_extracted.png');
```
请注意,此代码仅为示例代码,可能需要根据实际情况进行修改和优化。此外,需要提前准备好原始载体图像和水印图像,并将其命名为"carrier.png"和"watermark.png"。
阅读全文