基于小波变换的数字水印提取算法 (MATLAB)

这篇博客介绍一种基于小波变换的数字水印提取算法,并提供完整的 MATLAB 代码。

wm_extr 函数

该函数是水印提取的主函数,它接收嵌入了水印的图像作为输入,并返回提取的水印。

function rw = wm_extr(J)
% 此函数为提取过程
% 输入:J为水印嵌入的图像;
% 输出:rw为提取的水印

%%
% 一层小波分解
[LL,LH,HL,HH] = dwt2(J,'haar');
%=======计算avr_LH======
[m,n] = size(LH); avr_LH = 0;
for i = 1:m
    for j = 1:n
        avr_LH = avr_LH + LH(i,j);
    end
end
avr_LH = avr_LH / (m*n);

%=======计算avr_HL======
[m0,n0] = size(HL); avr_HL = 0;
for i = 1:m0
    for j = 1:n0
        avr_HL = avr_HL + HL(i,j);
    end
end
avr_HL = avr_HL / (m0*n0);

%判断嵌入的子带
if avr_LH <= avr_HL
    num = 0; loca = LH;
else
    num = 1; loca = HL;
end
%%
%提取水印
if num == 0
    rw = wm_extr_type1(loca);  %写出提取子函数
else
    rw = wm_extr_type0(loca);  %写出提取子函数
end

end

wm_extr_type0 函数

该函数从指定的子带中提取水印信息。

function rw = wm_extr_type0(loca)

[mm,nn] = size(loca);
index = 1;
%取出2*2的块
for k = 1:2:mm-1
    for kk = 1:2:nn-1
        tem = loca(k:k+1,kk:kk+1);
        a11 = tem(1,1);
        a12 = tem(1,2);
        a21 = tem(2,1);
        a22 = tem(2,2);
        %-------a11+a21 >= a12+a22则水印为0,否则为1-------
        if a11 + a21 >= a12 + a22
            rw(index) = 0;
        else
            rw(index) = 1;
        end
        index = index + 1;
    end
end
 
end

wm_extr_type1 函数

该函数与 wm_extr_type0 函数类似,也用于从指定的子带中提取水印信息,但使用了不同的提取规则。

function rw = wm_extr_type1(loca)

[mm,nn] = size(loca);
index = 1;
%取出2*2的块
for k = 1:2:mm-1
    for kk = 1:2:nn-1
        tem = loca(k:k+1,kk:kk+1);
        a11 = tem(1,1);
        a12 = tem(1,2);
        a21 = tem(2,1);
        a22 = tem(2,2);
        %------- 此处根据实际嵌入算法修改提取规则-------
        if a11 + a22 >= a12 + a21
            rw(index) = 0;
        else
            rw(index) = 1;
        end
        index = index + 1;
    end
end
end

注意: 你需要根据你的水印嵌入算法来修改 wm_extr_type1 函数中的提取规则。


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

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