數字水印與版權保護


基礎知識

脆弱水印

水印加入載體后,提取不出來,即載體是無效的。

載體圖像的任何修改都能被識別出

半脆弱水印

載體圖像可以接受常規的修改,例如:格式轉換、去燥等

信息隱藏

秘密信息是不可見的,且不影響載體的使用

加密后的密文是可見的,但看不懂

關鍵詞

Information Hiding (信息隱藏)

Steganography(隱寫)

Steganalysis(隱寫分析)

Digital Watermarking(數字水印)

時域|空域|頻域

1、空間域

也叫空域,即像素域,在空域的處理就是在像素級的處理,如在像素級的圖像疊加,通過傅里葉變換后,得到的是圖像的頻譜,表示圖像的能量梯度

2、頻率域

任何一個波形都可以分解成多個正弦波之和,每個正弦波都有自己的頻率和振幅,所以任何一個波形信號有自己的頻率和振幅的集合,頻率域就是空間域經過傅里葉變換的信號

3、時域

時間域,自變量是時間,即橫軸是時間,縱軸是信號的變化,其動態信號 x(t) 是描述信號在不同時刻取值的函數

4、頻域

頻率域,自變量是頻率,即橫軸是頻率,縱軸是該頻率信號的振幅,也就是頻譜圖,描述了信號的頻率結構及頻率與該頻率信號振幅的關系

傅里葉變換是實現空域或時域到頻域的轉換工具

傅里葉變換

傅里葉指出:“任何周期函數都可以表示為用頻率的正弦和、或余弦之和的形式【傅里葉級數】,每個正弦項和、或余弦項乘以不同的系數”

甚至非周期函數,也可以用頻率的正弦和、或余弦乘以加權函數的積分來表示,這種情況叫做“傅里葉變換

具體參考:鏈接

數字水印

主要用於版權保護

工作流程

常用攻擊

1、裁減攻擊

2、划線攻擊

3、編碼攻擊

4、縮放攻擊

5、旋轉攻擊

應用領域

1、廣播監控

2、版權保護

3、盜版追蹤

4、內容認證

5、拷貝控制

信息隱藏

兩個主要分支:數字水印、隱寫術

隱寫術主要用於保密通信

常見的應用:

隱蔽信道

隱蔽信道是相對於公開信道而言的,和公開信道一起使用,公開信道上傳輸的信息,是隱蔽信道上的載體

例:TCP協議頭中保留字段可以用於攜帶秘密信息

偽裝式保密通信

將秘密信息隱藏在正常傳輸的信息中

目的:不引起注意

加密:容易引起注意

可視密碼

把要隱藏的秘鑰信息通過算法隱藏到兩個或多個子秘鑰圖片中

每張圖片都有隨機分布的黑點和白點

把所有的信息疊在一起,就能恢復出原有的信息

特點:回復秘密圖像時不需要任何復雜的計算,直接觀察就可分辨

舉例:

1、基於像素擴展的秘密分享

(2*2分享)

2、基於圖像分解的秘密分享

圖像取證

鑒定圖像來源、圖像完整性等

感知哈希

由圖像數據集到圖像感知摘要集的一個簡單地單項映射,是對圖像感知信息的簡短摘要

利用哈希的摘要性單向性抗碰撞性,對內容操作具有魯棒性,對內容篡改有敏感性

用於圖像內容的識別和認證

數字信封

數字信封:將對稱秘鑰通過非對稱加密(公鑰和私鑰)的結果分發對稱秘鑰的方法

數字信封包含:被加密的內容和被加密的用於加密該內容的秘鑰,經常用接收方的公鑰來加密秘鑰

性能指標

1、透明性

不可感知性,反映對原始信息的改變程度【PSNR值】

2、魯棒性

抗攻擊性,收到攻擊后提取信息的正確率【BER、NC】

3、容量

嵌入1bit信息需要的載體信息bit【1bit 水印信息/nbit載體信息】

4、三者關系

容量增加,魯棒性不變,透明性下降

容量減少,魯棒性不變,透明性增加

容量不變,魯棒性增加,透明性下降

容量不變,魯棒性降低,透明性增加

隱寫術

隱寫系統

載體介紹

1、存在冗余空間的載體

比如:圖像,音頻等,在冗余空間修改修改

2、沒有冗余空間的載體

如文本等

3、載體特點

同一載體不應被使用兩次,否則會重構秘密信息,破壞秘密信息

隱寫系統分類

1、無秘鑰隱寫系統

