如何将dtype(uint16)数据转换为16位png图像?

时间:2019-03-23 08:30:03

标签: python image numpy png python-imaging-library

我正在尝试使用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图像。谢谢。

1 个答案:

答案 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

enter image description here


关键字:图像,图像处理,Python,Numpy,PIL,Pillow,imageio,TIF,TIFF,PNG,16位,16位,short,unsigned short,保存,写入。 / p>