1 回答
TA贡献1848条经验 获得超6个赞
这是一个XY 问题。您不需要将像素转换为二进制或使用显式方法提取任何特定位,因为这样您就必须再次将其全部拼接起来。你可以直接用按位运算做你想做的事,因为“二进制”和十进制是同一个数字的两种表示。ANDs 和SHIFTs 的组合将允许您将整数的任何部分归零,或隔离特定范围的位
例如,
>> (107 >> 3) & 7
5
因为
Decimal: 107 >> 3 = 13 & 7 = 5
Binary : 01101011 >> 3 = 00001101 & 00000111 = 00000101
|-| |-|
we want
these 3
现在,假设您的信息是世界“你好”。您可以像这样方便地将每个字节分成四部分。
secret = b'hello'
bits = []
for byte in secret:
for i in range(6, -1, -2):
bits.append((byte >> i) & 3)
bits = np.array(bits)
由于每个bits元素包含两位,因此值的范围可以在 0 到 3 之间。如果您考虑二进制中的字母 'h',即 '01|10|10|00',您可以看到它的前几个值是bits如何1、2、2、0 等
为了利用 numpy 中的矢量化操作,我们应该展平我们的图像数组,我假设它的形状为 (height, width, 3)。
np.random.seed(0)
img = np.random.randint(0, 255, (1600, 1200, 3)).astype(np.uint8)
shape = img.shape
# this specific type of flattening puts the pixels in your desired order, i.e.,
# pixel (0, 0) red-green-blue, pixel (0, 1) red-green-blue, etc
flat_img = img.reshape(-1).copy()
现在嵌入很简单
length = len(bits)
flat_img[:length] = (flat_img[:length] & 252) + bits
stego_img = flat_img.reshape(shape)
添加回答
举报