【发布时间】:2017-06-28 12:36:13
【问题描述】:
我想提取图像的 RGB 值的最低有效位并将这些位转换为 ascii 等效位。问题是我在python中循环numpy矩阵的方法非常慢。使用 Java 采用相同的策略时,速度大约快 100 倍。图像大小不超过 1024 * 1024,因此生成的矩阵最大为 1024 * 1024 * 3。
根据 python 文档的 append 函数的时间复杂度为 O(1),我的循环为 O(n^2),其中 n
这个操作能以更有效的方式完成吗?
def extract_info_from_lsb(self, path):
lsb_message_result = []
matrix = self.image_to_matrix(path)
for row in matrix:
lsb_message_list = []
for pixel in row:
for color in pixel:
lsb = color & 1
lsb_message_list.append(lsb)
lsb_message_result.append(lsb_message_list)
for i, lsb_message in enumerate(lsb_message_result):
lsb_message_result[i] = self.text_from_bits(lsb_message)
return lsb_message_result
我采用的二进制转ascii的函数如下:
def text_from_bits(self, bits):
chars = []
for b in range(len(bits) / 8):
byte = bits[b * 8:(b + 1) * 8]
chars.append(chr(int(''.join([str(bit) for bit in byte]), 2)))
return ''.join(chars)
图像到矩阵的转换函数是:
def image_to_matrix(self, path):
image = Image.open(path)
matrix = np.array(image)
return matrix
【问题讨论】:
标签: python numpy steganography