使用PIL在Python中进行图像处理,并面临fromarray()

时间:2019-03-18 09:27:23

标签: python cryptography python-imaging-library mod

我正在编写一个脚本,使用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。

现在,我不知道如何处理此问题。任何帮助将不胜感激。谢谢。

1 个答案:

答案 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数组。