水印嵌入函数:wm(I, w, g) - 基于小波变换的图像水印嵌入算法
水印嵌入函数:wm(I, w, g)
该函数实现基于小波变换的图像水印嵌入算法,将水印信息嵌入到图像的特定子带中。
输入:
- I:原始图像
- w:水印信息(二进制数组)
- g:水印嵌入的阈值
输出:
- J:嵌入水印后的图像
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]); %小波逆变换,还回原始图像
wm_type_0 子函数
该子函数用于在 LH 子带嵌入水印。
function loca = wm_type_0(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 a11-a12<=g %如果满足条件,a11增,a21减
a11 = a11 + s;
a12 = a12 - s;
else
break; %不满足条件,跳出此循环
end
end
%-----如果a21和a22不满足条件,则也要调整------------
end
if 1 == w(index)
for s = step:step:100*step
if a11-a12>=-g %如果满足条件,a11增,a21减
a11 = a11 - s;
a12 = a12 + s;
else
break; %不满足条件,跳出此循环
end
end
%-----如果a21和a22不满足条件,则也要调整------------
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
wm_type_1 子函数
该子函数用于在 HL 子带嵌入水印。
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不满足条件,则也要调整------------
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不满足条件,则也要调整------------
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
注意:
- 该代码示例使用 MATLAB 语言编写,需要安装 MATLAB 软件才能运行。
- 水印嵌入的具体方法和参数设置可以根据实际需求进行调整。
- 该算法仅实现了水印嵌入过程,还需要相应的提取算法才能从嵌入水印的图像中提取出水印信息。
原文地址: https://www.cveoy.top/t/topic/jpQI 著作权归作者所有。请勿转载和采集!