LSB圖像信息隱藏實驗(附源代碼)

一、【實驗目的】

1.掌握對圖像的基本操作。

2.能夠用 LSB 算法對圖像進行信息隱藏

3.能夠用 LSB 提取算法提取隱藏進圖像的信息

4.能夠反映 jpeg 壓縮率與誤碼率之間的關係

二、【實驗環境】
Win7系統 Matlab軟件

三、【實驗過程】

實驗算法 1:LSB 嵌入

1.讀取一副 256*256 大小的圖片,判斷是否爲 RGB 圖像。若爲 RGB 圖像,則讀取圖像的一層信息(如 R 層)。

通過讀取圖像的尺寸大小來判斷是否爲RGB圖像。RGB圖像是三維多彩圖,size有3個參數,最小參數是3,只要判斷讀取到的圖像大小大於2,就確定讀入的是RBG圖像

image=imread('1.jpg');
mysize=size(image);
if numel(mysize)>2
   ['the photo is a rgb style photo'] %是rgb圖像輸出到命令行窗口
image1=Hide_image(:,:,1);
%第三個參數 1代表的讀取的是紅層,但是沒有將2,3層設爲0,因爲會疊加,所以顯示出來的第一層圖像還是灰色的

2.以二進制形式讀取要嵌入到圖片裏的消息。並讀取消息的長度(嵌入消息的長度不能超過圖像位數)。

message=fopen('message.txt','r');
[msg,msg_len]=fread(message,'ubit1') %按位以二進制形式讀取文本內容與長度
[m,n]=size(image1)  %讀取bin_iamge1的行和列
Msg就是二進制的文本內容,msg_len就是二進制長度

3.產生與消息長度一致的一串隨機數(不能相同)。

自定義一個randinterval函數來實現僞隨機數的生成
產生的僞隨機數是代表消息要隱藏的像素位置(行和列的信息)

%function[row,col]=randinterval(matric,count,key)
% 三個參數說明
% matrice爲載體矩陣,即要隱藏信息的圖層
% count爲要嵌入信息的像素數量
% key爲祕鑰,隨機數種子,自己設定
[row,col]=randinterval(image1,msg_len,1996);

4.按照產生的隨機數的序列依次將圖片層的最後一位改爲消息的信息。即用消息替換圖片的最後一位信息。

for i=1:msg_len
    image1(row(i),col(i))=image1(row(i),col(i))-mod(image1(row(i),col(i)),2)+msg(p,1);
    if p==msg_len
        break;
    end ;
    p=p+1;
End

最後一位對圖片的影響最小,幾乎是肉眼無法識別的。如果是最高位,那麼圖片就會發生明顯的改變

5.嵌入完成後,如果爲 RGB 則將該層返回原圖像。然後將數據信息寫回圖像。LSB 就完成了。

%還原圖像,就是把嵌入隱藏信息的紅層賦值給原圖像的紅層
Hide_image(:,:,1)=image1;
Hide_image=uint8(Hide_image);
imwrite(Hide_image,'Hide_image.tif');
%輸出隱藏信息的圖像
subplot(121);imshow(image);title('未嵌入信息的圖片');
subplot(122);imshow(Hide_image);title('嵌入信息的圖片');

LSB完成後,對比隱藏信息嵌入前後的圖片:

結論:可以發現,嵌入信息前後,圖片並沒有發生肉眼可見的任何改

變,說明該LSB信息隱藏是比較成功的。

————————————————-

實驗算法 2:讀取 LSB 隱藏的信息

1.讀取已經隱藏信息的圖像。如果爲 RGB 圖像,則讀取圖像的一層(該層爲嵌入信息的那層)。

2.用與 LSB 算法中相同的隨機數種子產生相同的一串隨機數。隨機數串的長度由 LSB 中獲得(長度不得大於圖像大小)。

用同一個僞隨機生成算法,相同的種子,來產生像素點位置,可以確保隱藏時和提取時位置順序是一模一樣的,在順序讀取這些位置上的數據(利用與運算,與上1,任何數與上1還是本身的性質),就是隱藏的信息。
[row,col]=randinterval(Picture_R,msg_len,1996);

3.按照產生的隨機數序列依次讀取圖像的相應點最後一位的信息。並將其以二進制形式寫到文件中。

