我如何使用 python 将列表放入已知大小为 283*283 的二维数组中
howcan i put a list into 2d array with known size 283*283 using python
我想使用 LSB(最低有效位)将字符串(不可见水印)隐藏到图像 (283*283) 中
算法。用户给出隐藏消息(字符串),然后我将所有字符的 ascii 码(基数 2)放入列表中,现在我想让这个列表成为一个与我的图像大小相同的二维数组,然后我可以使用 '&' 和 '| '运算符。
import cv2 as cv
#read image:
img=cv.imread('C:/Users/pc/Desktop/cameraman.jpg',0)
cv.imshow("ax bedoon ramz",img)
cv.waitKey()
#make least significant bit of each pixel 0 :
img_r=img&0b11111110
img_w=img_r.copy()
#take message and make sure it can hide in 283*283 image :
while True:
txt=input('chi maikhay ghayem koni ? (max = 10000 character) : ')
if len(txt)>10000:
print('out of range characters ! ! ! ')
else :
break
#put characters ascii code in list :
ch_ascii_base2 = [bin(ord(i))[2:] for i in txt]
result=[]
for ch in ch_ascii_base2:
for val in ch:
result.append(bin(int(val))[2:])
将所有像素的所有 LSB 归零是没有意义的,因为如果你的秘密比你的图像大小小得多,你已经无缘无故地修改了剩余像素的 ~50%。
我会简单地获取消息的比特流,展平图像,然后将您的消息隐藏在适合消息的数组切片中。然后将其重塑回 2D。
string = 'Hello world'
# Getting the bits from each character with bitwise operations is better
# than using intermediate strings with `bin` or string formats
for byte in map(ord, string):
bits.extend((byte >> i) & 1 for i in range(7, -1, -1))
flat = img.flatten()
flat[:len(bits)] = (flat[:len(bits)] & 0xfe) | bits
stego = flat.reshape(img.shape)
如果图片是RGB,那么像素点的顺序是(0, 0, R), (0, 0, G), (0, 0, B), (0, 1, R),等等。如果您想首先将秘密嵌入,比如说,只嵌入蓝色通道,提取该颜色平面,通过上述过程嵌入尽可能多的位,然后移动到另一个通道。这有点复杂,但并不难。
如果您坚持将比特流转换为与您的图像大小相同的二维数组,只需计算您的图像有多少像素,您有多少位,然后将多少个 1 或 0 添加到您的比特流中。然后使用np.reshape()
。同样,如果结果是 3D 数组,则必须注意位的最终顺序。
总而言之,如果你不关心将你的秘密嵌入特定平面,请使用我建议的方法。它非常简短和清晰,不涉及对您的图像进行任何无关的计算或修改。
我想使用 LSB(最低有效位)将字符串(不可见水印)隐藏到图像 (283*283) 中 算法。用户给出隐藏消息(字符串),然后我将所有字符的 ascii 码(基数 2)放入列表中,现在我想让这个列表成为一个与我的图像大小相同的二维数组,然后我可以使用 '&' 和 '| '运算符。
import cv2 as cv
#read image:
img=cv.imread('C:/Users/pc/Desktop/cameraman.jpg',0)
cv.imshow("ax bedoon ramz",img)
cv.waitKey()
#make least significant bit of each pixel 0 :
img_r=img&0b11111110
img_w=img_r.copy()
#take message and make sure it can hide in 283*283 image :
while True:
txt=input('chi maikhay ghayem koni ? (max = 10000 character) : ')
if len(txt)>10000:
print('out of range characters ! ! ! ')
else :
break
#put characters ascii code in list :
ch_ascii_base2 = [bin(ord(i))[2:] for i in txt]
result=[]
for ch in ch_ascii_base2:
for val in ch:
result.append(bin(int(val))[2:])
将所有像素的所有 LSB 归零是没有意义的,因为如果你的秘密比你的图像大小小得多,你已经无缘无故地修改了剩余像素的 ~50%。
我会简单地获取消息的比特流,展平图像,然后将您的消息隐藏在适合消息的数组切片中。然后将其重塑回 2D。
string = 'Hello world'
# Getting the bits from each character with bitwise operations is better
# than using intermediate strings with `bin` or string formats
for byte in map(ord, string):
bits.extend((byte >> i) & 1 for i in range(7, -1, -1))
flat = img.flatten()
flat[:len(bits)] = (flat[:len(bits)] & 0xfe) | bits
stego = flat.reshape(img.shape)
如果图片是RGB,那么像素点的顺序是(0, 0, R), (0, 0, G), (0, 0, B), (0, 1, R),等等。如果您想首先将秘密嵌入,比如说,只嵌入蓝色通道,提取该颜色平面,通过上述过程嵌入尽可能多的位,然后移动到另一个通道。这有点复杂,但并不难。
如果您坚持将比特流转换为与您的图像大小相同的二维数组,只需计算您的图像有多少像素,您有多少位,然后将多少个 1 或 0 添加到您的比特流中。然后使用np.reshape()
。同样,如果结果是 3D 数组,则必须注意位的最终顺序。
总而言之,如果你不关心将你的秘密嵌入特定平面,请使用我建议的方法。它非常简短和清晰,不涉及对您的图像进行任何无关的计算或修改。