2、私鑰隱寫系統

是對稱的

3、公鑰隱寫系統

是非對稱的

公鑰和私鑰的結合1:

公鑰和私鑰的結合2:

遭遇第三方攻擊時:

性能指標

1、容量

負載,指載體數據利用率,嵌入效率

2、不可感知性

透明性 | 保真性:

3、健壯性

魯棒性、健壯性

4、安全性

統計不可檢測性

 

信號處理

人能感知的聲音頻率為:16HZ~16KHZ

掩蔽效應

強信號掩蓋弱信號

模擬信號

連續 

數字信號

計算機能夠表示,存儲的信號

數字信號如何表示模擬信號?

1、抽樣

單位時間內抽樣點數夠多

采樣頻率【HZ】:

奈奎斯特采樣定律知:當采樣頻率滿足一定要求時,數字信號能完整保留原始信號信息

2、量化

3、編碼

對采樣所得信息進行編碼,產生碼流單位 b/s 

音頻文件格式

1、WAV

例:

語音評價

主觀評價

平均意見分(MOS,Mean Option Score)

客觀評價

比較波形差別:SNR值

例:計算SNR值

信號變換

變換域操作:

1、DFT:離散傅里葉變換

2、DCT:離散余弦變換

3、DWT:離散小波變換

圖像處理

基礎知識

1、圖像的表示

圖像是由像素(pixel)組成,像素存儲為矩陣

2、圖像分辨率

指的是圖像中像素的個數,例:1024*768,表示圖像每行有1024個像素,每列有768個像素

3、圖像類型

(1)灰度圖像(8位)

圖像每個像素大小為(0黑~255白)的灰度值(gray value)

每個像素用1個字節表示

(2)24位彩色圖像

每個像素用三個字節表示,即像素顏色的紅、藍、綠分量

(3)索引圖像

每個像素存儲一個調色板索引值

調色板每條記錄表示一個顏色(調色板中存儲的值是歸一化后的)

(4)二值圖像

也叫黑白圖像,像素值為0或者1,對應顏色為黑色和白色

4、圖像文件格式

(1)文件頭

包含圖像的自我說明,即維數、類型、創建時間和標題等,也可以包含用於解釋像素值的顏色表和編碼表

(2)圖像數據

像素顏色值或壓縮后的數據

(3)常見的文件格式

(4)BMP位圖文件

** 文件頭

** 信息頭

** 例

(5)JPEG

全稱:Joint Photographic Experts Group ,聯合圖片專家組開發,用於彩色圖像的存儲和網絡傳輸

特點:

采用有損壓縮編碼,數據量小

核心技術:DCT、量化、熵編碼

要點:

用於保存表現自然景觀的圖像

用於網絡傳輸

不適於表現有明顯邊界的圖像

不適於高質量印刷文件

(6)GIF

全稱:Graphics Interchange Format,CompuServe公司開發,用於屏幕顯示和網絡

特點:

具有87a、89a兩種格式:87a描述單一靜止圖像;89a表示多幀圖像

采用改進的LZW壓縮算法

彩色模式:28  ,分辨率:96dpi

使用:

屏幕顯示圖片和電腦動畫

用於網絡傳輸

不適於保存高質量印刷文件

(7)TIFF

全稱:Tag Image File Format,標記圖像文件格式,Aldus公司開發,用於精准描述圖像的場合

特點:

文件描述單一(靜止)圖像

彩色模式:21(單色)~232

支持多平台

采用多種壓縮數據格式

(8)PNG

全稱:Portable Network Graphic Format,便攜式網絡圖形格式

特點:

支持索引、灰度、RGB三顏色以及Appha通道

灰度圖像的深度最多16位,彩色深度最多48位,可存儲最多16位$\alpha $通道數據

采樣無損壓縮

使用:

用於平面設計、網絡傳輸

5、圖像質量評價

客觀評價

(1)均方誤差(MSE,Mean Square Error)

PS:M*N指像素點的個數

 (2)平均絕對誤差(MAE,Mean Absolute Error)

 (3)峰值信噪比(PSNR,Peak Signal to Noise Ratio)

可以表示圖像的平均修改程度,PSNR值越小,影響越大,一般大於30DB

缺點:評價結果有時與主觀感覺不同

(4)例:計算PSNR

圖像變換

1、DFT:離散傅里葉變換

 更多參考:鏈接

二維傅里葉公式:

Matlab函數:

(1)Y=fft(X)

