簡單的影象資訊隱藏
1 背景介紹
1.1 影象型別
1.1.1 灰度影象
灰度影象是包含灰度級(亮度)的影象。在MATLAB中,灰度影象由一個uint8,uint16或雙精度型別的陣列來描述。灰度影象實際上是一個數據矩陣 I ,該矩陣的每一個元素對應於影象的一個畫素點,元素的值代表一定範圍內的灰度級。通常0代表黑色,對於二值影象,1代表白色,對於儲存型別可用uint8描述的影象,255代表白色。
1.1.2 RGB影象
所謂RGB影象僅是一類影象的總稱,這類影象不使用單獨的調色盤,每一個畫素的顏色由儲存在相應位置上的紅、綠、藍分量共同決定。RGB影象是24點陣圖像,紅、綠、藍分量分別佔用8位,理論上可以包含16M種不同顏色,由於這種顏色精度能夠再現影象的真實色彩,所以又稱RGB影象為真彩圖像。
在MATLAB中,一副RGB影象由一個uint8,uint16或雙精度型別的 m*n*3 陣列(通常稱為RGB陣列)來描述,其中,m和n分別表示影象的高度和寬度。
在一個雙精度型別的RGB陣列中,每一個顏色分量都是一個[0,1]範圍內的數值,(0,0,0)顯示為黑色,(1,1,1)顯示為白色。
1.1.3 其他影象
除了前面說的灰度影象、RGB影象,還有二值影象(可以理解為只有黑白兩個灰度的影象)、索引影象(畫素值直接作為RGB調色盤下標的影象)等,這裡不再展開。
1.2 偽裝技術
將祕密資訊隱藏在不易被人懷疑的普通檔案中,使祕密資訊不易被人發現。通常與加密技術結合使用,保證訊息傳輸的安全性。
2 直接4bit替換法
2.1 實驗原理
所謂直接4bit替換法,就是直接用祕密影象畫素的高4bit去替換載體影象畫素值的低4bit。我們將woman作為載體,cow作為祕密資訊進行資訊隱藏。在不加嚴格分析的前提下,我們可以認為將woman影象各畫素的低4bit清0後無感官上的差異,故可以認為影象的低4bit是“冗餘”位。
2.2 MATLAB程式碼
% 函式功能:直接將祕密影象的高4bit隱藏在RGB載體影象的R,G,B層中所選的那一層的低4bit, % 並將祕密影象提取出來,最後顯示。要求載體影象的大小大於等於祕密影象的大小, % 且祕密影象是二值或灰度影象 % 輸入格式: % data = % imagehide('C:\Users\79052\Desktop\woman.bmp','C:\Users\79052\Desktop\cow.bmp','C:\Users\79052\Desktop\mix.bmp','bmp',3); % (路徑和圖片名稱僅供參考,對於bmp檔案24點陣圖來說,色彩資訊的儲存順序是BGR) % 引數說明: % cover: 載體影象的地址 % message: 祕密影象的地址v % goleimage: 隱藏後圖像的地址 % permission: 影象的型別 % level: 作為載體的具體層,R為1,G為2,B為3 % data: 隱藏後圖像的矩陣 function data = imagehide(cover, message, goleimage, permission, level) % 提取影象資訊並分層 cov = imread(cover, permission); data = cov; msg = imread(message); [row, col] = size(cov); cover1 = cov(:,:,level); % 置載體影象R層的低4bit為0 for i = 1:row for j = 1:col/3 cover1(i,j) = bitand(cover1(i,j),240); % 240(10) = 11110000(2) end end % 置祕密影象的低4bit為0 takemsg4 = bitand(msg,240); % 將祕密影象的高4bit右移4位 shiftmsg4 = bitshift(takemsg4,-4); % 影象隱藏 for i = 1:row for j = 1:col/3 cover1(i,j) = bitor(cover1(i,j),shiftmsg4(i,j)); end end % 寫回儲存 data(:,:,level) = cover1; imwrite(data,goleimage); % 提取祕密影象資訊,檢測隱藏效果 data = imread(goleimage); [row,col] = size(data); A = data(:,:,level); for i = 1:row for j = 1:col/3 A(i,j) = bitand(A(i,j),15); end end A = bitshift(A,4); % 顯示結果 subplot(2,2,1),imshow(cov);title('載體影象'); subplot(2,2,2),imshow(message);title('祕密影象'); subplot(2,2,3),imshow(data);title('隱藏後的影象'); subplot(2,2,4),imshow(A);title('提取的祕密影象');
2.3 實驗結果
3 在LSB上的資訊隱祕
3.1實驗原理
LSB (Least Significant Bits) 即最不重要位,有時也稱為最低有效位或最低位。LSB所蘊含的訊號對於影象整體來說,是最低的和有效的。我們將這種訊號在一定意義上理解為是一種冗餘。這種冗餘,為我們有效地進行資訊隱藏提供了宿空間。
隱祕演算法的核心是將我們選取的畫素點的最不重要位依次替換成祕密訊息。
3.2 MATLAB程式碼
3.2.1 lsbhide.m
% 函式功能:本函式將完成在LSB上的順序資訊隱藏,載體選用灰度BMP圖
% 引數說明:
% input: 資訊隱藏載體影象,為灰度BMP圖
% file: 祕密訊息檔案
% output: 訊息隱祕後生成影象
% ste_cover: 資訊隱祕後圖像矩陣
% len_total: 祕密資訊的長度,即容量
% lsbhide('C:\Users\79052\Desktop\cow.bmp','C:\Users\79052\Desktop\message.txt','C:\Users\79052\Desktop\graph_with_message.bmp');
function [ste_cover,len_total] = lsbhide(input,file,output)
% 讀入影象矩陣
cover = imread(input);
ste_cover = cover;
ste_cover = double(ste_cover);
% 將文字檔案轉換為二進位制序列
f_id = fopen(file,'r');
[msg,len_total] = fread(f_id,'ubit1');
% 判斷嵌入訊息量是否過大
[m,n] = size(ste_cover);
if len_total > m*n
error('嵌入訊息量過大,請更換影象');
end
% p作為訊息嵌入位數計數器
p = 1;
for f2 = 1:n
for f1 = 1:m
ste_cover(f1,f2) = ste_cover(f1,f2) - mod(ste_cover(f1,f2),2) + msg(p,1);
if p == len_total
break;
end
p = p + 1;
end
if p == len_total
break;
end
end
ste_cover = uint8(ste_cover);
% 生成資訊隱祕後圖像
imwrite(ste_cover,output);
% 顯示實驗結果
subplot(1,2,1);imshow(cover);title('原始影象');
subplot(1,2,2);imshow(output);title('隱藏資訊的影象');
3.2.2 compare.m
% 函式功能:本函式完成顯示隱祕前後兩幅畫像的區別
% 輸入格式舉例: F = compare('blenna.bmp','scover.bmp')
% 引數說明:
% original: 原始載體影象
% hided: 隱祕後的影象
% F: 差值矩陣
% compare('C:\Users\79052\Desktop\cow.bmp','C:\Users\79052\Desktop\graph_with_message.bmp');
function F = compare(original,hided)
% 讀取原始載體影象矩陣
W = imread(original);
W = double(W)/255;
% 讀取隱祕後圖像矩陣
E = imread(hided);
E = double(E)/255;
% 將兩影象矩陣相減,顯示效果
F = E - W; % 注意,Matlab中矩陣相減只支援double型
imshow(mat2gray(F))
3.2.3 lsbget.m
% 函式功能:本函式將完成提取隱祕於LSB上的祕密訊息
% 輸入格式舉例:result = lsbget('scover',56,'secret.txt')
% 引數說明:
% output: 資訊隱祕後的影象
% len_total: 祕密訊息的長度
% goalfile: 提取出的祕密訊息檔案
% result: 提取出的祕密訊息
% lsbget('C:\Users\79052\Desktop\graph_with_message.bmp',1776,'C:\Users\79052\Desktop\secret.txt');
function result = lsbget(output,len_total,goalfile)
ste_cover = imread(output);
ste_cover = double(ste_cover);
% 判斷嵌入訊息量是否過大
[m,n] = size(ste_cover);
frr = fopen(goalfile,'w');
% p作為訊息嵌入位計數器,將訊息序列寫回文字檔案
p = 1;
for f2 = 1:n
for f1 = 1:m
if bitand(ste_cover(f1,f2),1) == 1
fwrite(frr,1,'ubit1');
result(p,1) = 1;
else
fwrite(frr,0,'ubit1');
result(p,1) = 0;
end
if p == len_total
break;
end
p = p + 1;
end
if p == len_total
break;
end
end
fclose(frr);
3.3 實驗結果
3.3.1 lsbhide執行結果
3.3.2 compare執行結果
3.3.3 lsbget結果
參考書目:資訊隱藏技術實驗教程/王麗娜,郭遲,葉登攀,李鵬編著. 武漢:武漢大學出版社,2012.9