基於的DCT水印演算法實現

2021-07-06 04:43:58 字數 4570 閱讀 3076

上學期幫同校本科的同學做了畢業設計的實驗部分,用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...