信息隐藏基础算法——LSB算法(python实现)

1,LSB算法原理

LSB(least significant bit)翻译过来为最低有效位。
在灰度图像中,图像的灰度由八位二进制来表示即十进制中0-255,共256级别,255则为白色,反之0为黑色。自然,二进制位越靠前则对像素点灰度的影响越大,从这点出发,则考虑更改像素点灰度值最低位来隐藏信息,这样对原图像的改变比较小。

实验要求:
1,针对具体的某一副图像实现LSB嵌入和提取
2,进行不可见性评价:利用PSNR与SSIM对嵌入秘密信息的图像进行质量评价
3,可以指定任意1bit位或者n个bit位实现水印嵌入

这里关于psnr(峰值信噪比)和ssim(结构相似性)的说明可以参考这个说明。这两个指标都是越大表示图像失真越少,网上也查找到大量的关于这两者的信息,这里不再做解释说明。

2,载体图片和待嵌入图像信息

选择一副大小为1000 * 1000的图像作为载体图像,通过预处理将载体图像转换为灰度图像,这里可以选择使用PIL库,或者matplotlib库等,方法比较多,也很简单,网络上可以轻易搜索到,也可以参考这个方法。得到载体图像carrier.png。
carrier.png
对秘密图像处理方法类似对载体图像处理方法。这里我们选择了一副大小为1000 * 1000的表情包作为秘密图像,这里我们对其进行预处理为二值图像,这里之所以需要二值化,是因为在LSB原理中说明的,该算法中是对图像二进制灰度值的最后一位来变换以隐藏信息,自然每个像素点的灰度值只可以隐藏1bit信息,所以需要对秘密图像进行二值化才可以嵌入。
关于图像二值化相关操作网络上也有很多种很简单的方法,也可以参考上面对载体图像灰度化的页面中的方法。处理后得到秘密信息的二值化图像watermark.png。watermark.png

3,代码

我们使用的python版本为3.7.4,需要使用到的库有PIL,numpy和skimage。
这里偷了个懒,通过查找,得知skimage库中有可以直接使用计算ssim的函数,所以就~~,嘻嘻~~
直接给出代码:

import numpy as np
from skimage.measure import compare_ssim

#计算psnr
def psnr(imag1,imag2):
    diff = imag1 - imag2
    #print(np.sum(diff))
    mse = np.mean(np.square(diff))
    psnr = 10 * np.log10(255 * 255 / mse)
    return(psnr)
#计算ssim
def ssim(imag1,imag2):
    (grayScore, diff) = compare_ssim(imag1, imag2, full=True)
    #diff = (diff * 255).astype("uint8")
    return grayScore

#读入载体图片和水印图片
Carrier = Image.open('carrier.png')
WaterMark = Image.open('watermark.png')
#确认需要隐藏在二进制位第几位
Layers = int(input('请输入要隐藏在第几层(0-7):'))

#将读入的图片转为array类型
Carrier_array = np.array(Carrier)
WaterMark_array = np.array(WaterMark)


a,b = WaterMark_array.shape 
a1,b1 = Carrier_array.shape

array1 = np.zeros((a,b),dtype='float32')
#构建水印大小数组,将载体同等大小位传入
for i in range(a):
    for j in range(b):
        array1[i][j] = Carrier_array[i][j]
#嵌入水印
for i in range(a):
    for j in range(b):
        w = Carrier_array[i][j] // (2**Layers)
        if w % 2 == 0 and WaterMark_array[i][j] == 1:
            Carrier_array[i][j] = Carrier_array[i][j] + (2**Layers)
        elif w % 2 == 1 and WaterMark_array[i][j] == 0:
            Carrier_array[i][j] = Carrier_array[i][j] - (2**Layers)
            
#构建水印大小数组,将嵌入水印后的载体的同等大小位传入
array2 = np.zeros((a,b),dtype='float32')       
for i in range(a):
    for j in range(b):
        array2[i][j] = Carrier_array[i][j]
       

