0%

使用matlab向图像添加图片水印

写数字图像处理与matlab实现实验报告时顺便写着玩的,各位不要见笑 :)

你平时都是怎么在图片上面加上自己信息的水印的?截图时在上面直接写上自己的信息?但是如果原始图片是灰度图,并且需要保留图片为灰度图就不方便了。

1
>> help add_waterMark

功能:

使用 matlab 向图像添加图片水印(显式水印)。

优点:

不会改变原始图像的类型(Gray or RGB)。

也就是一般我们在图片上添加文本,都会将灰度图变成 RGB 图。

函数名:

add_waterMark(挺土的)

1
add_waterMark(img, max, opacity, path)

参数:

  • img是图像数据。
  • max是水印图片长宽均不超过原始图片的长宽✖️ max,如果超过,水印就会缩小。
    • max范围:[0, 1]​
  • opacity设置水印的透明度。
    • opacity 范围:[0,1]​
  • 最后一个参数是水印图片的路径加文件名。

返回值:

返回一个加上水印后的图片。

使用方法:

使用方法如下:

1
2
img2 = imread('face.jpg');
imshow(add_waterMark(img2, 0.8, 0.8, 'water_mark.png'));

face.jpg 下载

add_waterMark.m 下载

water_mark.png 下载

具体功能看代码就行了。
随便找几个图片就可以实验。

代码如下:

只需要将这个脚本函数放在当前目录下就可以直接使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
function[newimg] = add_waterMark(img, ma, opacity, path)
dimensionality = ndims(img);
% 彩色图
if isequal(dimensionality, 3)
waterMark = imread(path);
[x_water, y_water, ~] = size(waterMark);
[x, y, ~] = size(img);
% 根据原始图片和水印图片的比例调整水印图片的大小
scale = max(ceil(x_water / (x * ma)), ceil(y_water / (y * ma)));
newimg = img;
waterMark = waterMark(1:scale:end, 1:scale:end, :);
[x_water, y_water, z_water] = size(waterMark);
% 添加水印
for k = (1 : z_water)
for i = (1 : x_water)
for j = (1 : y_water)
cur = newimg(x - x_water + i, y - y_water + j, k) * (1 - opacity) + waterMark(i, j, k) * opacity;
newimg(x - x_water + i, y - y_water + j, k) = cur;
end
end
end
% imshow(newimg)
% 灰度图
else
waterMark = imread(path);
dimensionality = ndims(waterMark);
if isequal(dimensionality, 3)
waterMark = rgb2gray(waterMark);
end

[x_water, y_water] = size(waterMark);
[x, y] = size(img);
% 根据原始图片和水印图片的比例调整水印图片的大小
scale = max(ceil(x_water / (x * ma)), ceil(y_water / (y * ma)));
newimg = img;
waterMark = waterMark(1:scale:end, 1:scale:end);
[x_water, y_water] = size(waterMark);

% 添加水印
for i = (1 : x_water)
for j = (1 : y_water)
cur = newimg(x - x_water + i, y - y_water + j) * (1 - opacity) + waterMark(i, j) * opacity;
newimg(x - x_water + i, y - y_water + j) = cur;
end
end
% imshow(newimg);
end

如发现 bug 欢迎指出。

如果对您有帮助,请我喝杯奶茶?