Обучаясь NumPy, я написал код, который делает LSB (стеганография) шифрования:Python присваивание NumPy массив Integer индексированный плоский срез
def str2bits_nparray(s):
return np.array(map(int, (''.join(map('{:07b}'.format, bytearray(s))))), dtype=np.bool)
def LSB_encode(img, msg, channel):
msg_bits = str2bits_nparray(msg)
xor_mask = np.zeros_like(img, dtype=np.bool)
xor_mask[:, :, channel].flat[:len(msg_bits)] = np.ones_like(msg_bits, dtype=np.bool)
img[xor_mask] = img[xor_mask] >> 1 << 1 | msg_bits
msg = 'A' * 1000
img_name = 'screenshot.png'
chnl = 2
img = imread(img_name)
LSB_encode(img, msg, chnl)
код работает отлично, но когда я пытаюсь сделал chnl = [2, 1]
этой линии:
xor_mask[:, :, channel].flat[:len(msg_bits)] = np.ones_like(msg_bits, dtype=np.bool)
оленья кожа значение Присвоить xor_mask
с
xor_mask[:, :,
[2, 1]].flat[:len(msg_bits)]
Есть ли способ исправить это?
I судимым раствора для цикла по каналам:
for ch in channel:
xor_mask[:, :, ch].flat[:len(msg_bits)] = np.ones_like(msg_bits, dtype=np.bool)
Но это делает не то, что я хочу от
xor_mask[:, :,
[2, 1]].flat[:len(msg_bits)] = np.ones_like(msg_bits, dtype=np.bool)