基于HL子带的数字水印嵌入算法 (MATLAB实现)

本代码实现了一种基于HL子带的数字水印嵌入算法。该算法将水印信息嵌入到图像的HL子带中,通过修改2x2像素块的系数关系来实现水印的嵌入。

函数代码

function loca = wm_type_1(loca,w,step,g)
% 此函数用于在HL子带嵌入水印
% 输入:loca为要嵌入水印的子带
% 输出:loca为嵌入水印后的子带

[m2,n2] = size(loca);
index = 1;
% 取出2*2的块
for k = 1:2:m2-1
    for kk = 1:2:n2-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 0 == w(index)            
            for s = step:step:100*step
                if a12-a22<=g   % 如果满足条件,a22增,a12减
                    a12 = a12 - s;
                    a22 = a22 + s;
                else
                    break;     % 不满足条件,跳出此循环
                end
            end
            % -----如果a11和a21不满足条件,则也要调整------------
            if a11-a21<=g
                a11 = a11 + (a21-a11)/2;
                a21 = a21 - (a21-a11)/2;
            end
            if a21-a11<=g
                a21 = a21 + (a11-a21)/2;
                a11 = a11 - (a11-a21)/2;
            end
            if a12-a22<=g
                a12 = a12 - (a22-a12)/2;
                a22 = a22 + (a22-a12)/2;
            end
            if a22-a12<=g
                a22 = a22 - (a12-a22)/2;
                a12 = a12 + (a12-a22)/2;
            end
            % ------------------------------------------------------
        end
        if 1 == w(index)            
            for s = step:step:100*step
                if a12-a22>=-g   % 如果满足条件,a22增,a12减
                    a12 = a12 + s;
                    a22 = a22 - s;
                else
                    break;     % 不满足条件,跳出此循环
                end
            end
             % -----如果a11和a21不满足条件,则也要调整------------
            if a11-a21<=g
                a11 = a11 + (a21-a11)/2;
                a21 = a21 - (a21-a11)/2;
            end
            if a21-a11<=g
                a21 = a21 + (a11-a21)/2;
                a11 = a11 - (a11-a21)/2;
            end
            if a12-a22<=g
                a12 = a12 - (a22-a12)/2;
                a22 = a22 + (a22-a12)/2;
            end
            if a22-a12<=g
                a22 = a22 - (a12-a22)/2;
                a12 = a12 + (a12-a22)/2;
            end
            % ------------------------------------------------------
        end
        index = index + 1;        
        tem(1,1) = a11;
        tem(1,2) = a12;
        tem(2,1) = a21;
        tem(2,2) = a22;
        loca(k:k+1,kk:kk+1) = tem;        
    end    
end
end

参数说明

  • loca: 要嵌入水印的HL子带
  • w: 水印信息,为0或1的向量
  • step: 嵌入强度调节步长
  • g: 嵌入阈值

算法说明

该算法首先将HL子带划分为2x2的像素块,然后根据水印信息对每个像素块进行修改。如果水印位为0,则调整像素块的系数关系,使得a12-a22<=g;如果水印位为1,则调整像素块的系数关系,使得a12-a22>=-g。

优点

  • 隐蔽性好,嵌入水印后的图像质量损失小
  • 鲁棒性强,对常见的图像处理操作(如JPEG压缩、噪声干扰等)具有较强的抵抗能力

总结

本代码提供了一种基于HL子带的数字水印嵌入算法的MATLAB实现,可供相关研究人员参考使用。


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

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