1.實驗目的
(1)了解頻域水印的特點
(2)掌握基於DCT系數關系的圖像水印算法原理
2.實驗內容(二選一)
(1)DCT域的圖像水印嵌入與提取
(2)完全脆弱圖像水印實驗
3.實驗原理
(1)DCT域的圖像水印嵌入與提取
在信號的頻域(變換域)中隱藏信息要比在時域中嵌入信息具有更好的魯棒性。一副圖像經過時域到頻域的變換后,可將待隱藏信息藏入圖像的顯著區域,這種方法比 LSB 以及其他一些時域水印算法更具抗攻擊能力,而且還保持了對人類感官的不可察覺性。常用的變換域方法有離散余弦變換(DCT)、離散小波變換(DWT)和離散傅里葉變換(DFT)等。
本章介紹一種提取秘密信息的時候不需要原始圖像的盲水印算法,算法的思想是利用載體中兩個特定DCT 系數的相對大小來表示隱藏的信息。載體圖像分為 8×8 分塊,進行二維 DCT 變換,分別選擇其中的兩個位置,比如用(u1,v1)和(u2,v2)代表所選定的兩個系數的坐標。如果 Bi(u1,v1) < Bi(u2,v2),代表隱藏 1,如果相反,則交換兩系數,如果 Bi(u1,v1) > Bi(u2,v2),代表隱藏 0,如果相反,則交換兩系數。提取的時候接收者對包含水印的圖像文件進行二維 DCT 變換,比較每一塊中約定位置的 DCT 系數值,根據其相對大小,得到隱藏信息的比特串,從而恢復出秘密信息。但是在使用上述算法的過程中,一般都是引入一個 Alpha 變量對系數的差值進行控制,將兩個系數的差別方法,可以保證提取秘密信息的正確性。
(2)完全脆弱圖像水印實驗
在保證多媒體信息一定感知質量的前提下,將數字、序列號、文字、圖像標志等作為數字水印嵌入到多媒體數據中,當多媒體內容受到懷疑時,可將該水印提取出來用於多媒體內容的真偽識別,並指出篡改位置,甚至攻擊類型等。這種水印稱為脆弱性水印,脆弱性水印分為完全脆弱性水印和半脆弱性水印。當原始載體內容發生改變時,被嵌入的水印信息就遭到了破壞,因此圖像的接收方就不能完整的提取水印信息。從而可以鑒定原始數據是否被篡改。完全脆弱水印主要用於完整性保護,圖像不能發生任何修改,圖像如果發生一個比特的修改都會影響水印信息的提取。而半脆弱水印對一般圖像處理(如:濾波、加噪聲、替換、壓縮等)有較強的免疫能力(魯棒性),但是能檢測到對圖像的惡意篡改,一般用於內容保護。
完全脆弱水印系統要求圖像的任何部分均不能被修改,檢測器對圖像任何細微的變動都會做出拒絕判決。完全脆弱水印一般是從空域 LSB 水印算法演變過來,其中最具有代表性的是校驗和(checksum)算法、公鑰認證水印算法和查找表水印算法。
本節介紹的算法的原理如下:校驗和算法首先計算每個像素字節最高 7 位的 checksum 值,checksum 值定義為一系列相同長度數據的二進制位的模 2 和。在該算法中,此長度為 8 個連續像素中的最高 7 位的聯合長度,共 56 位。在 checksum 值計算過程中,整幅圖像中的每個像素都參與計算,但每個像素只計算一次,最后結果為 56 位的數據。該算法隨后在圖像中隨機選取 56 個像素,將每個像素的最低位變為與上述checksum 比特位相同,以此存儲 checksum 值,從而完成水印的嵌入。圖像認證時,只需要將被檢圖像的checksum 值與提取的水印信息進行比較,便可得知圖像是否被篡改。
在這個算法中,隨機選取的存訪 checksum 值的像素位置以及 checksum 值本身構成了水印信息。在提取水印時,只需計算圖像的 checksum 值並與水印信息中的 checksum 值進行比較,便可知水印是否因遭受篡改而被破壞。
4.實驗記錄
(1)完全脆弱圖像水印實驗
1)Checksum水印嵌入
cuiruoshuiyin.m源代碼:(自定義一個函數)
function [row,col]=cuiruoshuiyin(omatrix,count,key) %定義一個函數
[m,n]=size(omatrix);
distance1=ceil(m*n/count); %朝正無窮的方向取整數
distance2=distance1-2;
if distance2==0
error('載體太小');
end
rand('state',key);
a=rand(1,count);
row=zeros([1 count]);
col=zeros([1 count]);
r=1;
c=1;
row(1,1)=r;
col(1,1)=c;
for i=2:count
if a(i)>=0.5
c=c+distance1;
else
c=c+distance2;
end
if c>n
r=r+1;
if r>m
error('載體太小');
end
c=mod(c,n);
if c==0
c=1;
end
end
row(1,i)=r;
col(1,i)=c;
end
checksum.m源代碼:(嵌入水印)
clc;
clear;
oi=imread('dream.png');
[orow,ocol]=size(oi);
pixelcount=orow*ocol; %計算總像素個數
count=floor(pixelcount/8); %將總像素分為8個一組
wi=oi(:);
for i=1:count %用於存放56bit
for j=1:56
l(i,j)=uint8(0);
end
end
k=1;
i=1;
for i=1:count
wherestart=8*(i-1);
for j=1:8
b(i,j)=wi(wherestart+j);
end
end
%把每個像素值的高7位取出,順序為2,3,4,5,6,7,8
modcount=1;
for i=1:count
for j=1:8
for k=1:7
l(i,7*(j-1)+k)=bitget(b(i,j),k+1); %由低位到高位輸出,取第k+1位
modcount=modcount+1;
end
end
end
%把所有的56位的值按照模2加的到一個56位長度的checksum值
for i=1:count-1
for j=1:56
sum(1,j)=xor(l(i,j),l(i+1,j));
end
end
%從圖像中隨機選取56個像素點
key=123; %用戶選取隨機嵌入的位置
sum=uint8(sum);
[row col] = cuiruoshuiyin(oi,56,key);
for k=1:56
bitset(oi(row(k),col(k)),1,sum(1,k));
end
imwrite(oi,'watermarke.png','png');
figure; %顯示原圖和添加水印信息后的圖
subplot(1,2,1); %顯示的位置
imshow('dream.png'); %顯示的圖像
title('原始圖像'); %圖像的標題
subplot(1,2,2);
imshow('watermarke.png');
title('添加水印信息后的圖像');

