MATLAB 水印嵌入函数:wm 和 wm_type_0 代码解析

本文将解析两个 MATLAB 函数:wm 和 wm_type_0,它们用于实现数字图像水印嵌入过程。

1. wm 函数

wm 函数是水印嵌入的主函数,它负责将水印信息嵌入到原始图像中。

function J = wm(I, w, g)
% 此函数为嵌入过程
% 输入:I为原始图像;w为水印信息;g为水印嵌入的阈值
% 输出:J为嵌入水印的图像
%%
% 参数设置
step = 0.5; % 小波系数增长步长
%%
[mm,nn] = size(I);
% 一层小波分解
[LL,LH,HL,HH] = dwt2(I,'haar');
%=======计算avr_LH======
[m0,n0] = size(LH); avr_LH = 0;



%=======计算avr_HL======
[m1,n1] = size(HL); avr_HL = 0;



% 判断嵌入的子带
if avr_LH <= avr_HL
    num = 0; loca = LH;
else
    num = 1; loca = HL;
end

%%
% 嵌入水印
if num == 0
    loca = wm_type_0(loca,w,step,g);  %LH是横向,写出嵌入子函数
else
    loca = wm_type_1(loca,w,step,g);  %HL是纵向,写出嵌入子函数
end
%%
if num == 0
    LH = loca; 
else
    HL = loca; 
end
J = idwt2(LL,LH,HL,HH,'haar',[mm,nn]);   % 小波逆变换,还回原始图像

参数说明:

  • I:原始图像。
  • w:水印信息。
  • g:水印嵌入阈值,用于控制嵌入强度。

函数流程:

  1. 对原始图像 I 进行一层 Haar 小波分解,得到四个子带:LL、LH、HL、HH。
  2. 计算 LH 和 HL 子带的平均值 avr_LH 和 avr_HL,并根据它们的大小选择一个子带作为水印嵌入的目标子带。
  3. 调用 wm_type_0 或 wm_type_1 函数将水印信息嵌入到目标子带中。
  4. 将嵌入水印后的子带替换回原分解后的子带中,并进行小波逆变换,得到最终的嵌入水印图像 J。

2. wm_type_0 函数

wm_type_0 函数是 wm 函数的子函数,它用于将水印信息嵌入到 LH 子带中。

function loca = wm_type_0(loca,w,step,g)
% 此函数为嵌入过程中的子函数,用于嵌入LH子带的水印信息
% 输入:loca为LH子带;w为水印信息;step为小波系数增长步长;g为嵌入水印的阈值
% 输出:loca为嵌入水印后的LH子带

[m,n] = size(loca);
% 水印信息二值化
w = im2bw(w,graythresh(w));
w = double(w);
w(w==0) = -1;
% 水印信息扩展
w_ext = w(:);
w_ext = repmat(w_ext,m*n,1);
% 计算小波系数
[ca,ch,cv,cd] = dwt2(loca,'haar');
% 计算小波系数的绝对值
abs_ch = abs(ch);
abs_cv = abs(cv);
abs_cd = abs(cd);
% 计算小波系数的均值
avr_ch = mean(mean(abs_ch));
avr_cv = mean(mean(abs_cv));
avr_cd = mean(mean(abs_cd));
% 计算增长系数
k_ch = step*avr_ch/max(w_ext);
k_cv = step*avr_cv/max(w_ext);
k_cd = step*avr_cd/max(w_ext);
% 计算嵌入水印后的小波系数
for i = 1:m
    for j = 1:n
        if w_ext((i-1)*n+j) == 1
            if abs_ch(i,j) < g*avr_ch
                ch(i,j) = ch(i,j) + k_ch;
            end
        else
            if abs_ch(i,j) < g*avr_ch
                ch(i,j) = ch(i,j) - k_ch;
            end
        end
    end
end
loca = idwt2(ca,ch,cv,cd,'haar',[m,n]); % 小波逆变换,还原LH子带

参数说明:

  • loca:LH 子带。
  • w:水印信息。
  • step:小波系数增长步长,用于控制嵌入强度。
  • g:水印嵌入阈值,用于控制嵌入强度。

函数流程:

  1. 将水印信息 w 二值化,并扩展为与 LH 子带相同大小的矩阵。
  2. 对 LH 子带进行一层 Haar 小波分解,得到四个子带:ca、ch、cv、cd。
  3. 计算 ch、cv、cd 子带的平均绝对值。
  4. 根据水印信息和阈值,选择性地调整 ch 子带的小波系数,从而嵌入水印信息。
  5. 对 ca、ch、cv、cd 子带进行小波逆变换,得到嵌入水印后的 LH 子带。

代码示例

% 原始图像
I = imread('lena.bmp');
% 水印信息
w = imread('watermark.png');
% 嵌入阈值
g = 0.5;
% 嵌入水印
J = wm(I, w, g);
% 显示嵌入水印后的图像
imshow(J);

总结

本文介绍了使用 MATLAB 实现水印嵌入的函数 wm 和 wm_type_0,详细解释了函数功能、参数设置和代码实现细节,并提供了代码示例。这两个函数实现了基于小波变换的数字水印嵌入算法,可用于保护数字图像的版权和完整性。

注意: wm_type_1 函数的实现与 wm_type_0 函数类似,只是嵌入的目标子带为 HL 子带,具体代码实现可根据 wm_type_0 函数进行修改。


原文地址: https://www.cveoy.top/t/topic/jpxM 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录