LSB圖像信息隱藏


1.實驗目的

(1)了解信息隱藏中最常用的LSB算法特點,掌握LSB算法原理,設計並實現一種基於圖像的LSB隱藏算法
(2)了解如何通過峰值信噪比來對圖像質量進行客觀評價,並計算峰值信噪比

2.實驗內容

(1)LSB隱藏算法
(2)計算峰值信噪比

3.實驗原理

    任何多媒體信息,在數字化時,都會產生物理隨機噪聲,而人的感觀系統對這些隨機噪聲不敏感。替換技術就是利用這個原理,通過使用秘密信息比特替換隨機噪聲,從而完成信息隱藏目標。
    BMP灰度圖像的位平面,每個像素值為8bit二進制值,表示該點亮度。
    圖像高位平面對圖像感官質量起主要作用,去除圖像最低幾個位平面並不會造成畫面質量的明顯下降。利用這個原理可用秘密信息(或稱水印信息)替代載體圖像地位平面以實現信息嵌入。
    算法選用最低位平面來嵌入秘密信息。最低位平面對圖像的視覺效果影響最輕微,但很容易受噪聲影響和攻擊,解決辦法可采用冗余嵌入的方式來增強穩健性。即在一個區域(多個像素)中嵌入相同的信息,提取時根據該區域中的所有像素判斷。

4.實驗記錄

(1)隱藏算法

算法分為三個部分實現:

  • 隱藏算法
  • 提取算法
  • 測試腳本

1)隱藏算法

源代碼hide_lsb.m文件:

function o=hide_lsb(block,data,I)                           %block:隱藏的最小分塊大小  data:秘密信息  I:原始載體
si=size(I);
lend=length(data);
% 將圖像划分為M*N個小塊
N=floor(si(2)/block(2));
M=min(floor(si(1)/block(1)),ceil(lend/N));
o=I;
for i=0:M-1
    % 計算每小塊垂直方向起止位置
    rst=i*block(1)+1;
    red=(i+1)*block(1);
    for j=0:N-1
        % 計算每小塊隱藏的秘密信息的序號
        idx=i*N+j+1;
        if idx>lend
            break;
        end;
        % 取每小塊隱藏的秘密信息
        bit=data(idx);
        % 計算每小塊水平方向起止位置
        cst=j*block(2)+1;
        ced=(j+1)*block(2);
        % 將每小塊最低位平面替換為秘密信息
        o(rst:red,cst:ced)=bitset(o(rst:red,cst:ced),1,bit);
    end
end;

2)提取算法

源代碼dh_lsb.m文件:

function out=dh_lsb(block,I)            % block:隱藏的最小分塊大小    I:攜密載體
si=size(I);
% 將圖像划分為M*N個小塊
N=floor(si(2)/block(2));
M=floor(si(1)/block(1));
out=[];
% 計算比特1判決閾值:即每小塊半數以上元素隱藏的是比特1時,判決該小塊嵌入的信息為1
thr=ceil((block(1)*block(2)+1)/2);
idx=0;
for i=0:M-1
    % 計算每小塊垂直方向起止位置
    rst = i*block(1)+1;
    red=(i+1)*block(1);
    for j=0:N-1
        % 計算每小塊圖像隱藏的秘密信息序號
        idx=i*N+j+1;
        % 計算每小塊水平方向起止位置
        cst=j*block(2)+1;
        ced=(j+1)*block(2);
        % 提取小塊最低位平面,統計1比特個數,判決輸出秘密信息
        tmp=sum(sum(bitget(I(rst:red,cst:ced),1)));
        if(tmp>=thr)
            out(idx)=1;
        else
            out(idx)=0;
        end;
    end;
end;

3)測試腳本

源代碼test.m文件:

fid=1;
len=10;
% 隨機生成要隱藏的秘密信息
d=randsrc(1,len,[0,1]);
block=[3,3];
[fn,pn]=uigetfile({'*.bmp','bmp file(*.bmp)';},'選擇載體');
s=imread(strcat(pn,fn));
ss=size(s);
if(length(ss)>=3)
    I=rgb2gray(s);
else
    I=s;
end;
si=size(I);
sN=floor(si(1)/block(1))*floor(si(2)/block(2));
tN=length(d);
% 如果載體圖像尺寸不足以隱藏秘密信息,則在垂直方向上復制填充圖像
if sN<tN
    multiple=ceil(tN/sN);
    tmp=[];
    for i=1:multiple
        tmp=[tmp;I];
    end;
    I=tmp;
end;
% 調用隱藏算法,把攜密載體寫至硬盤
stegoed=hide_lsb(block,d,I);
imwrite(stegoed,'hide.bmp','bmp');
[fn,pn]=uigetfile({'*.bmp','bmp file(*.bmp)';},'選擇隱蔽載體');
y=imread(strcat(pn,fn));
sy=size(y);
if(length(sy)>=3)
    I=rgb2gray(y);
else
    I=y;
end;
% 調用提取算法,獲得秘密信息
out=dh_lsb(block,I);
% 計算誤碼率
len=min(length(d),length(out));
rate=sum(abs(out(1:len)-d(1:len)))/len;
y=1-rate;
fprintf(fid,'LSB:len:%d\t error rate:%f\t error num:%d\n',len,rate,len*rate);

通過運行測試代碼,對灰度圖xxx3.bmp文件進行LSB算法的信息隱藏,並生成文件bide.bmp。


圖1-1 運行測試腳本,選擇載體圖像xxx3.bmp

圖1-2 生成hide.bmp隱藏文件,並選擇該文件

圖1-3 產生結果

(2)計算峰值信噪比

1)峰值信噪比函數:

源代碼psnr.m文件:

function y = psnr(org ,stg)
y=0;
sorg=size(org);
sstg=size(stg);
if sorg~=sstg
    fprintf(1,'org and stg must have same size!\n');
end;
np=sum(sum((org-stg).^2));
y=10*log10(max(max(double((org.^2))*sorg(1)*sorg(2)/np)));

2)測試腳本

源代碼cs.m文件:

org=imread('xxx3.bmp');
stg=imread('hide.bmp');
fprintf(1,'psnr:%f\n',psnr(org,stg));

運行cs.m測試腳本文件,將隱藏信息前后的兩個圖像進行一個峰值信噪比檢測,產生結果。


圖2-1 運行cs.m測試腳本文件,產生結果

5.實驗結論與建議

    經過該次實驗,對LSB算法有了更清晰的認識與了解,並能夠編寫代碼對灰度圖進行隨機信息隱藏,同時也能夠通過計算峰值信噪比來對隱藏信息前后的兩張圖片進行檢測。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM