數字圖像水印


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 原始圖像與被篡改圖像的對比


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM