Python 中的图像处理使用 PIL 并面临 fromarray() 的问题

Image manipulation in Python using PIL and facing problem with fromarray()

我正在编写一个脚本来使用 PIL 在 python3 中加密和解密图像。在这里,我将图像转换为 numpy 数组,然后将数组的每个元素乘以 10。现在我注意到 PIL fromarray() 中的默认函数正在将数组的每个元素转换为 256 的 mod 如果它大于 255,所以当我试图检索矩阵的原始值时,我没有得到原始值。例如,如果原始值是 40,那么它的 10 次是 400,所以 fromarray() 将它变成 400 mod 256,这将得到 144。现在如果我将 256 加到 144 我将得到 400,然后除以 10 将得到 40。但如果值为 54,则 10 次为 540,540 mod 256 为 28。现在要取回原始值,我需要将 256 相加两次,这将得到 540。540当我将 mod 与 256 一起使用时,这不是唯一会给我 28 的数字。所以我永远不知道什么时候加 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 值取回原始值。我怎样才能得到原始的 value.Is 还有其他方法可以将矩阵转换为图像,反之亦然,默认情况下不会使它成为任何数字的 mod。

现在我不知道如何处理这个问题。任何帮助都会大大appreciated.Thank你。

这不是正确的做法。您无法获得实际价值。将值更改为其 mod of 256 后,您将无法取回之前的值。当您将图像读取为 8bit depth JPEG 时,您不能在 numpy array 中拥有超过 255 的值,因为我们需要超过 8 位来存储超过 255 的值] 在十进制数系统中。所以你可以做的是,你可以将图像读取为 8 位深度图像,然后根据需要将图像的 numpy.ndarray 转换为 16 位或 32 位。您可以使用 img_array.astype(numpy.uint16) 要么 img_array.astype(numpy.uint32) 您可以使用 print(img_array.dtype()) 检查类型 如果将 numpy 数组转换为 uint16,则数组中的最大值为 2^16-1,对于 uint32 为 2^32-1

现在您可以使用 imageio 保存数组,它可以读取和写入 16 位深度的图像。

`import imageio as io
 img_array = io.imread('16bit.png')
 io.imwrite('new16bit.png', img_array)`

使用.png作为无损格式,可以存储16位数据。 PIL 将始终将 16 位或 32 位转换为 8 位 numpy 数组。