图片水印技术在现代计算机技术中具有越来越重要的作用,今天,我就给大家简单介绍图片水印技术的原理。
认识像素的同学都知道,无论是彩色图片还是灰度图,都是由0-255之间的数字矩阵组成。当然,彩色图片是三维矩阵,由三个颜色通道组成。灰度图是二维矩阵。
下面的两个图中,上面的一个是将要加水印的图像,下面的就是要加的水印。
首先,水印的原理就是将水印上的像素点乘一个参数。然后与原有的图像做加法运算。得到的新图就是加上水印以后的图。由于这个参数非常小,凭借肉眼是无法分辨图像水印前后的区别的。
例如:
原图像A=[145,132,134;121,24,112;123,234,123]。要加的水印B=[134,123,145;123,121,112;124,234,236]。水印参数为Alpha=0.02。那么结果就是A1=A+B*Alpha。如果k值太大了。最终图片会与水印以前的图片有很大差距。下面给大家展示一下Alpha值过大的后果
我选取的Alpha=0.5。正常的k应该选择0.01或者0.02。
Matlab如何实现水印:
最简单的读取水印图片。大家记住这些变量的名称就好了。之后会用到
clear;clc
size=512;
block=8;
blockno=size/block;
LENGTH=size*size/64;
Alpha1=0.5; Alpha2=0.4;
T1=100;
I=zeros(size,size);
D=zeros(size,size);
BW=zeros(size,size);
block_dct1=zeros(block,block);
i=imread('watermark64by64.png');
mark=reshape(i,1,LENGTH);
figure;imshow(i);title('水印');
%subplot(3,2,1);plot(mark);title('水印');
%显示原图
figure;I=imread('lena512512.jpg');
I0=I;
imshow(I);title('原始图像');
接下来,我们会看到水印的核心代码。也就是嵌入水印的过程。不多说了。先看代码:
k=1;
for m=1:blockno
for n=1:blockno
x=(m-1)*block+1; y=(n-1)*block+1;
block_dct1=I(x:x+block-1,y:y+block-1);
block_dct1=dct2(block_dct1);
BW_8_8=BW(x:x+block-1,y:y+block-1);
block_dct1(1,1)=block_dct1(1,1)*(1+Alpha*mark(k));
block_dct1=idct2(block_dct1);
D(x:x+block-1,y:y+block-1)=block_dct1;
k=k+1;
end
由于图像的面积远远大于水印的面积,所以我们不得不做一些分块处理的操作。用两层for 循环可以嵌入水印。
完整代码以及图片:请回复“水印”
参考文献来源:https://993878382.qzone.qq.com/?_t_=0.37524410726698343
代码来源:http://993878382.qzone.qq.com -browser