用matlab写自适应水印算法
时间: 2023-07-04 19:08:47 浏览: 102
自适应水印算法可以分为两个步骤:水印嵌入和水印提取。下面给出MATLAB代码实现。
首先是水印嵌入的代码:
```matlab
function [watermarked_img, watermarked_data] = embed_watermark(img, watermark, alpha)
% img: 待嵌入水印的原始图像
% watermark: 待嵌入的水印,可以是文本或图像
% alpha: 控制水印强度的参数
% 将原始图像转换为灰度图像
if size(img, 3) == 3
img = rgb2gray(img);
end
% 对灰度图像进行二维离散小波变换
[LL, LH, HL, HH] = dwt2(img, 'haar');
% 对水印进行预处理,将文本转换为二进制比特流,将图像转换为灰度图像
if ischar(watermark)
watermark = reshape(dec2bin(watermark), [], 1) - 48;
elseif isnumeric(watermark)
if size(watermark, 3) == 3
watermark = rgb2gray(watermark);
end
watermark = double(watermark(:)) / 255;
end
% 计算嵌入水印需要的参数
N = length(watermark);
M = numel(LL);
sigma = std(HH(:));
% 嵌入水印
watermarked_data = zeros(N, 1);
for i = 1:N
if HH(i) > alpha * sigma
watermarked_data(i) = watermark(i);
else
watermarked_data(i) = mod(watermark(i) + 1, 2);
end
end
% 将嵌入水印后的数据还原为二维数组
watermarked_data = reshape(watermarked_data, size(HH));
% 将嵌入水印后的小波系数合并为一个矩阵
watermarked_coeffs = [LL, LH; HL, HH];
% 对合并后的小波系数进行逆变换,得到嵌入水印后的图像
watermarked_img = idwt2(LL, LH, HL, HH, 'haar');
end
```
接下来是水印提取的代码:
```matlab
function [extracted_watermark, similarity] = extract_watermark(img, alpha, N)
% img: 带水印的图像
% alpha: 控制水印强度的参数
% N: 水印长度
% 将带水印的图像转换为灰度图像
if size(img, 3) == 3
img = rgb2gray(img);
end
% 对灰度图像进行二维离散小波变换
[LL, LH, HL, HH] = dwt2(img, 'haar');
% 计算提取水印需要的参数
M = numel(LL);
sigma = std(HH(:));
% 提取水印
extracted_watermark = zeros(N, 1);
for i = 1:N
if HH(i) > alpha * sigma
extracted_watermark(i) = 1;
else
extracted_watermark(i) = 0;
end
end
% 计算提取出的水印与原始水印之间的相似度
watermark = extracted_watermark(:);
similarity = sum(watermark == watermark) / N;
end
```
使用方法如下:
```matlab
% 嵌入水印
img = imread('lena.jpg');
watermark = 'Hello, world!';
alpha = 2;
[watermarked_img, watermarked_data] = embed_watermark(img, watermark, alpha);
% 提取水印
alpha = 2;
N = length(dec2bin(watermark)) * 8;
[extracted_watermark, similarity] = extract_watermark(watermarked_img, alpha, N);
extracted_watermark = char(reshape(num2str(extracted_watermark), [], 8) * [128, 64, 32, 16, 8, 4, 2, 1]');
fprintf('Extracted watermark: %s\n', extracted_watermark);
fprintf('Similarity: %.2f%%\n', similarity * 100);
```
其中,`img`为待嵌入水印的原始图像,`watermark`为待嵌入的水印,可以是文本或图像,`alpha`为控制水印强度的参数,`watermarked_img`为嵌入水印后的图像,`watermarked_data`为嵌入水印后的数据,`extracted_watermark`为提取出的水印,`similarity`为提取出的水印与原始水印之间的相似度。
阅读全文