LSB图像信息隐藏(实现及分析)

  • Post author:
  • Post category:其他


一.LSB图像信息隐藏(python实现)

1.实验目的

将信息图片存入载体图片,并从载体图片中提取出信息图片。具体操作为将信息图片的信息写入载体图片的最低位层(载体图片至少应为信息图片8倍)。

2.实验原理

(1) 图像

  • 灰度图:使用一个0(全黑)~255(全白)的数字表示一个像素点的灰度等级。

  • RGB图像:由三个通道组成,每个像素点上由一组数据【B(蓝色) G(绿色) R(红色)】表示,同样的表示单一颜色通道的值取值范围也为0~255。

(2)位深度:以灰度图为例,每一个像素点上有一个8位二进制串表示灰度值,灰度层的位深度就为8。

(3)位层:以灰度图为例,每个像素点的每一位组成一个位层,如每个像素点的最低位组成最低位层,而本实验就是基于

改变最低位层不会使图片产生肉眼可见的变化

3.实验内容

  1. python下可以使用matplotlib、PIL、opencv来进行图像处理,本实验使用opencv进行操作。

    首先读取载体图片和信息图片。

    import cv2 as cv
    import numpy as np
    #0 表示读取灰度图
    iM = cv.imread('lena.bmp',0) #载体图片
    iN = cv.imread('hide.bmp',0) #信息图片,更换为本地路径
    #获取图片的宽度和高度
    MH=iM.shape[0]
    MK=iM.shape[1]
    NH=iN.shape[0]
    NK=iN.shape[1]
    
  2. 隐藏函数:将信息图片的每一位信息写入载体图片

    def putinfo():
        Mx=0
        My=0
    #循环遍历信息图片的每一位信息    
        for i in range(0,NH):
            for j in range(0,NK):       #信息图片像素点移动
                for t in range(0,8):
                    tk=iN[i][j]%2;	
                    iN[i][j]=np.floor(iN[i][j]/2)
                    iM[Mx][My]= (iM[Mx][My]&254) + (tk) #将信息填入载体图片(Mx,My)这一像素点的最后一位
                    My=My+1              #载体图片像素点移动
                    if My==MK :
                        My=0
                        Mx=Mx+1
        cv.imwrite('lena_put.bmp', iM)  #保存写有信息的图片
    
  3. 提取函数:从写有隐藏信息的载题图片中提取出信息图片

    def getinfo():
        Mx=0
        My=0
        for i in range(0,NH):
            for j in range(0,NK):   #信息图片像素点移动
                tk=0
                for t in range(0,8):    #提取当前像素点的8个位信息
                    tk=tk+((iM[Mx][My]%2)<<t)
                    My=My+1         #载体图片像素点移动
                    if My==MK :     
                        My=0
                        Mx=Mx+1
                iN[i][j]=tk
        cv.imwrite('info_get.bmp', iN)  #保存提取出来的信息图片
    

4.实验结果

图片肉眼下无差别,大小未改变

在这里插入图片描述

二.分析LSB隐写

1.卡方分析

(1)在LSB隐写中,只存在最低位上1->0(-1),0->1(+1)两种翻转,即对于一个像素点2i要么变成2i+1要么不变,对于一个像素点2i+1要么变成2i要么不变。





2

i

<

=

=

>

2

i

+

1

2i<==>2i+1






2


i




<






=






=






>








2


i




+








1




(2)令



h

k

h_{k}







h











k






















表示图像中像素值为k的点的数量,根据(1)可推导得





h

2

i

=

h

2

i

+

h

2

i

+

1

2

h_{2i*}=\frac{h_{2i}+h_{2i+1}}{2}







h











2


i
























=




















2

















h











2


i



















+



h











2


i


+


1








































在隐写前后值不改变,但二者之间的具体数量会发生改变,怎么变取决于写入的秘密信息,卡方分析认为秘密信息中每个点像素点为2i或者2i+1的概率都是0.5。(这个分布完全取决于写入的秘密信息,在实际中和这个概率出入较大)

下图”lena_put”是加入秘密信息后的载体图片,”lena”是原始载体图片,明显看出2i+1比例激增。

在这里插入图片描述

(3)卡方分析中有如下两个公式,P即载体图像含有秘密信息的可能性





r

=

Σ

i

=

1

k

(

h

2

i

h

2

i

)

2

h

2

i

r=\Sigma_{i=1}^k\frac{(h_{2i}-h_{2i*})^2}{h_{2i*}}






r




=









Σ











i


=


1









k






























h











2


i


































(



h











2


i



























h











2


i























)










2


































P

=

1

1

2

k

1

2

Γ

(

k

1

2

)

0

r

e

x

p

(

t

2

)

t

(

k

1

2

1

)

d

t

P=1-\frac{1}{2^{\frac{k-1}{2}}\Gamma(\frac{k-1}{2})}\int_0^rexp(-\frac{t}{2})t^(\frac{k-1}{2}-1)dt






P




=








1

























2























2
















k





1





























Γ


(














2
















k





1





















)














1


































0








r




















e


x


p


(
















2














t




















)



t










(




















2














k









1































1


)


d


t





(4)代码实现

  • 直方图实现(python)

    #回值像素点个数关于像素值的直方图
    def myplot(pImg,tname):
        H = pImg.shape[0]
        K = pImg.shape[1]
        count={}
        x=[]
        for i in range(100,121):        #设置统计区域
            x.append(i)
            count[i]=0
        for i in range(0,H):           #逐个像素点统计   
            for j in range(0,K):
                if(pImg[i][j] in count):
                        count[pImg[i][j]]=count[pImg[i][j]]+1
        y=list(count.values())
        plt.bar(x = x,height = y,width = 0.5,align="center",yerr=0.000001)
        plt.title(tname)
        plt.show()
    
    iclean = cv.imread('..\img\lena.bmp', 0)  # 载体图片
    myplot(iclean,'lena')
    
  • 卡方分析计算概率(此处matlab代码来源网络,未找到最早出处)

    x=imread('lena.bmp');      %读入图片
    n=sum(hist(x,[0:255]),2);
    h2i=n([2:2:254]);
    h2is=(h2i+n([3:2:255]))/2;
    filter=(h2is~=0);  
    k=sum(filter);       
    idx=zeros(1,k);
    for i=1:127            
        if filter(i)==1
            idx(sum(filter(1:i)))=i;
        end
    end
    r=sum(((h2i(idx)-h2is(idx)).^2)./(h2is(idx)));
    p=1-chi2cdf(r,k-1);
    

2.RS分析



版权声明:本文为RedArvin原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。