for i=1:msg_len
    if bitand(Picture_R(row(i),col(i)),1)==1 %按位與運算
        fwrite(frr,1,'ubit1');
        result(p,1)=1;
    else
        fwrite(frr,0,'ubit1');
        result(p,1)=0;
    end
    if p==msg_len
        break;
    end
        p=p+1;
end
%fwrite函數的作用是將內存中的二進制數據原樣寫入文件中
%是ubit後面的數字表示是一次讀幾位,中間的數據表示讀幾次。

Ubit1就代表每次讀取1位,寫入文件,每8位識別一個ASCII碼值。所以可以成功寫入26個字母和數字。其他字符由於文本文檔識別不了,所以寫入文本之後都變成了亂碼。

4.看文件,即獲取的信息,與嵌入的信息進行比較。

Message.txt是原始信息文檔,txt是提取出來的信息文檔,可以發現

二者信息內容是一模一樣的,說明隱藏信息提取是成功的。

這裏寫圖片描述


實驗算法 3: JPEG 壓縮率與誤碼率之間的關係

1.讀取已經隱藏信息的圖像。

fp=imread(‘Hide_image.tif’);

2.使用 imwrite 函數對圖像進行壓縮,設定壓縮比例。

imwrite(fp,’out.jpg’,’quality’,compressibility)
Compressiblity是圖像的質量因子,可設置在0-100範圍內;

3.如果爲 RGB 圖像,則讀取嵌有信息的一層。按照讀取 LSB 隱藏信息算法的步驟,讀取 信息,不寫入文件。
out=imread('out.jpg');
if size(fp)>2
outr=out(:,:,1);
[m,n]=size(outr);
msg_len=184;
p=1;
[row,col]=randinterval(outr,msg_len,1996);
for i=1:msg_len
if bitand(outr(row(i),col(i)),1)==1 %按位與運算
result(p,1)=1;
else
result(p,1)=0;
end
if p==msg_len
break;
end
p=p+1;
end

4.讀取原文件,即隱藏的信息,以二進制讀取。並取得消息長度。

message=fopen(‘message.txt’,’r’);
[msg,msg_len]=fread(message,’ubit1’)
%按位以二進制形式讀取文本內容與長度

5.比較取得的信息和原信息的每一位,記錄不相等位數的個數。
bit_error=find(result~=msg); %尋找不相等的位置
bit_error_count=size(bit_error,1); %統計不相等的個數

6.用不相等個數除以總長度即可得到誤碼率ber。
ber(compressibility/10)=bit_error_count/msg_len;

7.改變壓縮率。得到一組誤碼率關於壓縮率的函數。

在開始時,設置9次循環,壓縮圖片的質量因子compressibility從10開始增加,每次遞增10,直到compressibility=100,記錄下每次的誤碼率,用plot函數做出關於以質量因子爲橫座標,誤碼率爲縱座標的圖表。
for compressibility=10:10:100 %九次不同壓縮率的圖片壓縮
fp=imread(‘Hide_image.tif’);
imwrite(fp,’out.jpg’,’quality’,compressibility)

% plot參數說明:
% 參數1是橫座標自變量,參數2是縱座標自變量,參數3是指用說明形式描點,參數4和5代表把散點鏈接起來
compressibility=10:10:100;
plot(compressibility,ber,’*’,compressibility,ber);
title(‘基於圖片壓縮質量因子的誤碼率圖表’);
實驗結果:
這裏寫圖片描述

結論:LSB算法抗JPEG壓縮能力很弱,即使只是進行微壓,誤碼率也能高達0.5極其以上。

四、【實驗日誌】
1.當文本文檔的寫入方式爲bit時,電腦會向文本文檔中寫入數據,但是打開時會顯示一片空白。
這裏寫圖片描述

改成ubit 後,就可以正常顯示了。
這裏寫圖片描述
2.在圖片壓縮算法中,剛開始沒有在plot輸出圖像函數前加上壓縮騙徒質量因子的數組,所以輸出圖像只有一個壓縮率,但是對應很多個誤碼率。
這裏寫圖片描述

上圖說明我的壓縮圖片質量因子只讀取了最後一個質量因子,所以在輸出圖像的時候,應該再增加一個質量因子的數組。
compressibility=10:10:100;

然後就可以輸出正確的對應點。如下圖:

這裏寫圖片描述

3.當輸入的文本信息是非法字符時(即除了26個字母和數字外),提取出來的文件信息會是亂碼!

這裏寫圖片描述

五、【實驗小結】

