1.水印嵌入
水印嵌入使用的算法
a)分解级数:根据人类视觉系统的照明和纹理掩蔽特性,将水印嵌入到图像的纹理和边缘不易被察觉,但对于图像滤波和有损压缩容易丢失细节信息。小波变换低频部分集中了图像大部分能量,是视觉的重要部分,从鲁棒性出发,水印应当嵌入视觉最重要部分,但在这部分嵌入容易引起图像失真,我们这次进行二级haar小波分解并选取了HL2部分进行嵌入,效果尚可。
b)小波基:不同小波基的水印鲁棒性不同。小波分正交和双正交两类,都适用于水印算法。研究表明,正交小波基的正则性、消失矩阶数、支撑长度以及小波图像能量在低频带的集中程度对水印鲁棒性影响极小。Haar小波的支撑长度最短,分解和重构计算复杂度低于其他小波,边界不需要延拓,在水印算法中体现出了优良的性能,因此选择了Haar小波基。
具体过程如下:
第一步:将原始图像和水印信息读入。
第二步:将原始彩色图像转换为灰度图,用 Haar 小波基进行二级小波分解。
第三步:将数字水印同样转换为灰度图,对其进行一级小波分解。
第四步:在HL2嵌入水印
第五步:重构并显示嵌入水印后的图像。
水印原始图像
运行结果:
2.水印提取
水印提取程序为嵌入的逆过程,运用了离散小波逆变换(IDWT)。
clear all;
I=imread('lena.jpg');
Ig=rgb2gray(I);
W=imread('watermask.png');
[cA1, cH1, cV1, cD1] = dwt2(Ig, 'haar');%依次为低频水平垂直对角
[cA2, cH2, cV2, cD2] = dwt2(cA1, 'haar');%二级小波分解
imgsize=size(cA2);
W=double(imresize(W,imgsize));
w_cH2=imsubtract(cH2,W);%对HL2嵌入水印
c1=[cA1, cH1;cV1, cD1]; %一级分解后图像
c2=[cA2, cH2; cV2, cD2];
c=[c2,cH1;cV1, cD1]; %二级分解后图像
c2_w=[cA2, w_cH2; cV2, cD2];
c_w=[c2_w,cH1;cV1, cD1]; %嵌入水印后二级分解图像
i_c2_w=idwt2(cA2, w_cH2, cV2, cD2,'haar');%重建图像
img_w=idwt2(i_c2_w, cH1,cV1, cD1,'haar');
%水印提取
[wcA1, wcH1, wcV1, wcD1] = dwt2(img_w, 'haar');%依次为低频水平垂直对角
[wcA2, wcH2, wcV2, wcD2] = dwt2(wcA1, 'haar');%二级小波分解
mask_w=imsubtract(cH2,wcH2);
subplot(1,2,1);imshow(I,[]);title('原图')
subplot(1,2,2);imshow(c1,[]);title('原图一级小波分解')
figure
subplot(1,3,1);imshow(w_cH2,[]);title('在HL2加入水印后-HL2')
subplot(1,3,2);imshow(c_w,[]);title('在HL2加入水印后-分解图')
subplot(1,3,3);imshow(img_w,[]);title('加入水印后重建图像')
figure
imshow(mask_w,[]);title('提取出的数字水印');
多有不足,恳请指教。
参考:https://blog.csdn.net/Threexiu/article/details/119619765https://blog.csdn.net/weixin_39707121/article/details/7940707