天天看點

dwt嵌入水印與提取水印

% 讀入載體圖像檔案
file_name='1.bmp';
f=imread(file_name);
subplot(221);
imshow(f)
title('原圖');
f=double(f);
% 讀入載體檔案的大小
Mc=size(f,1); %高度
Nc=size(f,2); %寬度
% 讀入數字水印圖像檔案
file_name='2.bmp';
m=imread(file_name);
subplot(222);
imshow(m)
title('原水印');

m=double(m);
Mm=size(m,1); %水印圖像的高度
Nm=size(m,2); %水印圖像的寬度
%将水印圖像轉換為二值圖像
m1=double(m);
m=fix(m1./12);
m=uint8(m);
%一層haar小波變換
[A1,H1,V1,D1] = dwt2(f,'haar');
[r1,c1]=size(A1);
r2=r1/2;
c2=c1/2;
% 嵌入水印
for i= 1:r1
for j= 1:c1
   w(i,j)=m(mod(i,Mm)+1,mod(j,Nm)+1);
end
end
for i=1:r2
for j=1:c2
   if w(i,j)==1
     if H1(i,(2*j-1))<H1(i,2*j)
      temp=H1(i,(2*j-1));
      H1(i,(2*j-1))=H1(i,2*j);
      H1(i,2*j)=temp;
     end
     if H1(i,(2*j-1))==H1(i,2*j)
      H1(i,(2*j))=H1(i,(2*j))-0.0001;
     end
   end
   if w(i,j)==0
    if H1(i,(2*j-1))>H1(i,2*j)
    temp=H1(i,2*j-1);
    H1(i,(2*j-1))=H1(i,2*j);
    H1(i,2*j)=temp;
    end
    if H1(i,(2*j-1))==H1(i,2*j)
    H1(i,(2*j))=H1(i,(2*j))+0.0001;
    end
   end
end
end
% 實作小波的反變換
f=idwt2(A1,H1,V1,D1,'haar',[Mc,Nc]);
subplot(223)
imshow(uint8(f));
title('嵌入水印後的圖');

% 讀取該圖像的高度和寬度
Mw=size(f,1); %高度
Nw=size(f,2); %寬度
%一層harr小波變換
[A1,H1,V1,D1] = dwt2(f,'haar');


[r1,c1] = size(A1);
r2=r1/2;
c2=c1/2;
%提取水印
for i=1:r2
     for j=1:c2
         if H1(i,2*j-1)>=H1(i,2*j)
             k(i,j)=1;
         else
             k(i,j)=0;
         end
     end
end
subplot(224)
imshow(k);
title('提取的水印')      

效果:

dwt嵌入水印與提取水印

原理:嵌入算法

首先将256×256分辨率的256級載體灰階圖像進行一層小波變換,如下:

[A1,H1,V1,D1] = dwt2(f,‘haar’)得到A1,H1,V1,D1這樣四個128×128大小的矩陣。其中f是256×256大小的矩陣,儲存着分辨率為256×256、灰階級别為256的載體灰階圖像,A1、H1、V1、D1分别是lena圖像的低頻逼近子圖、水準方向細節子圖、垂直方向細節子圖、對角線方向的高頻細節子圖。接着,讀入水印圖像,将水印圖像轉換為二值圖像,要求水印圖像的大小為載體圖像的八分之一。将水印圖像的資訊存入一個二維數組中。

最後,嵌入水印。如果将水印嵌入低頻系數A1中,水印的魯棒性好,但水印的隐蔽性差;如果将水印嵌入高頻系數D1中,水印的隐蔽性好,但水印的魯棒性差。同時考慮到水印的魯棒性和隐蔽性,将這兩種方案折中一下,本算法将水印嵌入到小波變換的水準方向細節的中頻系數H1中。H1是一個二維數組,将H1的資料分為像素對,比較每對像素值的大小,前者大于後者表示1,前者小于後者表示0,若二者相等,則将其中一個的值做微小調整,使得每一像素對的大小關系和水印二值圖像的每一位相對應。對不能對應的像素對,将像素對前後的位置互換。

水印提取算法

首先讀入帶有水印的載體圖像,将該圖像進行一層小波分解:

[A1,H1,V1,D1]=dwt2(f,‘haar’)

其中f是256×256大小的矩陣,儲存着分辨率為256×256、灰階級别為256的嵌入了水印圖像的載體灰階圖像。

接着,從H1中提取水印,提取水印是嵌入水印的逆過程,将H1分為像素對,比較每對像素值的大小,如果前者大于後者,提取1,如果前者小于後者,提取0。

繼續閱讀