經過這次實驗操作,對matlab詞法分析有了更深的瞭解,開始熟練使用matlab的一些關於圖片處理的方法和函數

列表內容

,對LSB有了更加深入地理解和認識,能夠通過代碼來實現具體操作。對於各種錯誤,也稍微直到解決的辦法。

LSB優點:
① 算法簡單,便於實現,計算速度快;
② 在基礎算法上能很快的進行改進,並在脆弱水印中廣泛應用;
③ 由於能在最低有效位進行嵌入,所以對於圖像影響很小,幾乎無法用肉眼識別;

LSB缺點:
① 嵌入消息較大似乎,耗時長;
② 只能處理簡單的流格式的文件;
③ 爲滿足水印的不可見性,允許嵌入的水印強度較低,對於空域的各種操作較敏感;
④ 基本的LSB抗JPEG壓縮能力差;
⑤ 魯棒性差;

附源碼:
1.信息隱藏

image=imread(‘1.jpg’);
Hide_image=image;
Hide_image=double(Hide_image);
mysize=size(image);
if numel(mysize)>2
[‘the photo is a rgb style photo’] %是rgb圖像輸出到命令行窗口
image1=Hide_image(:,:,1);
message=fopen(‘message.txt’,’r’);
[msg,msg_len]=fread(message,’ubit1’) %按位以二進制形式讀取文本內容與長度
[m,n]=size(image1) %讀取bin_iamge1的行和列

p=1; %p爲祕密信息的位計數器
[row,col]=randinterval(image1,msg_len,1996);

for i=1:msg_len
image1(row(i),col(i))=image1(row(i),col(i))-mod(image1(row(i),col(i)),2)+msg(p,1);
if p==msg_len
break;
end ;
p=p+1;
end

%還原圖像
Hide_image(:,:,1)=image1;
Hide_image=uint8(Hide_image);
imwrite(Hide_image,’Hide_image.tif’);
%輸出隱藏信息的圖像
subplot(121);imshow(image);title(‘未嵌入信息的圖片’);
subplot(122);imshow(Hide_image);title(‘嵌入信息的圖片’);

else [‘the photo is not a rgb style’]
fclose(‘all’);
end

2.隱藏信息提取
%功能:用來提取隱藏信息
Picture=imread(‘Hide_image.tif’);
Picture=double(Picture);
Picture_R=Picture(:,:,1);
[m,n]=size(Picture_R);
frr=fopen(‘txt’,’w’); %以寫入方式打開只寫文件
msg_len=184;
p=1;
[row,col]=randinterval(Picture_R,msg_len,1996);
for i=1:msg_len
if bitand(Picture_R(row(i),col(i)),1)==1 %按位與運算
fwrite(frr,1,’ubit1’);
result(p,1)=1;
else
fwrite(frr,0,’ubit1’);
result(p,1)=0;
end
if p==msg_len
break;
end
p=p+1;
end
fclose(frr);
%fwrite函數的作用是將內存中的二進制數據原樣寫入文件中
%是ubit後面的數字表示是一次讀幾位,中間的數據表示讀幾次。

3.基於圖片壓縮率的誤碼率關係
close all;
clc;

for compressibility=10:10:100
fp=imread(‘Hide_image.tif’);
imwrite(fp,’out.jpg’,’quality’,compressibility)
out=imread(‘out.jpg’);
out=double(out);
if size(fp)>2
outr=out(:,:,1);
[m,n]=size(outr);
msg_len=184;
p=1;
[row,col]=randinterval(outr,msg_len,1996);
for i=1:msg_len
if bitand(outr(row(i),col(i)),1)==1 %按位與運算
result(p,1)=1;
else
result(p,1)=0;
end
if p==msg_len
break;
end
p=p+1;
end
message=fopen(‘message.txt’,’r’);
[msg,msg_len]=fread(message,’ubit1’) %按位以二進制形式讀取文本內容與長度

bit_error=find(result~=msg); %尋找不相等的位置
bit_error_count=size(bit_error,1); %統計不相等的個數
ber(compressibility/10)=bit_error_count/msg_len;

end
end

% plot參數說明:
% 參數1是橫座標自變量,參數2是縱座標自變量,參數3是指用說明形式描點,參數4和5代表把散點鏈接起來
compressibility=10:10:100;
plot(compressibility,ber,’*’,compressibility,ber);
title(‘基於圖片壓縮質量因子的誤碼率圖表’);

發佈了20 篇原創文章 · 獲贊 41 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章