python图像隐写技术_Python图像处理 —— 空域信息隐藏(LSB替换)

import numpy as np

import cv2

def encode(s, width=8):

bin_str = ''.join([(bin(c).replace('0b', '')).zfill(width) for c in s.encode(encoding="utf-8")])

return bin_str

def decode(s):

s = [np.uint8(c) for c in s]

bin_str = ''.join([bin(b & 1).strip('0b').zfill(1) for b in s])

str = np.zeros(np.int(len(s) / 8)).astype(np.int)

for i in range(0, len(str)):

str[i] = int('0b' + bin_str[(8 * i):(8 * (i + 1))], 2)

return bytes(str.astype(np.int8)).decode()

def lsb_embed(img, s):

if len(img.shape) == 3:

# 获取通道数F

width, height, channel = img.shape

s = encode(s)

for i in range(len(s)):

x = i // width

y = i % width

channel = i // (height * width)

value = img[x, y, channel]

if (value % 2) == int(s[i]):

pass

if (value % 2) > int(s[i]):

img[x, y, channel] = value - 1

if (value % 2) < int(s[i]):

img[x, y, channel] = value + 1

else:

width, height = img.shape

s = encode(s)

for i in range(len(s)):

x = i // width

y = i % width

value = img[x, y]

if (value % 2) == int(s[i]):

pass

if (value % 2) > int(s[i]):

img[x, y] = value - 1

if (value % 2) < int(s[i]):

img[x, y] = value + 1

return img, len(s)

def lsb_extract(img, num):

if len(img.shape) == 3:

# 获取通道数F

width, height, channel = img.shape

s = ''

for i in range(num):

x = i // width

y = i % width

channel = i // (height * width)

value = img[x, y, channel]

if value % 2 == 0:

s += '0'

else:

s += '1'

else:

width, height = img.shape

s = ''

for i in range(num):

x = i // width

y = i % width

value = img[x, y]

if value % 2 == 0:

s += '0'

else:

s += '1'

return decode(s)

if __name__ == '__main__':

# 嵌入

msg = "hello world"

pic_origin = cv2.imread('lenna.bmp')

pic_embed, msg_len = lsb_embed(pic_origin, msg)

cv2.imwrite('pic_embed.bmp', pic_embed)

# 提取

pic_embed = cv2.imread('pic_embed.bmp')

msg_extract = lsb_extract(pic_embed, msg_len)

print(msg_extract)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值