問題:
想要用DCT技術,在Matlib上實現水印的隱藏和提取(帶GUI界面),且加上一些攻擊(噪聲、旋轉、裁剪),以及用NC值評判!
流程
選擇載體
[filename,pathname]=uigetfile({'*.bmp';'*.jpg';'*.*'},'選擇圖片');%文件選擇,這里可以選擇可以打開的圖片格式 str=[pathname filename];%被選擇的文件路徑 [handles.I,handles.map]=imread(str);%讀取圖片 zai=imread(str); %zai=[handles.I,handles.map]; psnr_cover=double(zai); guidata(hObject,handles);%圖像串行化,保存在hObject,這樣我整個頁面都能取到handles的值 axes(handles.axes1);%把顯示范圍限定在axes1 imshow(zai,[]);%顯示圖片
選擇要嵌入的水印
[filename,pathname]=uigetfile({'*.bmp';'*.jpg';'*.*'},'選擇圖片');%文件選擇,這里可以選擇可以打開的圖片格式 str=[pathname filename];%被選擇的文件路徑 [handles.I,handles.map]=imread(str);%讀取圖片 %water=[handles.I,handles.map]; global water; water=imread(str); water=rgb2gray(water); water=double(water)/255; water=ceil(water); %guidata(hObject,handles);%圖像串行化,保存在hObject,這樣我整個頁面都能取到handles的值 axes(handles.axes4);%把顯示范圍限定在axes4 imshow(water);%顯示圖片 dimI=size(water); global rm; global cm; rm=dimI(1);cm=dimI(2);
嵌入
start_time=cputime; global water; global rm; global cm; cda0=blkproc(handles.I,[8,8],'dct2'); mark=water; alpha=10; global k1; global k2; k1=randn(1,8); k2=randn(1,8); [r,c]=size(handles.I); cda1=cda0; % cda1 = 256_256 for i=1:rm % i=1:32 for j=1:cm % j=1:32 x=(i-1)*8;y=(j-1)*8; if mark(i,j)==1 k=k1; else k=k2; end cda1(x+1,y+8)=cda0(x+1,y+8)+alpha*k(1); cda1(x+2,y+7)=cda0(x+2,y+7)+alpha*k(2); cda1(x+3,y+6)=cda0(x+3,y+6)+alpha*k(3); cda1(x+4,y+5)=cda0(x+4,y+5)+alpha*k(4); cda1(x+5,y+4)=cda0(x+5,y+4)+alpha*k(5); cda1(x+6,y+3)=cda0(x+6,y+3)+alpha*k(6); cda1(x+7,y+2)=cda0(x+7,y+2)+alpha*k(7); cda1(x+8,y+1)=cda0(x+8,y+1)+alpha*k(8); end end global a1; a1=blkproc(cda1,[8,8],'idct2'); a_1=uint8(a1); axes(handles.axes5);%把顯示范圍限定在axes5s imshow(a_1);%顯示圖片 %imwrite(a_1,'嵌入水印后的圖.bmp','bmp'); %subplot(2,3,3),imshow(a1,[]),title('嵌入水印后的圖像'); %disp('嵌入水印處理時間') embed_time=cputime-start_time set(handles.text13,'string',num2str(embed_time)); p0=a_1;
攻擊
1、白噪聲攻擊
gong=a1; noise0=1*randn(size(gong)); gong=uint8(gong+noise0);
2、椒鹽噪聲
gong=imnoise(uint8(a1), 'salt & pepper', 0.01);%添加密度為0.01的椒鹽噪聲
3、旋轉
gong=uint8(imrotate(uint8(a1),30,'nearest','crop'));
4、裁剪
%原圖進行分色並剪切 gong=a1; I_r= gong(:,:,1); I_r(1:128,1:128)=255; %三色通道合並 gong(:,:,1) = I_r; gong=uint8(gong);
提取
global k1; global gong; global k2; global water; dimI=size(water); psnr_watermarked=double(gong); dca1=blkproc(gong,[8,8],'dct2'); p=zeros(1,8); for i=1:dimI(1) %行 for j=1:dimI(2) % j=1:32列 x=(i-1)*8;y=(j-1)*8; p(1)=dca1(x+1,y+8); p(2)=dca1(x+2,y+7); p(3)=dca1(x+3,y+6); p(4)=dca1(x+4,y+5); p(5)=dca1(x+5,y+4); p(6)=dca1(x+6,y+3); p(7)=dca1(x+7,y+2); p(8)=dca1(x+8,y+1); if corr2(p,k1)>corr2(p,k2),warning off MATLAB:divideByZero; mark1(i,j)=1; else mark1(i,j)=0; end end end axes(handles.axes7);%把顯示范圍限定在axes5s imshow(mark1);%顯示圖片 embed_time=cputime-start_time; set(handles.text14,'string',num2str(embed_time)); NC=nc(mark1,water) %調用nc.m子函數 set(handles.text15,'string',num2str(NC));
結果
參考
1、數字水印常見攻擊類型匯總,噪聲,縮放,旋轉,剪切(附matlab代碼)