实验目的
使用matlab实现对图像的条纹水印添加,具体效果如下图,分别是原图和水印图:
对于条纹水印,其水印的强度、方向和间距都可调整。
具体实现
第一步 读入图片、预处理
把lenna.jpg添加到工作目录,读入图片并转到色彩空间(YCbCr),水印在亮度成分(Y)上叠加。
%读入图片并预处理
img = im2double(imread('lenna.jpg'));
%转到色彩空间
ycbcrImg = rgb2ycbcr(img);
%提取亮度成分
yImg = ycbcrImg(:,:,1);
第二步 生成水印矩阵
实现条纹水印的原理是在图像上叠加二维正弦函数:
e
m
b
e
d
I
m
g
=
s
i
n
(
w
(
a
x
+
b
y
)
)
,
a
=
s
i
n
(
α
)
,
b
=
c
o
s
(
α
)
embedImg = sin(w(ax+by)),a=sin(\alpha),b=cos(\alpha)
embedImg=sin(w(ax+by)),a=sin(α),b=cos(α)
式中,
w
w
w决定了条纹间距,
α
\alpha
α决定了条纹方向。下面代码中设置
w
w
w为
π
/
2
\pi/2
π/2,
α
\alpha
α为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');
上面代码中, I I I可以调节水印强度, I I I越小,水印强度越弱。
结语
本文使用matlab实现了图像的条纹水印添加,可调参数有水印的强度、方向和间距,因此可写成matlab函数的形式(本文不写更多)。下面是设置
α
\alpha
α为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');