?? dwt1_embed.m
字號:
%DWT水印源碼
%完全根據DCT1修改,只為了拋磚引玉
%人生在于嘗試,快樂。
%有錯誤的地方希望大家指正
%嵌入源碼
clc
clear all;
% 保存開始時間
start_time=cputime;
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
%將隨機數發生器的狀態置為1100
randn('state',1100);
% 產生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');
a=cD1;
% 如果 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');
% 顯示運行時間
elapsed_time=cputime-start_time,
% 計算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('原圖');
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -