✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab仿真内容点击👇
⛄ 内容介绍
鲁棒性与不可见性是数字水印的主要衡量标准,这两者相互制约,传统的数字水印算法很难将二者平衡,提出一种强鲁棒性的图像水印优化嵌入方案,基本思想是先将水印图像经过奇异值分解得到水印序列,采用遗传算法优化水印的嵌入位置,综合优化水印的鲁棒性和不可见性.水印嵌入是自适应的过程,且实现了盲提取.实验表明,该方案在水印遭受各种攻击时,能更好的恢复出清晰地水印图像,具有更强的鲁棒性和不可见性等优点.
⛄ 部分代码
function [Wimg]= SVD_Watermarked(orig_img, wat_img, step_size)
%output
% - wimg : watermarked image
%Input
% - orig_image : original image without watermarking
% - wat_img : watermark image
% - step_size : The interval value
[M,N] = size(orig_img);
orig_img = double(orig_img);
ind=(M*N)/64;
dlarge = zeros(ind,1); % create array of size ind;
block = zeros(8,8,ind); % create and initialize block
index=0;
%将原始图像进行8*8分块?每一块进行SVD变换
for i = 1:8:M;
for j = 1:8:N;
index=index+1;
block(:,:,index) = orig_img(i:i+7,j:j+7); % make three dimensional array制作三维数组
[Uimg,Simg,Vimg] = svd(block(:,:,index));
dlarge(index)=Simg(1,1); % store the the large value of S
end
end
%max = max(dlarge);
max = dlarge(1); % Find the maximum value from dlarge array从dlarge数组中找到最大值
for jj = 2:numel(dlarge)
if max < dlarge(jj)
max = dlarge(jj);
end
end
%min = min(dlarge);
min = dlarge(1); % find the minimum value from dlarge array
for jj = 2:numel(dlarge)
if min > dlarge(jj)
min = dlarge(jj);
end
end
interval_table = min-step_size : step_size : max+step_size; % construct the table
[row col]=size(interval_table);
for i=1:index
for j=1:col-1
if ((dlarge(i)> interval_table(j)) && (dlarge(i) < interval_table(j+1)));
if(wat_img(i)==1); % 根据水印图像修改dlarge值
dlarge(i)= (interval_table(j)+(interval_table(j)+interval_table(j+1))/2.)/2.;
else
dlarge(i)= (interval_table(j+1)+(interval_table(j)+interval_table(j+1))/2.)/2.;
end
end
end
end
index=0;
Wimg = zeros(8,8,ind); % create and initialize Wimg
for i = 1:8:M;
for j = 1:8:N;
index=index+1;
block(:,:,index) = orig_img(i:i+7,j:j+7);
[Uimg,Simg,Vimg] = svd(block(:,:,index));
Simg(1,1)= dlarge(index); %put the large value based on watermarked image
Wimg(:,:,index)=Uimg*Simg*Vimg'; %inverse the SVD
end
end
%Wimg is three dimensional matrix we have to change to two dimensional
%Wimg是一个三维的矩阵,我们必须把它变成二维的
%matrix
nrow = M/8;
ncol = N/8;
D = zeros(8,8,ind); % create and initialize D
final = zeros(8,8,ind); %create and initialize D
index=0;
for row=1:nrow
index=index+1;
D=Wimg(:,:,index);
for col=2:ncol
index=index+1;
D=horzcat(D,Wimg(:,:,index));
% fprintf('row= %d col= %d',row,col);
end
if(row==1)
final=D;
else
final=vertcat(final,D);
end
end
Wimg = uint8(final);
⛄ 运行结果
⛄ 参考文献
[1] 晁妍, 王慧玲, 刘淑影. 基于遗传算法和SVD-DWT的图像水印优化嵌入方案[J]. 韶关学院学报, 2018, 39(6):5.
[2] 鱼滨. 基于MATLAB和遗传算法的图像处理[M]. 西安电子科技大学出版社, 2015.
[3] 张敏辉, 赖麟, 孙连海. 基于遗传算法的研究与Matlab代码的实现[J]. 四川教育学院学报, 2012.
[4] 魏志成, 戴居丰, 李昊. 基于遗传算法的图像数字水印[J]. 计算机工程, 2007, 33(17):146-148.
[5] 史宝明, 李恒杰, 贺元香,等. 基于微遗传算法与SVD的鲁棒性数字水印技术研究[J]. 甘肃联合大学学报(自然科学版), 2014(006):028.
⛳️ 代码获取关注我
❤️部分理论引用网络文献,若有侵权联系博主删除
❤️ 关注我领取海量matlab电子书和数学建模资料