Python 使用 PIL(LSB) 进行图像处理
Python image manipulation using PIL(LSB)
我最近开始研究隐写术,但遇到了一个我似乎不明白的问题。基本上,图像是一个 png,其中包含一个隐藏的标志。
当您从图像中提取位平面时,您可以看到蓝色和绿色平面中有一个图像,您可以在红色平面中看到该图像。要以明文形式显示标志,您必须通过对 LSB 或其他方式进行异或运算,从红色图像中删除这些图像。我不太确定。
如果不删除其他图像,这就是红色平面中的图像的样子。
我的问题是我该如何着手做这种事情?这是有问题的图像。
其实隐藏图像在最低3位平面。进行完整的位分解可以清楚地说明这一点。
首先将图像加载到一个 numpy 数组,其尺寸为 MxNx3。
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
img = Image.open('stego.png')
data = np.array(img)
您现在要做的就是将每个颜色平面与另一个颜色平面进行异或,然后保留 3 个最低有效位 (lsb)。
extracted = (data[...,0] ^ data[...,1] ^ data[...,2]) & 0x07
plt.imshow(extracted)
plt.show()
为了不明显,& 0x07
部分是与二进制数00000111的AND运算,为简洁起见,只写成十六进制。
如果您没有保留全部 3 个 lsb,那么您要么会在解决方案中丢失一些字母,要么一切都会在那里,但有些边缘不会那么光滑。其中第一个非常重要。
我最近开始研究隐写术,但遇到了一个我似乎不明白的问题。基本上,图像是一个 png,其中包含一个隐藏的标志。
当您从图像中提取位平面时,您可以看到蓝色和绿色平面中有一个图像,您可以在红色平面中看到该图像。要以明文形式显示标志,您必须通过对 LSB 或其他方式进行异或运算,从红色图像中删除这些图像。我不太确定。
如果不删除其他图像,这就是红色平面中的图像的样子。
我的问题是我该如何着手做这种事情?这是有问题的图像。
其实隐藏图像在最低3位平面。进行完整的位分解可以清楚地说明这一点。
首先将图像加载到一个 numpy 数组,其尺寸为 MxNx3。
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
img = Image.open('stego.png')
data = np.array(img)
您现在要做的就是将每个颜色平面与另一个颜色平面进行异或,然后保留 3 个最低有效位 (lsb)。
extracted = (data[...,0] ^ data[...,1] ^ data[...,2]) & 0x07
plt.imshow(extracted)
plt.show()
为了不明显,& 0x07
部分是与二进制数00000111的AND运算,为简洁起见,只写成十六进制。
如果您没有保留全部 3 个 lsb,那么您要么会在解决方案中丢失一些字母,要么一切都会在那里,但有些边缘不会那么光滑。其中第一个非常重要。