天天看點

【圖像隐寫】基于matlab DWT數字水印多種攻擊效果對比【含Matlab源碼 1134期】

二、部分源代碼

clc
clear all;


k=20;          
blocksize=8;   % 設定塊的大小

% 讀入原圖像
file_name='_lena_std_bw.bmp';
cover_object=double(imread(file_name));

% 原圖像的行數與列數
Mc=size(cover_object,1);         %原圖像行數
Nc=size(cover_object,2);         %原圖像列數

% 最大嵌入資訊量
max_message=Mc*Nc/(blocksize^2);

% 讀入水印圖像
file_name='c.bmp';
message=double(imread(file_name));

%%水印圖像的行數與列數
Mm=size(message,1);               %水印行數
Nm=size(message,2);               %水印列數

message_vector=reshape(message,1,Mm*Nm);

% 檢查水印資訊是否過大
if (Mm*Nm> max_message)
error('水印太大')
end

% 産生watermarked_image,并寫入原圖資訊
watermarked_image=cover_object;


% 将圖像分塊嵌入
% 當 (2,2) > (2,3) 且 message_pad(kk)=0
% 當 (2,2) < (2,3) 且 message_pad(kk)=1

%%在提取水印時,如果cD1(2,2)>cD1(2,3)便是嵌入了水印的黑色像素,
%%反之則是嵌入了白色像素
x=1;
y=1;
h=waitbar(0,'嵌入水印,請等待');
for (kk = 1:length(message_vector))

% 對塊進行DWT變換
  [cA1,cH1,cV1,cD1] = dwt2(cover_object(x:x+blocksize-1,y:y+blocksize-1),'haar');
% 如果 message_pad(kk)== 0
if (message_vector(kk) == 0)

% 且(2,2) < (2,3) ,交換它們
if (cD1(2,2) < cD1(2,3))
temp=cD1(2,3);
cD1(2,3)=cD1(2,2);
cD1(2,2)=temp;
end

% 如果message_pad(kk) == 1, 
elseif (message_vector(kk) == 1)

% 且(2,2) > (2,3) ,交換它們
if (cD1(2,2) >= cD1(2,3))
temp=cD1(2,3);
cD1(2,3)=cD1(2,2);
cD1(2,2)=temp;
end
end

% 檢查(2,2) , (2,3)的差是否>= k
if cD1(2,2) > cD1(2,3)
if cD1(2,2) - cD1(2,3) < k
cD1(2,2)=cD1(2,2)+(k/2);
cD1(2,3)=cD1(2,3)-(k/2);         
end
else 
if cD1(2,3) - cD1(2,2) < k
cD1(2,3)=cD1(2,3)+(k/2); 
cD1(2,2)=cD1(2,2)-(k/2);
end
end

%IDWT
watermarked_image(x:x+blocksize-1,y:y+blocksize-1)= idwt2(cA1,cH1,cV1,cD1,'haar',[Mc,Nc]);


% 移動到下一塊
if (x+blocksize) >= Nc
x=1;
y=y+blocksize;
else
x=x+blocksize;
end
waitbar(kk/length(message_vector),h);
end
close(h);

% 轉換為uint8并寫入dwt_watermarked.bmp
watermarked_image_uint=uint8(watermarked_image);
imwrite(watermarked_image_uint,'dwt_watermarked.bmp','bmp');

% 計算psnr值
psnr=psnr(cover_object,watermarked_image), 

% 顯示圖像
%figure(1)
%imshow(message,[]);
%title('水印');
figure(2)
subplot(1,2,1);
imshow(watermarked_image,[])
title('嵌入水印圖像')
subplot(1,2,2);
imshow(cover_object,[]);
title('原圖');




%提取源碼
clear all;

blocksize=8;   % 設定塊的大小

% 讀入嵌入水印圖像
file_name='dwt_watermarked.bmp';
watermarked_image=double(imread(file_name));

% 嵌入水印圖像的行數與列數
Mw=size(watermarked_image,1);         %嵌入水印圖像的行數
Nw=size(watermarked_image,2);         %嵌入水印圖像的列數

% 最大嵌入資訊量
max_message=Mw*Nw/(blocksize^2);

% 讀入原始水印
file_name='c.bmp';
orig_watermark=double(imread(file_name));

% 原始水印的行數與列數
Mo=size(orig_watermark,1);    %原始水印的行數
No=size(orig_watermark,2);    %原始水印的列數

% 将圖像分塊提取水印
x=1;
y=1;
h=waitbar(0,'水印提取中,請等待');
for (kk = 1:max_message) 

% 對塊進行dwt變換
  [cA1,cH1,cV1,cD1] = dwt2(watermarked_image(x:x+blocksize-1,y:y+blocksize-1),'haar');

% 如果cD1(2,2) > cD1(3,3) 那麼 message_vector(kk)=0
% 否則 message_vector(kk)=1
if cD1(2,2)>cD1(2,3)
message_vector(kk)=0;
else
message_vector(kk)=1;
end


% 移動到下一塊
if (x+blocksize) >= Mw
x=1;
y=y+blocksize;
else
x=x+blocksize;
end
waitbar(kk/max_message,h);
end
      

三、運作結果

【圖像隐寫】基于matlab DWT數字水印多種攻擊效果對比【含Matlab源碼 1134期】
【圖像隐寫】基于matlab DWT數字水印多種攻擊效果對比【含Matlab源碼 1134期】
【圖像隐寫】基于matlab DWT數字水印多種攻擊效果對比【含Matlab源碼 1134期】
【圖像隐寫】基于matlab DWT數字水印多種攻擊效果對比【含Matlab源碼 1134期】
【圖像隐寫】基于matlab DWT數字水印多種攻擊效果對比【含Matlab源碼 1134期】
【圖像隐寫】基于matlab DWT數字水印多種攻擊效果對比【含Matlab源碼 1134期】

四、matlab版本及參考文獻

1 matlab版本

2014a

2 參考文獻

[1] 蔡利梅.MATLAB圖像處理——理論、算法與執行個體分析[M].清華大學出版社,2020.

[2]楊丹,趙海濱,龍哲.MATLAB圖像處理執行個體詳解[M].清華大學出版社,2013.

[3]周品.MATLAB圖像處理與圖形使用者界面設計[M].清華大學出版社,2013.

[4]劉成龍.精通MATLAB圖像處理[M].清華大學出版社,2015.

[5]梁欣.基于DWT和SVD的彩色圖像數字水印算法研究[J].計算機與數字工程. 2019,47(08)

繼續閱讀