資源簡介
關(guān)于MATLAB數(shù)字水印的實驗代碼,課程設(shè)計可以用,可以運行。
代碼片段和文件信息
clear?all;
clc;
start_time=cputime;%;%計算cpu所用時間,當(dāng)前的時間賦值給star_time
%%%%%%%%%%%%讀取水印圖像%%%%%%%%%%%
I=imread(‘nupt.bmp‘);
%%%%%%%%%%%%顯示水印圖像%%%%%%%%%%%
figure(1);
subplot(231);
imshow(I)title(‘水印圖像‘)
dimI=size(I);%I的大小寬*高
rm=dimI(1);cm=dimI(2);%rm為寬,cm為高
%%%%%%%%%%以下生成水印信息%%%%%%%%%
mark=I;%把I賦值給mark
alpha=15%表示幅值設(shè)置在當(dāng)前坐標(biāo)軸上設(shè)置對象的透明度屬性15表示半透明
k1=randn(18);%產(chǎn)生1行8列的隨機數(shù)
k2=randn(18);
a0=imread(‘yuanyuan.bmp‘);
a0=rgb2gray(a0);%將圖形的顏色變成灰色,把彩圖轉(zhuǎn)換為灰色
psnr_cover=double(a0);%大于256會失真,a0轉(zhuǎn)為雙精度不會失真
subplot(232)imshow(a0[])title(‘載體圖像‘);%繪制子圖2x3的第二個,以及圖像及標(biāo)題
[rc]=size(a0);%獲得a0的維數(shù)
cda0=blkproc(a0[88]‘dct2‘);%對a0分成8*8的塊并進(jìn)行二維離散余弦變換
%把它分成64*64個8*8小塊是為了dct2變換后,每一個中頻都集中在對角線上(紙上紅色線),如果直接不分再dct2后
%中頻不分就在大的384*384圖像像素的對角線部分,但是對著一部分進(jìn)行水印嵌入修改后(由不同的k值改),
%中間不分的確會變,但是肉眼看不出來,只有化成64個小塊對中間對角線變換后這么多像素才能被識別。
%%%%%%%%%%%%%%%%%%進(jìn)行DCT變換并嵌入水印%%%%%%%%%%
cda1=cda0;%cda1?=?384_384
for?i=1:rm?%i=1:64
for?j=1:cm?%j=1:64?
x=(i-1)*8;y=(j-1)*8;
if?mark(ij)==1%如果水印圖片的此塊沒有字(白為1黑為0)則采用第一個隨機矩陣
k=k1;
else
k=k2;
end
cda1(x+1y+8)=cda0(x+1y+8)+alpha*k(1);%對每一個8*8的小塊的對角線像素的二位余弦dct值進(jìn)行變換
cda1(x+2y+7)=cda0(x+2y+7)+alpha*k(2);%低頻在左下角?高頻在右上角
cda1(x+3y+6)=cda0(x+3y+6)+alpha*k(3);%從左上到右下dct的絕對值是依次遞減的
cda1(x+4y+5)=cda0(x+4y+5)+alpha*k(4);
cda1(x+5y+4)=cda0(x+5y+4)+alpha*k(5);
cda1(x+6y+3)=cda0(x+6y+3)+alpha*k(6);
cda1(x+7y+2)=cda0(x+7y+2)+alpha*k(7);
cda1(x+8y+1)=cda0(x+8y+1)+alpha*k(8);
end
end
%%%%%進(jìn)行DCT反變換得到嵌入水印后圖像%%%%%%%%%%%%%%
a1=blkproc(cda1[88]‘idct2‘);%a1為對經(jīng)過水印嵌入后的圖像進(jìn)行二維dct反變換
a_1=uint8(a1);%將a1轉(zhuǎn)化為uint8格式
imwrite(a_1‘withmark.bmp‘‘bmp‘);%寫入嵌入后的圖片
subplot(233)imshow(a1[])title(‘嵌入水印后的圖像‘);
disp(‘嵌入水印處理時間‘);
embed_time=cputime-start_time%運行時間
%%%%%%?攻擊實驗測試魯棒性?%%%%%%%%%%%
disp(‘對嵌入水印的圖像的攻擊實驗,請輸入選擇項:‘);%disp是輸出函數(shù)
disp(‘1--添加白噪聲‘);
disp(‘2--高斯低通濾波‘);
disp(‘3--JPEG壓縮‘);
disp(‘4--圖像剪切‘);
disp(‘5--旋轉(zhuǎn)10度‘);
disp(‘6--直接檢測水印‘);
disp(‘其他--不攻擊‘);
d=input(‘請輸入選擇(1-6):‘);
start_time=cputime;
figure(1);
switch?d
case?6
subplot(234);
imshow(a1[]);
title(‘未受攻擊的含水印圖像‘);
M1=a1;
case?1?%加入白噪聲
WImage2=a1;
noise0=20*randn(size(WImage2));
WImage2=WImage2+noise0;
subplot(234);
imshow(WImage2[]);
title(‘加入白噪聲后圖像‘);
M1=WImage2;
M_1=uint8(M1);%無符號取整
imwrite(M_1‘whitenoise.bmp‘‘bmp‘);
case?2?%高斯低通濾波
WImage3=a1;
H=fspeci
- 上一篇:多尺度熵matlab代碼
- 下一篇:基于頻率采樣法FIR帶通濾波器設(shè)計
評論
共有 條評論