#计算psnr
PSNR = psnr(array1,array2)
#PSNR = skimage.measure.compare_psnr(Carrier_array1, Carrier_array, 255)
print('峰值信噪比(PSNR)为:',PSNR)
#计算ssim
SSIM = ssim(array1,array2)
print('结构相似性(SSIM)为:',SSIM)


#展示嵌入水印后的图片   
I = Image.fromarray(Carrier_array)
I.show()      


#提取水印
a1,b1 = Carrier_array.shape
WaterMark_array1 = np.zeros((a1,b1),dtype='int8')
for i in range(a1):
    for j in range(b1):
        w = Carrier_array[i][j] // (2**Layers)
        if w % 2 == 1:
            WaterMark_array1[i][j] = 1

#将提取的水印图像输出
WaterMark_array1.dtype = 'bool'
#print(WaterMark_array1.shape)
I = Image.fromarray(WaterMark_array1)
I.show()  

4,结果展示

运行后首先选择需要隐藏在第几层,按照之前的说明,隐藏在最低位应该是效果最好的,所以首先试一下第0层。
在这里插入图片描述
结果如下:
在这里插入图片描述
分别得到嵌入后的图像和提取出来的秘密信息:

在这里插入图片描述
在这里插入图片描述
可以看到,嵌入后的图像和原始图像以肉眼看不出差异,并且psnr和ssim数值都在可接受范围内,说明,嵌入在最低位是可行的。

再来试一下嵌入到第4层,得到的结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里可以看到,嵌入后的图像相对原始图像发生了肉眼可见的改变,psnr和ssim指数也明显降低,说明嵌入在二进制灰度值的高位不可行。

5,存在的问题

1,由于示例图像数据量比较大(1000x1000和1600x2560),程序中多次采用
双层循环,导致程序运行缓慢。
2,对于psnr和ssim的计算,以载体图像大小计算由于未知原因计算不出来,采用新建数组,来截取载体中嵌入水印的大小来计算,并且未验证数值正确性。
(不过符合psnr和ssim规律,随插入bit位的升高,psnr和ssim均降低)

LSB是Least Significant Bit的缩写,是一种信息隐藏算法,用于在图像中隐藏秘密信息。LSB算法的原理是将秘密信息的每个比特位嵌入到载体图片的最低有效位(Least Significant Bit)中,因为对图像造成的影响最小,所以不易被察觉。 为了实现LSB算法,可以使用Python的PIL库(Python Imaging Library)来处理图像。可以编写一个Python脚本,使用PIL库中的函数来实现图像的读取、嵌入和提取操作。 具体步骤如下: 1. 导入PIL库和其他需要的库。 2. 定义嵌入函数和提取函数,函数的参数包括秘密信息的长度、载体图片的路径和提取文件的保存路径。 3. 打开载体图片,并获取图片的尺寸。 4. 遍历图片的每个像素点,依次从R、G、B三个颜色通道获取最低位的隐藏信息。将秘密信息的比特位嵌入到最低位中。 5. 当嵌入的比特位数量达到秘密信息的长度时,结束嵌入操作。 6. 将嵌入后的图片保存到指定路径。 7. 打开提取文件,将嵌入的秘密信息提取出来,以每8位为一组二进制转换为十进制数,并将十进制数视为ascii码,再转换为字符串写入到文件中。 8. 关闭文件。 以上是使用Python实现LSB算法的基本步骤。通过这种算法,可以将秘密信息嵌入到载体图片中,并能够提取出来。这种方法在信息隐藏和隐写领域有着广泛的应用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Python实现LSB隐写算法](https://blog.csdn.net/qq_26090065/article/details/82469266)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [信息隐藏基础算法——LSB算法python实现)](https://blog.csdn.net/ma_ling_shu/article/details/108371408)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值