天天看點

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)>
   ['the photo is a rgb style photo'] %是rgb圖像輸出到指令行視窗
image1=Hide_image(:,:,);
%第三個參數 代表的讀取的是紅層,但是沒有将,層設為,因為會疊加,是以顯示出來的第一層圖像還是灰色的
           

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=:msg_len
    image1(row(i),col(i))=image1(row(i),col(i))-mod(image1(row(i),col(i)),)+msg(p,);
    if p==msg_len
        break;
    end ;
    p=p+;
End
           

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

5.嵌入完成後,如果為 RGB 則将該層傳回原圖像。然後将資料資訊寫回圖像。LSB 就完成了。

%還原圖像,就是把嵌入隐藏資訊的紅層指派給原圖像的紅層
Hide_image(:,:,)=image1;
Hide_image=uint8(Hide_image);
imwrite(Hide_image,'Hide_image.tif');
%輸出隐藏資訊的圖像
subplot();imshow(image);title('未嵌入資訊的圖檔');
subplot();imshow(Hide_image);title('嵌入資訊的圖檔');
           

LSB完成後,對比隐藏資訊嵌入前後的圖檔:

LSB圖像資訊隐藏實驗(附源代碼)

結論:可以發現,嵌入資訊前後,圖檔并沒有發生肉眼可見的任何改

變,說明該LSB資訊隐藏是比較成功的。

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

實驗算法 2:讀取 LSB 隐藏的資訊

1.讀取已經隐藏資訊的圖像。如果為 RGB 圖像,則讀取圖像的一層(該層為嵌入資訊的那層)。

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

用同一個僞随機生成算法,相同的種子,來産生像素點位置,可以確定隐藏時和提取時位置順序是一模一樣的,在順序讀取這些位置上的資料(利用與運算,與上1,任何數與上1還是本身的性質),就是隐藏的資訊。

[row,col]=randinterval(Picture_R,msg_len,1996);

3.按照産生的随機數序列依次讀取圖像的相應點最後一位的資訊。并将其以二進制形式寫到檔案中。

for i=:msg_len
    if bitand(Picture_R(row(i),col(i)),)== %按位與運算
        fwrite(frr,,'ubit1');
        result(p,)=;
    else
        fwrite(frr,,'ubit1');
        result(p,)=;
    end
    if p==msg_len
        break;
    end
        p=p+;
end
%fwrite函數的作用是将記憶體中的二進制資料原樣寫入檔案中
%是ubit後面的數字表示是一次讀幾位,中間的資料表示讀幾次。
           

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

4.看檔案,即擷取的資訊,與嵌入的資訊進行比較。

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

二者資訊内容是一模一樣的,說明隐藏資訊提取是成功的。

LSB圖像資訊隐藏實驗(附源代碼)

實驗算法 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圖像資訊隐藏實驗(附源代碼)

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

四、【實驗日志】

1.當文本文檔的寫入方式為bit時,電腦會向文本文檔中寫入資料,但是打開時會顯示一片空白。

LSB圖像資訊隐藏實驗(附源代碼)

改成ubit 後,就可以正常顯示了。

LSB圖像資訊隐藏實驗(附源代碼)

2.在圖檔壓縮算法中,剛開始沒有在plot輸出圖像函數前加上壓縮騙徒品質因子的數組,是以輸出圖像隻有一個壓縮率,但是對應很多個誤碼率。

LSB圖像資訊隐藏實驗(附源代碼)

上圖說明我的壓縮圖檔品質因子隻讀取了最後一個品質因子,是以在輸出圖像的時候,應該再增加一個品質因子的數組。

compressibility=10:10:100;

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

LSB圖像資訊隐藏實驗(附源代碼)

3.當輸入的文本資訊是非法字元時(即除了26個字母和數字外),提取出來的檔案資訊會是亂碼!

LSB圖像資訊隐藏實驗(附源代碼)

五、【實驗小結】

經過這次實驗操作,對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(‘基于圖檔壓縮品質因子的誤碼率圖表’);

繼續閱讀