一、【實驗目的】
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資訊隐藏是比較成功的。
————————————————-
實驗算法 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是提取出來的資訊文檔,可以發現
二者資訊内容是一模一樣的,說明隐藏資訊提取是成功的。
實驗算法 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(‘基于圖檔壓縮品質因子的誤碼率圖表’);