fft - 快速傅里葉變換

    此 MATLAB 函數 用快速傅里葉變換 (fft) 算法計算 X 的離散傅里葉變換 (DFT)。 如果 X 是向量,則 fft(X) 返回該向量的傅里葉變換。
    如果 X 是矩陣,則 fft(X) 將 X 的各列視為向量,並返回每列的傅里葉變換。 如果 X 是一個多維數組,則 fft(X) 將沿大小不等於 1
    的第一個數組維度的值視為向量,並返回每個向量的傅里葉變換。

    Y = fft(X)
    Y = fft(X,n)
    Y = fft(X,n,dim)

(2)Y=ifft(X)

ifft - 快速傅里葉逆變換

    此 MATLAB 函數 使用快速傅里葉變換算法計算 Y 的逆離散傅里葉變換。X 與 Y 的大小相同。 如果 Y 是向量,則 ifft(Y) 返回該向量的逆變換。
    如果 Y 是矩陣,則 ifft(Y) 返回該矩陣每一列的逆變換。 如果 Y 是多維數組,則 ifft(Y) 將大小不等於 1
    的第一個維度上的值視為向量,並返回每個向量的逆變換。

    X = ifft(Y)
    X = ifft(Y,n)
    X = ifft(Y,n,dim)
    X = ifft(___,symflag)

(3)Y=fft2(X)

