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);

参考代码

四、注意事项

  1. 参数调整需要根据具体场景优化:
  • 回声法的delay参数需适应音频内容
  • 量化步长delta影响不可听性和鲁棒性平衡
  • 扩频法的alpha值通常取0.01-0.1
  1. 鲁棒性增强技巧:
  • 添加同步头
  • 使用纠错编码
  • 多位置重复嵌入
  1. 性能评估指标:
  • 不可感知性:PSNR、SNR
  • 鲁棒性:BER、NC
  • 容量:bps

这些代码实现了基本功能,实际应用中需根据具体需求进行参数优化和算法改进。

posted @ 2025-05-14 15:50  chen_yig  阅读(54)  评论(0)    收藏  举报