上學期幫同校本科的同學做了畢業設計的實驗部分,用matlab實現dct水印演算法,並且包含了攻擊測試。先講乙個大體概念,然後放出具體**。
dct(離散余弦變換),這裡只以二維dct為例。
訊號經過dct後,從空間域變換到頻域。是一種正交變換的方法。是影象處理中應用即為廣泛的傅氏變換中一種特殊的情況(被展開函式是實偶函式,再離散化,即為離散余弦變換)。
同傅氏變換一樣,有正反兩種變換。
正dct:從空間域變為頻域。反dct:從頻域變為空間域。具體公式如下。
正dct:
其中:
反dct
*f(x,y)是空間取樣值,簡單說,就是點(x,y)的畫素值。f(u,v)是頻域取樣值。*
%加水印,提取出水印
%林多%%%
%%%%%%
%%%%
m=256; %原影象長度
n=32; %水印影象長度
k=8; %8x8的分塊
i=zeros(m,m);%建立乙個mxm矩陣,元素全是0
j=zeros(n,n);
block = zeros(k,k);
%顯示原影象
subplot(5,2,1);%顯示多幅影象,在第乙個位置顯示
i=imread('23.bmp');%將23.bmp讀入i中
imshow(i);%顯示影象
title('原始公開影象');%標題
%顯示水印影象
subplot(5,2,2);
j=imread('21.bmp');
imshow(j);
title('水印影象');
%水印嵌入演算法
for p=1
:n %從1到32迴圈
for q=1
:n %從1到32迴圈
x=(p-1)*k+1; y=(q-1)*k+1;
block=i(x:x+k-1,y:y+k-1);%取相應元素儲存到block中
block=dct2(block);%二維離散余弦變換
ifj(p,q)==0 %如果元素為0
a=-1;
else
a=1;
endblock=block*(1+a*0.03); block=idct2(block);%反二維離散余弦變換
i(x:x+k-1,y:y+k-1)=block;
endend%顯示嵌入水印後的影象
subplot(5,2,3);
imshow(i);
title('嵌入水印後的影象');
imwrite(i,'watermarked.bmp','bmp');%儲存成watermarked.bmp
i=imread('23.bmp');%未加水印的原影象
p=imread('watermarked.bmp');%水印影象
%提取水印演算法
for p=1
:nfor q=1
:nx=(p-1)*k+1;
y=(q-1)*k+1;
block1=i(x:x+k-1,y:y+k-1);%賦給block1元素
block2=p(x:x+k-1,y:y+k-1);%賦給block2元素
block1=idct2(block1);%對其本身進行反二維離散余弦變換
block2=idct2(block2);%對其本身進行反二維離散余弦變換
a=block2(1,1)/block1(1,1)-1;
if a<0
w(p,q)=0;
else
w(p,q)=1;
endend
end%顯示提取的水印
subplot(5,2,4);
imshow(w);
title('從含水印影象中提取的水印');
%----------攻擊測試-----------------------%
%----------中值攻擊----------%
p1=imread('watermarked.bmp');
p1=double(p1(:,:,1));%取1通道
p1=medfilt2(p1);%中值濾波
subplot(5,2,5);
imshow(p1,);
title('中值濾波攻擊');
i1=imread('23.bmp');%未加水印的原影象
%提取水印演算法
for p=1
:nfor q=1
:nx=(p-1)*k+1;
y=(q-1)*k+1;
block1=i1(x:x+k-1,y:y+k-1);%賦給block1元素
block2=p1(x:x+k-1,y:y+k-1);%賦給block2元素
block1=idct2(block1);%對其本身進行反二維離散余弦變換
block2=idct2(block2);%對其本身進行反二維離散余弦變換
a=block2(1,1)/block1(1,1)-1;
if a<0
w1(p,q)=0;
else
w1(p,q)=1;
endend
endsubplot(5,2,6);
imshow(w1);
title('從含中值濾波影象中提取的水印');
%----------變小攻擊----------%
p2=imread('watermarked.bmp');
p2=imresize(p2,0.5);%變為0.5倍,從256x256到128x128
subplot(5,2,7);
imshow(p2,);%顯示變小後影象
title('變小攻擊,變為128x128畫素');
i2=imread('23.bmp');%未加水印的原影象
i2=imresize(i2,0.5);%原影象一樣變小
%提取水印演算法
for p=1:32
for q=1:32
x=(p-1)*4+1;
y=(q-1)*4+1;
block1=i2(x:x+4-1,y:y+4-1);%賦給block1元素
block2=p2(x:x+4-1,y:y+4-1);%賦給block2元素
block1=idct2(block1);%對其本身進行反二維離散余弦變換
block2=idct2(block2);%對其本身進行反二維離散余弦變換
a=block2(1,1)/block1(1,1)-1;
if a<0
w2(p,q)=0;
else
w2(p,q)=1;
endend
endsubplot(5,2,8);
imshow(w2);
title('從128x128影象中提取水印');
%-------旋轉攻擊-------%
p3=imread('watermarked.bmp');
p3=imrotate(p3,90);%逆時針旋轉90度;
subplot(5,2,9);
imshow(p3,);
title('旋轉攻擊');
i3=imread('23.bmp');%未加水印的原影象
i3=imrotate(i3,90); %原影象逆時針旋轉90度;
%提取水印演算法
for p=1
:nfor q=1
:nx=(p-1)*k+1;
y=(q-1)*k+1;
block1=i3(x:x+k-1,y:y+k-1);%賦給block1元素
block2=p3(x:x+k-1,y:y+k-1);%賦給block2元素
block1=idct2(block1);%對其本身進行反二維離散余弦變換
block2=idct2(block2);%對其本身進行反二維離散余弦變換
a=block2(1,1)/block1(1,1)-1;
if a<0
w3(p,q)=0;
else
w3(p,q)=1;
endend
endsubplot(5,2,10);
imshow(w3);
title('從含旋轉影象中提取的水印');
原圖與加水印(右側,仔細看)後的對比。
**打包(附帶實驗):
DCT演算法C 實現原始碼
宣告 此 並非原創,參照網路上一位前輩的 但是測試發現他的 有bug,修改後貼出已做記錄 include include include include define pi acos 1 定義圓周率 using namespace std void dct vector ori,vector dct...
LSB語音水印演算法的實現
主要實現思路,通過fopen 函式進行讀取音訊檔案,得到乙個資料範圍在0 65535的陣列,使用bitset 函式,能夠將每個資料轉換成二進位制,並在最低位插入你想要插入的水印資料。水印資料用audioread來進行讀取有乙個量化取整的過程,該過程將原本資料範圍由 1到1之間,轉換為0到256,也就...
數字水印 基於龜殼魔術矩陣的資訊隱藏演算法
程式設計實現龜殼魔術矩陣 讀取載體影象並設計秘密資訊 設計並實現龜殼資訊隱藏演算法,將秘密資訊嵌入載體影象中 提取嵌入的秘密資訊。程式設計實現龜殼魔術矩陣 生成龜殼矩陣 turtmat zeros 256 turtmat 1,1 6 第一行 for j 2 256 turtmat 1,j mod t...