实验目的
使用matlab实现对图像的条纹水印添加,具体效果如下图,分别是原图和水印图:
对于条纹水印,其水印的强度、方向和间距都可调整。
具体实现
第一步 读入图片、预处理
把lenna.jpg添加到工作目录,读入图片并转到色彩空间(YCbCr),水印在亮度成分(Y)上叠加。
%读入图片并预处理
img = im2double(imread('lenna.jpg'));
%转到色彩空间
ycbcrImg = rgb2ycbcr(img);
%提取亮度成分
yImg = ycbcrImg(:,:,1);
第二步 生成水印矩阵
实现条纹水印的原理是在图像上叠加二维正弦函数:
式中,决定了条纹间距,决定了条纹方向。下面代码中设置为,为45度。
%初始化水印矩阵
[m,n] = size(yImg);
embedImg = zeros(m,n);
%设置参数
angle = 45;
a=cos(angle*pi/180);
b=sin(angle*pi/180);
w=pi/2;
%生成水印矩阵
for i = 1:m
for j = 1:n
embedImg(i,j) = sin(w*(a*i+b*j));
end
end
第三步 添加水印
最后将水印矩阵以一定比例与原图亮度成分叠加,得到添加水印后的图片。
%添加水印
I = 1/20;
yImg = yImg + I*embedImg;
%覆盖原图亮度成分
ycbcrImg(:,:,1) = yImg;
%转到rgb空间并保存
rgbImg = ycbcr2rgb(ycbcrImg);
imwrite(rgbImg,'watermark.jpg');
上面代码中,可以调节水印强度,越小,水印强度越弱。
结语
本文使用matlab实现了图像的条纹水印添加,可调参数有水印的强度、方向和间距,因此可写成matlab函数的形式(本文不写更多)。下面是设置为135度时的图像。
完整代码
clc
clear all;
%读入图片并预处理
img = im2double(imread('lenna.jpg'));
ycbcrImg = rgb2ycbcr(img);
yImg = ycbcrImg(:,:,1);
%生成水印矩阵
[m,n] = size(yImg);
embedImg = zeros(m,n);
angle = 135;
a=cos(angle*pi/180);
b=sin(angle*pi/180);
w=pi/2;
for i = 1:m
for j = 1:n
embedImg(i,j) = sin(w*(a*i+b*j));
end
end
%添加水印
I = 1/20;
yImg = yImg + I*embedImg;
ycbcrImg(:,:,1) = yImg;
rgbImg = ycbcr2rgb(ycbcrImg);
imwrite(rgbImg,'watermark.jpg');