脆弱水印算法实现:基于小波变换的嵌入过程
该代码不完整,需要补充两个子函数wm_type_0和wm_type_1的代码。
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子函数:
function loca = wm_type_0(loca,w,step,g)
%此函数为嵌入子函数,用于LH子带嵌入水印
%输入:loca为LH子带;w为水印信息;step为小波系数增长步长;g为水印嵌入的阈值
%输出:loca为嵌入水印后的LH子带
%%
[mm,nn] = size(loca);
N = mm * nn;
w = double(w(:));
w = [w;zeros(N-length(w),1)];
w = w - mean(w);
w = w / norm(w);
%%
%计算小波系数增长率
for k = 1:10
[C,S] = wavedec2(loca,k,'haar');
[H1,V1,D1] = detcoef2('all',C,S,k);
A1 = appcoef2(C,S,'haar',k);
avr_H1 = mean(abs(H1(:)));
avr_V1 = mean(abs(V1(:)));
avr_D1 = mean(abs(D1(:)));
avr_A1 = mean(abs(A1(:)));
inc_rate(k) = max([avr_H1,avr_V1,avr_D1,avr_A1]) / min([avr_H1,avr_V1,avr_D1,avr_A1]);
end
inc_rate = inc_rate(2:end);
%%
%选取小波系数增长率最小的层数
[~,idx] = min(inc_rate);
[C,S] = wavedec2(loca,idx+1,'haar');
[H1,V1,D1] = detcoef2('all',C,S,idx+1);
A1 = appcoef2(C,S,'haar',idx+1);
%%
%计算小波系数增长率最小的层的小波系数
H1 = H1(:); V1 = V1(:); D1 = D1(:); A1 = A1(:);
H1 = H1 - mean(H1); H1 = H1 / norm(H1);
V1 = V1 - mean(V1); V1 = V1 / norm(V1);
D1 = D1 - mean(D1); D1 = D1 / norm(D1);
A1 = A1 - mean(A1); A1 = A1 / norm(A1);
%%
%计算嵌入系数
for k = 1:N
if abs(H1(k)) > g && w(k) > 0
H1(k) = H1(k) + step;
elseif abs(H1(k)) > g && w(k) < 0
H1(k) = H1(k) - step;
end
if abs(V1(k)) > g && w(k) > 0
V1(k) = V1(k) + step;
elseif abs(V1(k)) > g && w(k) < 0
V1(k) = V1(k) - step;
end
if abs(D1(k)) > g && w(k) > 0
D1(k) = D1(k) + step;
elseif abs(D1(k)) > g && w(k) < 0
D1(k) = D1(k) - step;
end
if abs(A1(k)) > g && w(k) > 0
A1(k) = A1(k) + step;
elseif abs(A1(k)) > g && w(k) < 0
A1(k) = A1(k) - step;
end
end
%%
%重构小波系数
C = [A1;H1;V1;D1];
loca = waverec2(C,S,'haar');
loca = loca(1:mm,1:nn);
wm_type_1子函数:
function loca = wm_type_1(loca,w,step,g)
%此函数为嵌入子函数,用于HL子带嵌入水印
%输入:loca为HL子带;w为水印信息;step为小波系数增长步长;g为水印嵌入的阈值
%输出:loca为嵌入水印后的HL子带
%%
[mm,nn] = size(loca);
N = mm * nn;
w = double(w(:));
w = [w;zeros(N-length(w),1)];
w = w - mean(w);
w = w / norm(w);
%%
%计算小波系数增长率
for k = 1:10
[C,S] = wavedec2(loca,k,'haar');
[H1,V1,D1] = detcoef2('all',C,S,k);
A1 = appcoef2(C,S,'haar',k);
avr_H1 = mean(abs(H1(:)));
avr_V1 = mean(abs(V1(:)));
avr_D1 = mean(abs(D1(:)));
avr_A1 = mean(abs(A1(:)));
inc_rate(k) = max([avr_H1,avr_V1,avr_D1,avr_A1]) / min([avr_H1,avr_V1,avr_D1,avr_A1]);
end
inc_rate = inc_rate(2:end);
%%
%选取小波系数增长率最小的层数
[~,idx] = min(inc_rate);
[C,S] = wavedec2(loca,idx+1,'haar');
[H1,V1,D1] = detcoef2('all',C,S,idx+1);
A1 = appcoef2(C,S,'haar',idx+1);
%%
%计算小波系数增长率最小的层的小波系数
H1 = H1(:); V1 = V1(:); D1 = D1(:); A1 = A1(:);
H1 = H1 - mean(H1); H1 = H1 / norm(H1);
V1 = V1 - mean(V1); V1 = V1 / norm(V1);
D1 = D1 - mean(D1); D1 = D1 / norm(D1);
A1 = A1 - mean(A1); A1 = A1 / norm(A1);
%%
%计算嵌入系数
for k = 1:N
if abs(H1(k)) > g && w(k) > 0
H1(k) = H1(k) + step;
elseif abs(H1(k)) > g && w(k) < 0
H1(k) = H1(k) - step;
end
if abs(V1(k)) > g && w(k) > 0
V1(k) = V1(k) + step;
elseif abs(V1(k)) > g && w(k) < 0
V1(k) = V1(k) - step;
end
if abs(D1(k)) > g && w(k) > 0
D1(k) = D1(k) + step;
elseif abs(D1(k)) > g && w(k) < 0
D1(k) = D1(k) - step;
end
if abs(A1(k)) > g && w(k) > 0
A1(k) = A1(k) + step;
elseif abs(A1(k)) > g && w(k) < 0
A1(k) = A1(k) - step;
end
end
%%
%重构小波系数
C = [A1;H1;V1;D1];
loca = waverec2(C,S,'haar');
loca = loca(1:mm,1:nn);
原文地址: https://www.cveoy.top/t/topic/jpP8 著作权归作者所有。请勿转载和采集!