1. 程式人生 > >隱寫分析中容易犯的小錯誤

隱寫分析中容易犯的小錯誤

隱寫分析中經常犯的小錯誤總結如下:

1,試驗中易犯的錯誤(只限MATLAB程式碼)

1)隱寫過程

在做隱寫分析時,為了驗證特徵提取演算法的好壞需要進行實驗檢測。在檢測的過程中,需要cover和stego兩類。stego很多情況下需要我們自己進行隱寫獲得,而其中有一個錯誤就很容易發生在隱寫的過程中。看如下程式碼(取lena圖的一部分)
lena=imread(‘lena.pgm’);
這裡寫圖片描述
imwrite(lena,’lena1.pgm’,’pgm’);

以上兩句程式碼是最常用的兩句,讀圖和儲存影象。但是隱寫的過程是需要將影象的uint8格式轉換成double格式進行處理的,所以我們常用:
lena=double(imread(‘lena.pgm’));
這裡寫圖片描述


那這樣處理完後的矩陣直接用上面的imwrite進行儲存行不行呢?試驗後會發現突變成了全白的圖。

lena=double(imread('lena.pgm'));
imwrite(lena,'lena1.pgm','pgm');
lena1=imread('lena1.pgm');`

原圖的左上角
原圖的左上角
儲存後的lena1的左上角
儲存後的lena1的左上角
出現這種情況可能會使隱寫分析結果變得異常而又很難發現問題出在哪。實際我們只需將imwrite的那一句程式碼改成:imwrite(uint8(lena),’lena1.pgm’,’pgm’);即可解決這個錯誤。
那能不能只用uint8格式而不轉換成double格式進行操作呢?答案是不行。因為MATLAB裡面的矩陣處理都是以double進行的,使用uint8很容易發生資料溢位,以及矩陣運算資料格式不相容的情況。最可怕的是:在進行imread操作時,忘記轉成double型而沒有發現。這樣我們imwrite時不轉成uint8並不會感覺隱藏後的影象有什麼不對。但是在隱寫檢測的時候還是有一些細微的不同的。

2)隱寫分析實驗時

在進行隱寫分析分析試驗時很關鍵的一步是選樣本,選樣本的時候一定要保證從樣本池中選取樣本的隨機性。我們常用的BOSSbase v0.92BOSSbase 1.01中的影象庫均是來自於不同的相機,雖然說都經過統一的處理,但是多多少少不同的來源之間還是存在CSM (cover source mismatch)情況的。所以使用標準庫時我們的訓練集和測試集進行隨機選取可以儘量減少CSM的影響。下面是一段不重複抽樣的MATLAB程式碼很好用(此程式碼不是我寫的,忘了在哪下的了,還請作者見諒)

function s = sampling(R, n)
% 選擇抽樣,R為記錄集合,n為抽取的樣本數
% 演算法參考:D. E. Knuth, TAOCP, vol.2, pp142,稍有改動 % 編寫函式時用的測試資料 if ~nargin R = 1 : 8; n = 4; end N = length(R); t = 0; % 處理過的記錄總數 m = 0; % 已選得的記錄數 while 1 U = rand; if (N-t)*U < n-m m = m + 1; s(m) = R(t+1); % 若已抽取到足夠的記錄,則演算法終止 if m >= n, break, end end t = t + 1; end

注意:訓練集和測試集不要有重複的樣本。

3)stego樣本祕鑰相同
在我們進行試驗的時候經常會使用到批量隱寫以獲得大量的stego樣本。這時可能會出現一個問題:祕鑰相同。即程式碼中我們的祕鑰是一個一成不變的數字而不是一個和時間相關的隨機數,或者人為設定在變化的一個數。祕鑰相同對傳統基於統計的隱寫分析可能沒什麼影響,但是對於以深度學習(CNN)為基礎的隱寫分析在準確率會產生較大影響(一般祕鑰相同會使準確率上升)。
4)JPEG工具使用
jpeg_write和jpeg_read工具中不能含有中文路徑,否則無法使用。
持續更新,歡迎補充,讓我們共同學習。