我正在编写一个脚本,使用PIL在python3中加密和解密图像。在这里,我将图像转换为numpy数组,然后将数组的每个元素乘以10。现在,我注意到PIL fromarray()中的默认函数将数组的每个元素转换为256的mod(如果大于256)。 255,因此当我尝试检索矩阵的原始值时,我没有得到原始值。例如,如果原始值为40,则其10倍为400,因此fromarray()将其设为400 mod 256,将得到144。现在,如果我将256加到144,我将得到400,然后除以10给我40。但是如果值是54,那么10times是540,而540 mod 256是28。现在要恢复原始值,我需要加256两次,这将给我540。540不是唯一的数字当我将其修改为256时给我28。所以我永远不知道何时一次添加256,何时两次添加256次以上。
此处提供代码:
from PIL import Image
from numpy import *
from pylab import *
#encryption
img1 = (Image.open('image.jpeg').convert('L'))
img1.show() #displaying the image
img = array(Image.open('image.jpeg').convert('L'))
a,b = img.shape
print(img)
print((a,b))
tup = a,b
for i in range (0, tup[0]):
for j in range (0, tup[1]):
img[i][j]= img[i][j]*10 #converting every element of the original array to its 10times
print(img)
imgOut = Image.fromarray(img)
imgOut.show()
imgOut.save('img.jpeg')
#decryption
img2 = (Image.open('img.jpeg'))
img2.show()
img3 = array(Image.open('img.jpeg'))
print(img3)
a1,b1 = img3.shape
print((a1,b1))
tup1 = a1,b1
for i1 in range (0, tup1[0]):
for j1 in range (0, tup1[1]):
img3[i1][j1]= ((img3[i1][j1])/10) #reverse of encryption
print(img3)
imgOut1 = Image.fromarray(img3)
imgOut1.show()
现在作为使它的元素mod为256的函数,我无法从mod值取回原始值。我如何获得原始值?是否还有其他方法可以将矩阵转换为图像,反之亦然,默认情况下不会使其成为任何数字的mod。
现在,我不知道如何处理此问题。任何帮助将不胜感激。谢谢。
答案 0 :(得分:1)
这不是正确的方法。您无法获得实际价值。将值更改为其mod of 256
后,您将无法恢复之前的值。当您将图像读为8bit depth JPEG
时,255
中的值不能大于numpy array
,因为我们需要8位以上的值来存储大于{{1}十进制数字制。因此,您可以做的是将图像读取为8位深度图像,然后根据需要将图像的255
转换为16位或32位。您可以通过使用
numpy.ndarray
要么
img_array.astype(numpy.uint16)
您可以使用img_array.astype(numpy.uint32)
检查类型
如果将numpy数组转换为uint16,则数组中可以具有的最大值是print(img_array.dtype())
,而对于uint32,最大值是2^16-1
。
现在,您可以使用2^32-1
保存阵列,该阵列可以读取写入图像的16位深度。
imageio
使用.png作为无损文件,可以存储16位数据。 PIL将始终将16位或32位转换为8位numpy数组。