matlab实现的音频水印和图像水印
MATLAB实现的音频和图像水印,涵盖回声、量化、扩频和最低有效位(LSB)方法:
一、音频水印
1. 回声隐藏法
% 嵌入
function [watermarked] = echo_hiding_embed(audio, fs, watermark, delay0, delay1, alpha)
watermarked = audio;
len = length(audio);
for i = 1:length(watermark)
bit = watermark(i);
delay = delay0*(bit==0) + delay1*(bit==1);
echo_signal = [zeros(delay,1); alpha*watermarked(1:len-delay)];
watermarked = watermarked(1:len) + echo_signal;
end
end
% 提取
function watermark = echo_hiding_extract(audio, fs, delay0, delay1, wm_len)
watermark = zeros(1, wm_len);
frame_len = length(audio) / wm_len;
for i = 1:wm_len
frame = audio((i-1)*frame_len+1 : i*frame_len);
[c, lags] = xcorr(frame, frame);
[~, idx] = findpeaks(c);
delays = lags(idx(idx>0));
if any(abs(delays - delay0) < 2)
watermark(i) = 0;
elseif any(abs(delays - delay1) < 2)
watermark(i) = 1;
end
end
end
2. 量化索引调制
% 嵌入
function watermarked = quantization_embed(audio, watermark, delta)
watermarked = audio;
frame_len = floor(length(audio)/length(watermark));
for i = 1:length(watermark)
frame = audio((i-1)*frame_len+1 : i*frame_len);
mean_val = mean(frame);
quantized = delta * round(mean_val/delta + 0.5*(watermark(i)-0.5));
watermarked((i-1)*frame_len+1 : i*frame_len) = frame + (quantized - mean_val);
end
end
% 提取
function watermark = quantization_extract(audio, delta, wm_len)
watermark = zeros(1, wm_len);
frame_len = floor(length(audio)/wm_len);
for i = 1:wm_len
frame = audio((i-1)*frame_len+1 : i*frame_len);
mean_val = mean(frame);
watermark(i) = mod(round(mean_val/delta), 2);
end
end
二、图像水印
1. LSB方法
% 嵌入
function watermarked = lsb_embed(img, watermark)
img = uint8(img);
watermark = watermark(:);
img_bin = dec2bin(img, 8);
img_bin(:,end) = num2str(watermark(1:numel(img)));
watermarked = reshape(bin2dec(img_bin), size(img));
end
% 提取
function watermark = lsb_extract(img, wm_len)
img_bin = dec2bin(img(:), 8);
watermark = str2num(img_bin(:,end));
watermark = watermark(1:wm_len)';
end
2. 扩频水印
% 嵌入
function watermarked = spread_spectrum_embed(img, watermark, pn_seq, alpha)
dct_img = dct2(img);
pn_seq = reshape(pn_seq, size(dct_img));
watermarked_dct = dct_img + alpha * pn_seq .* watermark;
watermarked = idct2(watermarked_dct);
end
% 提取
function watermark = spread_spectrum_extract(img, orig_img, pn_seq, alpha)
dct_wm = dct2(img) - dct2(orig_img);
watermark = sign(sum(sum(dct_wm .* pn_seq)));
end
三、使用方法示例
% 音频水印示例
[audio, fs] = audioread('original.wav');
watermark = randi([0 1], 1, 100);
watermarked_audio = echo_hiding_embed(audio, fs, watermark, 50, 100, 0.5);
extracted_wm = echo_hiding_extract(watermarked_audio, fs, 50, 100, 100);
% 图像水印示例
img = imread('lena.jpg');
watermark = randi([0 1], 1, 100);
pn_seq = randi([0 1], size(img));
watermarked_img = spread_spectrum_embed(img, watermark, pn_seq, 0.1);
extracted_wm = spread_spectrum_extract(watermarked_img, img, pn_seq, 0.1);
四、注意事项
- 参数调整需要根据具体场景优化:
- 回声法的delay参数需适应音频内容
- 量化步长delta影响不可听性和鲁棒性平衡
- 扩频法的alpha值通常取0.01-0.1
- 鲁棒性增强技巧:
- 添加同步头
- 使用纠错编码
- 多位置重复嵌入
- 性能评估指标:
- 不可感知性:PSNR、SNR
- 鲁棒性:BER、NC
- 容量:bps
这些代码实现了基本功能,实际应用中需根据具体需求进行参数优化和算法改进。
浙公网安备 33010602011771号