一.LSB图像信息隐藏(python实现)
1.实验目的
将信息图片存入载体图片,并从载体图片中提取出信息图片。具体操作为将信息图片的信息写入载体图片的最低位层(载体图片至少应为信息图片8倍)。
2.实验原理
(1) 图像
-
灰度图:使用一个0(全黑)~255(全白)的数字表示一个像素点的灰度等级。
-
RGB图像:由三个通道组成,每个像素点上由一组数据【B(蓝色) G(绿色) R(红色)】表示,同样的表示单一颜色通道的值取值范围也为0~255。
(2)位深度:以灰度图为例,每一个像素点上有一个8位二进制串表示灰度值,灰度层的位深度就为8。
(3)位层:以灰度图为例,每个像素点的每一位组成一个位层,如每个像素点的最低位组成最低位层,而本实验就是基于
改变最低位层不会使图片产生肉眼可见的变化
。
3.实验内容
-
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]
-
隐藏函数:将信息图片的每一位信息写入载体图片
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) #保存写有信息的图片
-
提取函数:从写有隐藏信息的载题图片中提取出信息图片
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分析