Matlab实现空间域水印的三种叠加方式
Matlab实现空间域水印的嵌入
原理
对原图空特定区域内间域灰度值(0-255)的修改,预期将会在生成水印部分形成不同灰度值的特定形状,
可通过修改水印的灰度值验证算法的实现以及性能表现。
这里可以利用这个公式来辅助理解
Xij为原图 Wij为二值水印 T是水印且存在(使用灰度水印时可调节Wij条件)
步骤
◼ Matlab 读入待嵌入图像 , 生成水印矩阵
imread
◼ Matlab读入载体图像
◼ 依次处理每一个载体图像像素,根据相应位置
水印矩阵元素完成嵌入修改
◼ Matlab保存含水印图像imwrite
创建三个函数
1.test.m
1 input.cover='C:\KC2021\images\cover.bmp'; 2 input.message='C:\KC2021\images\watermark_s.bmp'; 3 output.cover='D:\jj.bmp'; 4 options.adapt=1; %1替换, 2加性叠加,3乘性叠加
5 Visible_S(input, output, options);
2.Visible_Embed.m
1 function mat_marked = Visible_Embed(mat_image, mat_mark, option) 2 mat_marked = mat_image; 3 switch option 4 case 1%直接替换 5 for i=1:size(mat_mark,1) 6 for j=1:size(mat_mark,2) 7 mat_marked(i,j) =mat_mark(i,j); 8 if mat_mark(i,j)>0 9 mat_marked(i,j) = mat_image(i,j); 10 end 11 end 12 end 13 case 2%加性叠加 14 for i=1:size(mat_mark,1) 15 for j=1:size(mat_mark,2) 16 mat_marked(i,j) =mat_mark(i,j); 17 if mat_mark(i,j)>0 18 mat_marked(i,j) = mat_image(i,j); 19 else 20 mat_marked(i,j) = mat_image(i,j)+30;%30为水印的参数 21 22 end 23 end 24 end 25 case 3%乘性叠加 26 for i=1:size(mat_mark,1) 27 for j=1:size(mat_mark,2) 28 mat_marked(i,j) =mat_mark(i,j); 29 if mat_mark(i,j)>0 30 mat_marked(i,j) = mat_image(i,j); 31 else 32 mat_marked(i,j) = mat_image(i,j)*(1+10);%10为水印的参数 33 end 34 end 35 end 36 otherwise 37 end 38 end
3.Visible_S.m
1 function Visible_S(input, output, options) 2 % 3 % 4 %options.adapt自适应嵌入的方式:1替换, 2加性叠加,3乘性叠加 5 6 im_c = imread(input.cover); 7 im_w = imread(input.message); 8 im_m = im_c; 9 10 if ndims(im_w)==3 %彩色图像RGB 11 im_m(:,:,1) = Visible_Embed(im_c(:,:,1),im_w(:,:,1),options.adapt); 12 im_m(:,:,2) = Visible_Embed(im_c(:,:,2),im_w(:,:,2),options.adapt); 13 im_m(:,:,3) = Visible_Embed(im_c(:,:,3),im_w(:,:,3),options.adapt); 14 else %灰度图像 15 im_m = Visible_Embed(im_c,im_w,options.adapt); 16 end 17 imwrite(im_m,output.cover); 18 end
三个函数写完

原图

水印

直接替换结果

加性叠加结果

乘性叠加结果


浙公网安备 33010602011771号