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