1586010002-jmsa.png

I'm trying to read a PNG image file written in 16-bit data type. The data should be converted to a NumPy array. But I have no idea how to read the file in '16-bit'. I tried with PIL and SciPy, but they converted the 16-bit data to 8-bit when they load it. Could anyone please let me know how to up out data from a 16-bit PNG file and convert it to NumPy array without changing the datatype?

The following is the script I used.

from scipy import misc

import numpy as np

from PIL import Image

#make a png file

a = np.zeros((1304,960), dtype=np.uint16)

a[:] = np.arange(960)

misc.imsave('16bit.png',a)

#read the png file using scipy

b = misc.imread('16bit.png')

print "scipy:" ,b.dtype

#read the png file using PIL

c = Image.open('16bit.png')

d = np.array(c)

print "PIL:", d.dtype

解决方案

I have the same problem here. I tested it even with 16 bit images i created by my own. All of them were opened correctly when i loaded them with the png package. Also the output of 'file ' looked okay.

Opening them with PIL always led to 8-bit numpy-arrays.

Working with Python 2.7.6 on Linux btw.

Like this it works for me:

import png

import numpy as np

reader = png.Reader( path-to-16bit-png )

pngdata = reader.read()

px_array = np.array( map( np.uint16, pngdata[2] )

print( px_array.dtype )

Maybe someone can give more information under which circumstances the former approach worked? (as this one is pretty slow)

Thanks in advance.

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