На самом деле скрытое изображение находится в самых низких 3-битных плоскостях. Выполнение полной битовой декомпозиции проясняет это.
Начните с загрузки изображения в массив с массивами, который будет иметь размеры MxNx3.
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
img = Image.open('stego.png')
data = np.array(img)
Все, что вам нужно сделать сейчас, это XOR каждой цветовой плоскости с другой и затем сохранить 3 младших значащих бита (lsb).
extracted = (data[...,0] ^ data[...,1] ^ data[...,2]) & 0x07
plt.imshow(extracted)
plt.show()
В случае, если это не было очевидно, часть & 0x07
является операцией AND с двоичным числом 00000111, просто записанным в шестнадцатеричном формате для краткости.
Если вы не сохраните все 3 lsb,тогда вы либо пропустите некоторые буквы в решении, либо все будет там, но некоторые края будут не такими гладкими. Первый из них критически важен.