fft2 - 二維快速傅里葉變換

    此 MATLAB 函數 使用快速傅里葉變換算法返回矩陣的二維傅里葉變換,這等同於計算 fft(fft(X).').'。如果 X 是一個多維數組,fft2
    將采用高於 2 的每個維度的二維變換。輸出 Y 的大小與 X 相同。

    Y = fft2(X)
    Y = fft2(X,m,n)

(4)Y=ifft2(X)

ifft2 - 二維快速傅里葉逆變換

    此 MATLAB 函數 使用快速傅里葉變換算法返回矩陣的二維離散傅里葉逆變換。如果 Y 是一個多維數組,則 ifft2 計算大於 2
    的每個維度的二維逆變換。輸出 X 的大小與 Y 相同。

    X = ifft2(Y)
    X = ifft2(Y,m,n)
    X = ifft2(___,symflag)

(5)Y=fftshift(X):轉換后,低頻處在四個角上,用此函數將其歸為中心

fftshift - 將零頻分量移到頻譜中心

    此 MATLAB 函數 通過將零頻分量移動到數組中心,重新排列傅里葉變換 X。

    Y = fftshift(X)
    Y = fftshift(X,dim)

(6)Y=ifftshift(X)

ifftshift - 逆零頻平移

    此 MATLAB 函數 將進行過零頻平移的傅里葉變換 Y 重新排列回原始變換輸出的樣子。換言之,ifftshift 就是撤消 fftshift 的結果。

    X = ifftshift(Y)
    X = ifftshift(Y,dim)

實驗1:

image=imread('input.jpg');
grayI=rgb2gray(image);
dft1=fft2(grayI);
adft1=abs(dft1);
top=max(adft1(:));
% 為了能更好觀察頻域數據,把范圍做調整 bottom=min(adft1(:)); adft1=(adft1-bottom)/(top-bottom)*100; adft2=fftshift(adft1); figure; subplot(131),imshow(image),title('原圖'); subplot(132),imshow(adft1),title('原頻譜圖'); subplot(133),imshow(adft2),title('移位頻譜圖');%將低頻移到中間

常見的圖形進行傅里葉變換,可以大致反映出圖形的特征:

DFT的性質:

平移圖像后,頻譜基本一樣:

旋轉圖像,頻譜也對應旋轉:

低通和高通:

低通:將距離中心較遠的信息直接去掉,“類似加一個塊“

低通的參數越大,圖像越模糊

將四周的信息全部去掉,圖像會模糊的更自然點:

高通:將中間的一部分信息去掉,“類似這樣:”

高通的參數越大,圖像亮度越低:

2、DCT:離散余弦變換

更多參考:鏈接

二維余弦變換:

對圖片進行DCT變換,能量主要集中在左上角低頻分量處:

Matlab函數:
1、Y=dct(X)

2、Y=idct(X)

3、Y=dct2(X)

4、Y=idct2(X)

實驗1:

image=imread('input.jpg');
grayI=rgb2gray(image);
dct1=dct2(grayI);
adct1=abs(dct1);
top=max(adct1(:));
bottom=min(adct1(:));
adct1=(adct1-bottom)/(top-bottom)*100;
figure;
subplot(131),imshow(image),title('原圖');
subplot(132),imshow(adct1),title('DCT頻譜圖');

應用:

DCT常用於圖像信號處理,例:JPEG圖像壓縮

圖像不同位置的DCT系數大小,反映圖像不同頻率成分的強弱,位置與頻率有反應關系,水平方向從左到右,頻率逐漸升高;垂直方向從上到下,頻率逐漸升高

實驗2:DCT系數特性研究

總結:DCT系數中高頻分量對圖像影響不大

3、DWT:離散小波變換

更多:參考

小波變換分塊:

圖像轉換

PS:

彩色圖像 ——》索引圖像 :會失真

索引圖像 ——》彩色圖像:無失真

常用函數:

例子:

BW=im2bw(I,T):圖像轉換成二值圖像

參數:

  I:圖像數據

  T:歸一化的分割閾值(0-1)

  BW:分割后的二值圖像

如何尋找閾值呢?

方法:雙峰法

適用於:圖像中前景和背景差別明顯,且各占一定比例

效果:

作業

第五次作業

問題1:

使用文件格式信息隱藏,在一幅256×256的灰度圖像中隱藏512字節秘密數據,描述隱藏實現過程,必須將哪些圖像格式參數修改,修改為什么?

解:

將秘密信息隱藏在文件數據尾部

需要修改文件頭中文件長度域,即文件頭中的 bfSize +512 即可

問題2:

在一幅3×3圖像數據中,每個像素4bit,使用MLSB算法實現14bit秘密信息的隱藏,描述隱藏方法?

解:

什么是MLSB?

除最低比特平面外,圖像其他低平面也可以隱藏信息,替換多個圖像比特平面隱藏信息的算法,叫做MLSB

問題3:

使用基於顏色索引順序的信息隱藏,如果有6個顏色值,問最多可以隱藏幾bit的秘密信息?

解:

設圖像可嵌入M比特秘密信息,有N種顏色,則要滿足下面的關系

  故若有6種顏色,即N=6,則可嵌入,比特秘密信息,即M ≤9,故最多可以隱藏9bit秘密信息

第六次作業

1.使用基於顏色索引順序的信息隱藏,針對PPT128-132的例子,當秘密信息d=0101時,試用文字描述如何確定4個顏色的排序為(C2,C1,C0,C3)?

解:

2.使用基於調色板圖像內容的信息隱藏,針對PPT137頁的例子,其他條件不變,如果秘密信息為111000,問LSB隱藏后的像素值(顏色索引值)?

解:

第七次作業

1、參考第4章第1個PPT第182頁,嘗試描述仙農信道容量公式的含義?如果高斯信道的帶寬為8kHz,信號和噪聲功率比為7,求該信道的信道容量?如果要在該信道上傳輸30kb/s的信號,是否能實現無差錯傳輸?

2、參考第4章第2個PPT第7頁:DCT頻域信息隱藏框架,嘗試用文字**描述基於DCT的圖像水印處理流程**?

程序:

% DCT 變換信息隱藏
io = imread("huidu.jpg");
figure;
subplot(1,3,1),imshow(io),title("原圖");

io = double(io);
% 待嵌入的秘密信息msg
msg = [1,0,1,1];
% 用於計數,嵌入完成后停止操作。
count = length(msg);
org_msg = [1,0,1,1];
T = dctmtx(8); %圖像分塊8*8
DCTrgb = blkproc(io,[8 8], 'P1*x*P2',T, T'); % 對載體圖像進行DCT變換
subplot(1,3,2),imshow(DCTrgb),title("DCT分塊變換");

[row,col]=size(DCTrgb);
row=floor(row/8);
col=floor(col/8);
alpha=0.02;
k = 1;
temp=0;
for i=0:(row - 1)
    for j=0: (col -1)
        irow = i * 8;
        jcol = j * 8;
        if k <= count
            if msg(k) == 0
                %選擇(5,2),(4,3)這兩對系數,
                % 策略是(5,2)的DCT系數 < (4,3)時,表示嵌入了0  
                % 如果(5,2) > (4,3) 那我們把兩個系數交換,還表示嵌入了0
                if DCTrgb(irow + 5, jcol + 2) < DCTrgb(irow + 4,jcol + 3)
                    temp = DCTrgb(irow + 5, jcol + 2);
                    DCTrgb(irow + 5, jcol + 2) = DCTrgb(irow + 4,jcol + 3);
                    DCTrgb(irow + 4, jcol + 3) = temp;
                end
            else
                if DCTrgb(irow + 5, jcol + 2) > DCTrgb(irow + 4,jcol + 3)
                    temp = DCTrgb(irow + 5, jcol + 2);
                    DCTrgb(irow + 5, jcol + 2) = DCTrgb(irow + 4,jcol + 3);
                    DCTrgb(irow + 4, jcol + 3) = temp;
                end
            end
            %將原本小的系數變的更小,使系數差變大
            if DCTrgb(irow + 5, jcol + 2) < DCTrgb(irow + 4,jcol +3)
                DCTrgb(irow + 5, jcol + 2) = DCTrgb(irow +5, jcol +2) - alpha;
            else
                DCTrgb(irow + 4, jcol + 3) = DCTrgb(irow + 4, jcol +3) - alpha;
            end
            k = k + 1;
        end
    end
end
wi=blkproc(DCTrgb,[8 8],'P1*x*P2',T',T); %嵌入信息的載體DCT變換,恢復圖像
orgin_wi=wi/255;
subplot(1,3,3),imshow(orgin_wi),title("嵌入信息后的");

% 提取消息
% ext_msg是提取出的秘密信息
ext_msg = [];
T=dctmtx(8);
DCTcheck=blkproc(wi,[8 8],'P1*x*P2',T,T'); %對隱秘圖像進行DCT變換
[row,col]=size(DCTcheck);
row=floor(row/8);
col=floor(col/8);
k = 1;
for i=0:(row - 1)
    for j=0: (col -1)
        irow = i * 8;
        jcol = j * 8;
        %通過比較(5,2),(4,3)這兩對系數,判斷隱藏的信息是1還是0
        if k <= count
            if DCTcheck(irow + 5, jcol + 2) < DCTcheck(irow + 4,jcol + 3)
                ext_msg(k,1)=1;
            end
            if DCTcheck(irow + 5, jcol + 2) > DCTcheck(irow + 4,jcol + 3)
                ext_msg(k,1)=0;
            end
            k = k + 1;
        end
    end
end
fprintf("嵌入的信息:");
disp(msg);
fprintf("提取的信息:");
disp(ext_msg);

3、參考第4章第2個PPT第56頁:DFT頻域信息隱藏框架,嘗試用文字**描述DFT圖像水印的基本流程**?

程序:

function p =watermark()
%使用DCT方法,實現圖片水印嵌入
chars_info = char('shaohang110');
fprintf('原始水印信息\n %s \n', chars_info);
len=uint8(chars_info);
bits_info = reshape(de2bi(len,8,'left-msb')',[],1);
yuanImg=imread('Lena2.bmp');
k=50000;  %DFT用的系數

wmImg=[];
yuanImgYUV=[];
%彩色圖像水印嵌入
yuanImgYUV = rgb2ycbcr(yuanImg);
%觀察原始圖像幅度頻率特性
%fftAM=uint8(abs(fftshift(fft2(yuanImgYUV(:,:,1))))/100);
%imshow(fftAM)
yuanImgYUV(:,:,1) = EmbedWM_289(yuanImgYUV(:,:,1), bits_info, k,1);
wmImg = ycbcr2rgb(yuanImgYUV);
%觀察嵌入水印后圖像幅度頻率特性
%fftAM=uint8(abs(fftshift(fft2(yuanImgYUV(:,:,1))))/100);
%figure(2);imshow(fftAM)
imwrite(wmImg,'wm.bmp');
figure;
subplot(1,2,1),imshow(yuanImg),title("原圖");
subplot(1,2,2),imshow(wmImg),title("嵌入水印后");

fprintf("水印提取:");
extraWM(len);


%%水印嵌入
function fw = EmbedWM_289(f, bits_info, k, type)
%本程序用來對圖像進行DFT,通過改變DFT的分塊系數的能量關系,實現水印的嵌入
%f:當前需要嵌入的圖像
%bits_info:嵌入的水印內容
%k:嵌入水印的強度
%type:表示嵌入的類型,
%type=1時:(e1 - e) > k,表示水印0; (e2 - e1) > k,表示水印1
%type=2時:(e1 - e2) > k,表示水印1; (e2 - e1) > k,表示水印0
stepx = 4;%每bit嵌入區域的橫向步長
stepy = 4;%每bit嵌入區域的縱向步長

 %k = 50000;

len_info = length(bits_info);%嵌入信息的長度

fftHuge = fftshift( fft2(f) );

if ( mod(size(fftHuge, 1), 2) == 0 )
    if ( mod(size(fftHuge, 2), 2) == 0 )
        fftHuge_ct = fftHuge(2:end, 2:end);
    else
        fftHuge_ct = fftHuge(2:end, :);
    end
else
    if ( mod(size(fftHuge, 2), 2) == 0 )
        fftHuge_ct = fftHuge(:, 2:end);
    else
        fftHuge_ct = fftHuge(:, :);
    end
end

dist_r = floor( size(fftHuge_ct, 1)/4 );
dist_c = floor( size(fftHuge_ct, 2)/4 );

fftHuge_wm = fftHuge_ct(dist_r+1: end-dist_r, dist_c+1: end-dist_c);

rmax_block = floor(size(fftHuge_wm,1)/(2*stepy));%縱向(行)最大分塊數,由於中心對稱性,故只處理上半部分
cmax_block = floor(size(fftHuge_wm,2)/stepx);%橫向(列)最大分塊數

if( rmax_block * cmax_block < len_info )
    disp('水印信息過長\n');
    return;
end

SG1 = zeros(stepy*stepx/4, 2);
SG2 = zeros(stepy*stepx/4, 2);

% modified coefficients
% 右上角的系數
count = 1;
for r = 1 : stepy/2
    for c = stepx/2+1 : stepx
        SG1(count, 1) = r;
        SG1(count, 2) = c;
        count = count + 1;
    end
end

% 左下角的系數
count = 1;
for r = stepy/2+1 : stepy
    for c = 1 : stepx/2
        SG2(count, 1) = r;
        SG2(count, 2) = c;
        count = count + 1;
    end
end

count = 1;
for r = 1 : rmax_block
    for c = 1 : cmax_block
        fft_block = fftHuge_wm( (r-1)*stepy+1 : r*stepy, (c-1)*stepx+1 : c*stepx );
        %---------------------------系數修改-------------------------------- 
        % 計算能量及幅角
        ext = abs(fft_block); %幅度
        theta = angle(fft_block); %相角
        
        e1 = 0;
        e2 = 0;
        for i = 1 : size(SG1,1)
            e1 = e1 + ext(SG1(i,1), SG1(i,2));
            e2 = e2 + ext(SG2(i,1), SG2(i,2));
        end
        
        % 修改能量
        if(type==1)   %類型1
            if ( bits_info(count) == 0 && (e1 - e2) < k )
                delta = (k - e1 + e2)/(2*size(SG1,1));%每個系數的修改量,size(SG1,1)表示每個區域的點數
                for i = 1 : size(SG1,1)
                    ext(SG1(i,1), SG1(i,2)) = ext(SG1(i,1), SG1(i,2)) + delta;
                    ext(SG2(i,1), SG2(i,2)) = ext(SG2(i,1), SG2(i,2)) - delta;
                end 
            elseif ( bits_info(count) == 1 && (e2 - e1) < k)
                delta = (k - e2 + e1)/(2*size(SG1,1));%每個系數的修改量,size(SG1,1)表示每個區域的點數
                for i = 1 : size(SG1,1) 
                    ext(SG2(i,1), SG2(i,2)) = ext(SG2(i,1), SG2(i,2)) + delta;
                    ext(SG1(i,1), SG1(i,2)) = ext(SG1(i,1), SG1(i,2)) - delta;
                end
            end
        elseif(type==2)
            if ( bits_info(count) == 1 && (e1 - e2) < k )
                delta = (k - e1 + e2)/(2*size(SG1,1));%每個系數的修改量,size(SG1,1)表示每個區域的點數
                for i = 1 : size(SG1,1)
                    ext(SG1(i,1), SG1(i,2)) = ext(SG1(i,1), SG1(i,2)) + delta;
                    ext(SG2(i,1), SG2(i,2)) = ext(SG2(i,1), SG2(i,2)) - delta;
                end 
            elseif ( bits_info(count) == 0 && (e2 - e1) < k)
                delta = (k - e2 + e1)/(2*size(SG1,1));%每個系數的修改量,size(SG1,1)表示每個區域的點數
                for i = 1 : size(SG1,1) 
                    ext(SG2(i,1), SG2(i,2)) = ext(SG2(i,1), SG2(i,2)) + delta;
                    ext(SG1(i,1), SG1(i,2)) = ext(SG1(i,1), SG1(i,2)) - delta;
                end
            end
        end
        % 恢復FFT系數矩陣
        re = ext.*cos(theta);
        im = ext.*sin(theta);
        fft_block = re + 1i*im;
        %------------------------------------------------------------------
        fftHuge_wm( (r-1)*stepy+1 : r*stepy, (c-1)*stepx+1 : c*stepx ) = fft_block;%將修改后的FFT系數置回
        fftHuge_wm( end-r*stepy+1 : end-(r-1)*stepy, end-c*stepx+1 : end-(c-1)*stepx ) = rot90( conj(fft_block), 2 );%將修改后的共軛FFT系數轉置后置回
        
        if ( count >= len_info )
            break;
        end
            
        count = count + 1;
    end
    
    if ( count >= len_info )
        break;
    end
end

fftHuge_ct(dist_r+1: end-dist_r, dist_c+1: end-dist_c) = fftHuge_wm;

if ( mod(size(fftHuge, 1), 2) == 0 )
    if ( mod(size(fftHuge, 2), 2) == 0 )
        fftHuge(2:end, 2:end) = fftHuge_ct;
    else
        fftHuge(2:end, :) = fftHuge_ct;
    end
else
    if ( mod(size(fftHuge, 2), 2) == 0 )
        fftHuge(:, 2:end) = fftHuge_ct;
    else
        fftHuge(:, :) = fftHuge_ct;
    end
end

fw = uint8( ifft2(ifftshift(fftHuge)) );

mse=mymse(f,fw,size(f,2),size(f,1));
psnr=10*log10(255^2/mse);
fprintf('PSNR = %f\n', psnr);

%%水印提取
function p =extraWM(len)
%使用DCT方法,實現圖片水印提取
%提取水印時不需要原始水印內容,但是需要水印的長度

bits_info = reshape(de2bi(len,8,'left-msb')',[],1);

%下面進行水印提取
wmImg=imread('wm.bmp');
%wmImg=imread('wm.jpg');
%wmImg=imread('wm2.bmp');
%彩色圖像提取水印
wmImgYUV=[];
wmImgYUV = rgb2ycbcr(wmImg);
bits_info_ext = ExtractWM_289(wmImgYUV(:,:,1), length(bits_info),1);      
%二進制數組轉換為字符串
extrastr='';
[m n]=size(bits_info_ext);
for x=1:m/8
    temp=bi2de(bits_info_ext((x-1)*8+1:x*8)','left-msb');
    extrastr=[extrastr char(temp)];
end
extrastr
ber(bits_info_ext, bits_info)

輸出:

原始水印信息
 shaohang110 
PSNR = 48.607484
水印提取:
extrastr =

    'shaohang110'

第8次課作業

1、參考第4章第3個PPT第33頁,描述針對幾何失真下采用頻域模板實現魯棒水印的方法?

解:

魯棒水印:能夠抵抗各種信號處理,攻擊

幾何失真:只要由掃描過程引起的旋轉和縮放失真

方法:提取圖像邊緣,並利用RADON投影變換來檢測圖像的傾斜角,完成后,逆向旋轉圖像即可

RADON投影變換:將原始圖像變換為它在各個角度的投影表示。

2、采用抗打印掃描水印算法(二)基於DCT分塊系數比較的方法(參考第4章第3個PPT第78頁),已知4塊內數據為:(1.2, 1.6, 1.7),(1.7,1.8,1.6),(1.8,2.0,2.1),根據該算法策略,嵌入水印0,1,0后,數據修改為什么?(D=0.5)

解:

3.采用抗打印掃描水印算法(三)基於系數分類的方法(參考第4章第3個PPT第92頁),已知4個集合分別為:

F(3,0)={ +1.0, -1.4,-0.9,-1.2},

F(2,1)={ +2.2, -1.8,+0.5,-1.0},

F(1,2)={ -1.5,+1.1,+0.3,-0.8},

F(0,3)={ +1.2, -1.3,+0.4,-1.0},

若魯棒性參數d為2,嵌入0時,要求𝑛+≥𝑛−+𝑑;嵌入1時,要求𝑛−≥𝑛++𝑑。則嵌入0,0,1,1后,系數調整為什么?

解:

第九次作業

1、半脆弱水印如何建立圖像塊中LSB與圖像塊內容的聯系?(提示:參考PPT中P. W. Wong水印算法),該算法能否抵抗圖像拼湊攻擊?如何抵抗圖像拼湊攻擊?

解:

2. 嘗試描述音頻回聲隱藏水印提取的過程?注意不要抄公式!【設原信號為x(t), 增加回聲后信號為y(t),隱藏0時,延時為Δ1,隱藏1時,延時為Δ2】

解:

3.回聲隱藏信號生成:

已知音頻片段采樣值為以下序列:

: 8, 10, 12, 14, 8, 8, 12,14,12,10,14,16, 14,18,16,12,10,12

衰減系數為0.5,’0’回聲延遲為2個采樣點,’1’回聲延遲為1個采樣點,每6個樣點為一個片段。已知秘密信息為(1,1,0)B,且隱藏后信號為:

寫出混合器信號 , (不用考慮過渡)

寫出攜帶秘密信息的信號

解:

第十次作業

1、語音信號的抽樣頻率是多少?G.711中每個抽樣值編碼位數是多少?嘗試描述參數編碼的實現思路?

解:

語音信號的抽樣頻率8k/s

G.711中每個抽樣值編碼位數是 8位

參數編碼的實現過程:先進過計算,找到當前的5個抽樣值組成的碼組和哪個碼本最接近,然后用這個碼本的編號取代原來的40bit碼組,1024個碼本對應的編碼是10bit,故經過參數后,用10bit碼本編號作為參數,進行通信。

補充:

G.711:又叫PCM(脈沖編碼調制),是國際電信聯盟訂定出來的一套語音壓縮標准,主要用於電話,它主要用脈沖編碼調制對音頻采樣,采樣率為8k每秒。它利用一個 64Kbps 未壓縮通道傳輸語音訊號。起壓縮率為1:2,即把16位數據壓縮成8位。G.711是主流的波形聲音編解碼器

G.711 標准下主要有兩種壓縮算法。一種是µ-law algorithm (又稱often u-law, ulaw, mu-law),主要運用於北美和日本;另一種是A-law algorithm,主要運用於歐洲和世界其他地區。其中,后者是特別設計用來方便計算機處理的。這兩種算法都使用一個采樣率為8kHz的輸入來創建64Kbps的數字輸出。G.711采用一種稱為分組丟失隱藏(PLC)的技術來減少丟包帶來的實際影響。有效的信號帶寬在靜默期間通過語音活動檢測(VAD)這一過程被減小。

壓縮編碼分為:波形編碼、參數編碼和混合編碼

波形編碼:對於采樣得到的每個數據進行壓縮編碼

參數編碼:提取語音信號的特征參數進行編碼,傳輸的是這些參數,不是語言信號本身

2、在靜態軟件水印中,如何設計實現中間代碼軟件水印?攻擊者如何檢測中間代碼軟件水印?

解:

         實現中間代碼軟件水印分為兩部分:

首先嵌入水印:程序設計不會執行“死流程”,用合法的語句填充死流程,然后編碼源代碼,用水印替換死流程對應的中間代碼

然后提取水印:找到死流程對應位置,提取水印

         攻擊者可以進行如下攻擊:

                  方法一:列舉出所有函數的執行時間,定位從未執行的函數

                  方法二:在不影響軟件功能的情況下調整指令的順序

                  方法三:水印不會執行指令,根據軟件執行多次執行的時間分布信息,可以很有效的猜測出水印的隱藏位置

補充:

軟件水印:把程序的版權信息和用戶身份嵌入到程序中

靜態水印:存儲在可執行程序代碼中

靜態代碼水印:靜態數據水印

靜態代碼水印嵌入位置:中間代碼、源代碼

3、采用基於大數分解難題的軟件水印方案,已知水印數字為16,基底為3,如何用基數圖表示這個水印?(按據根節點的距離,由近到遠依次編號為:2,1,0,要求說明每個節點左指針指向幾號節點)

解:

 

4、在像素翻轉信息隱藏中(參照PPT第86頁)已知一行6個文字,黑色像素的像素個數分別是14,17,12,14,16,17,嵌入策略定為:嵌入0,則把比值調整為0.8;嵌入1,則把比值調整為1.2;一半漢字用於嵌水印,一半用於平衡,使嵌入前后均值不變;那么嵌入1,1,0三個比特后,這行漢字的黑色像素變為(均衡像素的分配盡量平均)?

解:

 

 

 

 

 

 

 

 

 

 

參考

1、信息隱藏與數字水印.楊榆,雷敏.北京郵電大學出版社有限公司,2017年

2、信息隱藏與數字水印實驗教程.楊榆.國防工業出版社,2010年


免責聲明!

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



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