LSB实现图片的信息隐写与提取

LSB介绍  

        LSB全称为 Least Significant Bit(最低有效位),是一种常被用做图片隐写的算法。LSB属于空域算法中的一种,是将信息嵌入到图像点中像素位的最低位,以保证嵌入的信息是不可见的(无法被肉眼察觉),但是由于使用了图像不重要的像素位,算法的鲁棒性差,水印信息很容易为滤波、图像量化、几何变形的操作破坏。

 原理示意图

        由图可见其像素值改变极小。

秘密信息:   101
242 \rightarrow2431111001011110011
213\rightarrow2121101010111010100
120\rightarrow1210111100001111001

隐藏代码

from skimage import io
import matplotlib.pyplot as plt

# 秘密信息编码
def encode(s):
    value = ''
    for c in s:
    #先将对应的字符转换为对应的ascll码然后通过bin方法将其转换为二进制的形式
        ascll = ord(c)
        bin_result = bin(ascll)
        bin_result = bin_result.replace('0b', '')
        bin_result = ''.join([i for i in ['0'] * (16 - len(bin_result))]) + bin_result
        value = value + bin_result
    return value

  # 信息隐藏
def hide():
    img = io.imread("./Test.jpg")
    width, height, c = img.shape
    # 此处仅仅利用了RGB三通道中的第一个通道像素值的最后一位,每个字符占用16位
    print("此图片可以隐藏:", width * height // 16, "个字符")
    message = input("请输入要隐藏的信息:")
    length = len(message)
    binLength = bin(length).replace('0b', '')
    binLength = ''.join(['0'] * (16 - len(binLength))) + binLength
    binMsg = encode(message)
    #将消息长度的16位二进制数与消息的二进制数进行连接
    binMsg = binLength + binMsg
    print(binMsg)
    total = len(binMsg)
    index = 0
    #隐藏
    for i in range(width):
        for j in range(height):
            #只将消息的一个比特位与RGB三通道的一个通道的像素最低位进行替换
            #求与操作可以将该通道对应的像素值的二进制数最低位置为0
            img[i, j, 0] = img[i, j, 0] & 254
            img[i, j, 0] = img[i, j, 0] + int(binMsg[index])
            index += 1
            if index >= total:
                break
        if index >= total:
            break
    #保存结果
    fname = "./result.png"  
    io.imsave(fname, img)
    print("图片已保存为" + fname)
    mod_img = io.imread(fname)
    # 构造对比图
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体
    plt.rcParams['axes.unicode_minus'] = False
    plt.subplot(121)
    plt.title("原始图像")
    plt.imshow(img)
    plt.subplot(122)
    plt.title("嵌有秘密信息的图像")
    plt.imshow(mod_img)
    plt.show()


if __name__ == '__main__':
    hide()

提取代码

from skimage import io
import matplotlib.pyplot as plt
# 消息解码
def decode(s,length):
    msg = ""
    s = [s[i:i + 16] for i in range(0, len(s), 16)]
    for ch in s:
        msg = msg + chr(int(ch,2))
    print(msg)

# 消息提取
def extract():
    img = io.imread("./result.png")
    width, height, c = img.shape
    msg = ""
    length = 0
    for i in range(width):
        for j in range(height):
            # 获取当前像素的最低位,将其添加到消息字符串中
            a = bin(int(img[i, j, 0]))[2:].zfill(8)
            msg += a[-1]
            # 如果已经提取了前16位,则解析出消息长度
            if len(msg) == 16:
                length = int(msg, 2)
            # 如果消息字符串的长度达到消息长度,则提取全部隐藏消息并解码
            if len(msg) == (length + 1) * 16:
                hidden_msg = msg[16:]
                decode(hidden_msg, length)
                break
        if len(msg) == (length + 1) * 16:
            break

if __name__ == '__main__':
    extract()


 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是使用Python实现LSB图像隐写的示例代码: ```python from PIL import Image # 将文本转换为二进制字符串 def text_to_binary(text): binary_str = ''.join(format(ord(char), '08b') for char in text) return binary_str # 将二进制字符串转换为文本 def binary_to_text(binary_str): text = ''.join(chr(int(binary_str[i:i+8], 2)) for i in range(0, len(binary_str), 8)) return text # 在像素值中嵌入二进制数据 def embed_data(pixel, data): binary_pixel = list(format(pixel, '08b')) for i in range(len(data)): binary_pixel[-1-i] = data[-1-i] binary_pixel_str = ''.join(binary_pixel) embedded_pixel = int(binary_pixel_str, 2) return embedded_pixel # 从像素值中提取二进制数据 def extract_data(pixel, num_bits): binary_pixel = list(format(pixel, '08b')) extracted_data = ''.join(binary_pixel[-num_bits:]) return extracted_data # 在图像中嵌入文本信息 def embed_text(image_path, text): image = Image.open(image_path) binary_text = text_to_binary(text) num_bits = len(binary_text) if num_bits > image.width * image.height * 3: raise ValueError("文本信息过长,无法嵌入!") pixels = list(image.getdata()) new_pixels = [] for pixel, bit in zip(pixels, binary_text): new_pixel = embed_data(pixel, bit) new_pixels.append(new_pixel) new_image = Image.new(image.mode, image.size) new_image.putdata(new_pixels) return new_image # 从图像中提取文本信息 def extract_text(image_path): image = Image.open(image_path) pixels = list(image.getdata()) num_bits = 8 extracted_data = [] for pixel in pixels: extracted_data.append(extract_data(pixel, num_bits)) binary_text = ''.join(extracted_data) text = binary_to_text(binary_text) return text ``` 在上面的代码中,我们使用了Pillow库来处理图像。在`embed_data`函数中,我们将二进制数据嵌入到像素值中。在`extract_data`函数中,我们从像素值中提取嵌入的二进制数据。在`embed_text`函数中,我们将文本信息嵌入到图像中。在`extract_text`函数中,我们从图像中提取嵌入的文本信息。 下面是一个使用LSB图像隐写的示例: ```python # 嵌入文本信息到图像中 image_path = "image.png" text = "这是一个秘密信息!" new_image = embed_text(image_path, text) new_image.save("new_image.png") # 从图像中提取文本信息 extracted_text = extract_text("new_image.png") print(extracted_text) ``` 在上面的示例中,我们将文本信息嵌入到名为`image.png`的图像中,并将嵌入文本信息的新图像保存为`new_image.png`。然后,我们从`new_image.png`中提取嵌入的文本信息,并打印出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值