圖1-1 完全脆弱水印嵌入前后對比
2)判斷圖像是否被修改
extractwatermark.m源代碼:
clc;
clear;
oi=imread('dream.png');
[orow ocol]=size(oi);
pixelcount=orow*ocol; %計算總像素個數
count=floor(pixelcount/8); %總像素分為8個一組
wi=oi(:);
for i=1:count %用於存放56比特
for j=1:56
l(i,j)=uint8(0);
end
end
k=1;
i=1;
for i=1:count
wherestart=8*(i-1);
for j=1:8
b(i,j)=wi(wherestart+j);
end
end
%把每個像素值的高7位取出,順序為2、3、4、5、6、7、8
modcount=1;
for i=1:count
for j=1:8
for k=1:7
l(i,7*(j-1)+k)=bitget(b(i,j),k+1);
modcount=modcount+1;
end
end
end
%把所有的56位的值按照模2加的到一個56位長度的checksum值
for i=1:count-1
for j=1:56
sum(1,j)=xor(l(i,j),l(i+1,j));
end
end
%從圖像中隨機選取56個像素點
key=123; %用戶選取隨機嵌入的位置
for k=1:56
watermark(1,k)=0;
end
[row col]=cuiruoshuiyin(oi,56,key);
for k=1:56
watermark(1,k)=bitget(oi(row(k),col(k)),1);
end
for k=1:56
diff(1,k)=sum(1,k)-watermark(1,k);
end
for k=1:56
if diff(1,k)~=0
modified=1;
else
modified=0;
end
end

圖2-1 運行結果
3)判斷圖像是否被篡改
modpic.m源代碼:
clc;
clear;
oi=imread('watermarke.png'); %讀入圖像
[orow ocol]=size(oi);
pixelcount=orow*ocol; %計算總像素個數
count=floor(pixelcount/8); %總像素分為8個一組
for i=1:10
for j=1:10
oi(i,j)=0;
end
end
imwrite(oi,'watermarke.png','png'); %畫出圖像
figure;
subplot(1,2,1);
imshow('dream.png');
title('原始圖像');
subplot(1,2,2);
imshow('watermarke.png');
title('被篡改的圖像');

圖3-1 原始圖像與被篡改圖像的對比