我正在尝试使用RSA算法对图像进行加密和解密。为此,我需要将图像读取为灰度,然后应用按键并将uint16类型数组保存为png或支持16位数据的任何图像格式。然后,我需要读取16位数据,将其转换为数组并进行解密。现在,以前我尝试将图像另存为.tif并在使用
读取时img = sk.imread('image.tiff', plugin = 'tifffile')
它将图像视为RGB,这不是我想要的。现在,我想将uint16类型的数组保存到一个16位png图像中,该图像将采用0到65536之间的值,然后再次将其作为uint16类型的数据读取。我尝试使用
将值保存到16位png文件中img16 = img.astype(np.uint16)
imgOut = Image.fromarray(img16)
imgOut.save('en.png')
这给了我这个错误:OSError: cannot write mode I;16 as PNG
我也尝试过imgOut = Image.fromarray(img16, 'I')
,但是not enough image data
如此
请帮助我将16位数据保存为.png图像。谢谢。
答案 0 :(得分:5)
有两种可能...
首先,使用imageio
编写一个16位PNG:
import imageio
import numpy as np
# Construct 16-bit gradient greyscale image
im = np.arange(65536,dtype=np.uint16).reshape(256,256)
# Save as PNG with imageio
imageio.imwrite('result.png',im)
然后您可以从磁盘读回图像,并将第一个像素更改为中间灰色(32768),如下所示:
# Now read image back from disk into Numpy array
im2 = imageio.imread('result.png')
# Change first pixel to mid-grey
im2[0][0] = 32768
或者,如果您不喜欢imageio
,则可以使用PIL/Pillow
并保存一个16位TIFF:
from PIL import Image
import numpy as np
# Construct 16-bit gradient greyscale image
im = np.arange(65536,dtype=np.uint16).reshape(256,256)
# Save as TIFF with PIL/Pillow
Image.fromarray(im).save('result.tif')
然后您可以从磁盘上读取图像,并像这样将第一个像素更改为灰色:
# Read image back from disk into PIL Image
im2 = Image.open('result.tif')
# Convert PIL Image to Numpy array
im2 = np.array(im2)
# Make first pixel mid-grey
im2[0][0] = 32768
关键字:图像,图像处理,Python,Numpy,PIL,Pillow,imageio,TIF,TIFF,PNG,16位,16位,short,unsigned short,保存,写入。 / p>