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

一.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 2i<==>2i+1

(2)令 h k h_{k} hk表示图像中像素值为k的点的数量,根据(1)可推导得

h 2 i ∗ = h 2 i + h 2 i + 1 2 h_{2i*}=\frac{h_{2i}+h_{2i+1}}{2} h2i=2h2i+h2i+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=1kh2i(h2ih2i)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=122k1Γ(2k1)10rexp(2t)t(2k11)dt

(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分析

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值