水印嵌入算法:基于小波变换的图像水印嵌入方法

该代码实现了一种基于小波变换的图像水印嵌入算法。算法通过比较两个子带的平均值来选择嵌入子带,并根据水印信息对子带系数进行调整,实现水印的嵌入。

算法流程:

  1. 图像预处理: 读取原始图像并进行灰度化处理。
  2. 小波分解: 对图像进行一层小波分解,得到四个子带:LL、LH、HL、HH。
  3. 子带选择: 计算LH和HL两个子带的平均值,选择平均值较小的子带作为嵌入子带。
  4. 水印嵌入: 根据水印信息对选定的子带进行系数调整,实现水印信息的嵌入。
  5. 小波重构: 使用逆小波变换将修改后的子带与其他子带组合,重构出包含水印信息的图像。

代码实现:

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;
for i = 1:m0
    for j = 1:n0
        avr_LH = avr_LH + LH(i,j);
    end
end
avr_LH = avr_LH/(m0*n0);
%=======计算avr_HL======
[m1,n1] = size(HL); avr_HL = 0;
for i = 1:m1
    for j = 1:n1
        avr_HL = avr_HL + HL(i,j);
    end
end
avr_HL = avr_HL/(m1*n1);
%判断嵌入的子带
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]);   %小波逆变换,还回原始图像
end

function loca = wm_type_0(loca,w,step,g)
%此函数用于在LH子带嵌入水印
%输入: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   %如果满足条件,a12增,a11减
                    a12 = a12 + s;
                    a11 = a11 - s;
                else
                    break;     %不满足条件,跳出此循环
                end
            end
            %-----如果a11和a21不满足条件,则也要调整------------
            if a11-a21>g
                a11 = a11 - s;
                a21 = a21 + s;
            end
            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
        if 1 == w(index)
            for s = step:step:100*step
                if a12-a22<-g   %如果满足条件,a12减,a11增
                    a12 = a12 - s;
                    a11 = a11 + s;
                else
                    break;     %不满足条件,跳出此循环
                end
            end
            %-----如果a11和a21不满足条件,则也要调整------------
            if a11-a21>g
                a11 = a11 - s;
                a21 = a21 + s;
            end
            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
        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

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 a21-a11<=g   %如果满足条件,a21增,a22减
                    a21 = a21 + s;
                    a22 = a22 - s;
                else
                    break;     %不满足条件,跳出此循环
                end
            end
            %-----如果a12和a22不满足条件,则也要调整------------
            if a12-a22>g
                a12 = a12 + s;
                a22 = a22 - s;
            end
            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
        if 1 == w(index)
            for s = step:step:100*step
                if a21-a11<-g   %如果满足条件,a21减,a22增
                    a21 = a21 - s;
                    a22 = a22 + s;
                else
                    break;     %不满足条件,跳出此循环
                end
            end
            %-----如果a12和a22不满足条件,则也要调整------------
            if a12-a22>g
                a12 = a12 + s;
                a22 = a22 - s;
            end
            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
        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

使用方法:

  1. 将代码保存为.m文件。
  2. 将原始图像文件、水印信息(二进制矩阵)和水印嵌入阈值作为输入参数,调用 wm 函数。
  3. 函数返回嵌入水印信息的图像。

注意事项:

  • 水印信息应该是一个二进制矩阵。
  • 水印嵌入阈值需要根据图像和水印信息进行调整,过小的阈值可能会导致水印信息丢失,过大的阈值可能会导致图像失真。
  • 此算法仅实现了水印嵌入功能,还需要配合水印提取算法才能完整实现水印系统。

未来改进方向:

  • 探索其他水印嵌入策略,例如基于奇异值分解 (SVD) 的水印嵌入方法。
  • 研究水印嵌入的鲁棒性,提高水印信息在各种攻击下的抵抗能力。
  • 开发更高效的水印嵌入算法,减少计算时间和资源消耗。

总结:

本代码实现了一个基于小波变换的图像水印嵌入算法,该算法简单易懂,易于实现。算法可以有效地将水印信息嵌入到图像中,并提供了一定的鲁棒性。

水印嵌入算法:基于小波变换的图像水印嵌入方法

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

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