2016-11-25 34 views
2

我想使用Pillow Python模块获取浮动RGBA像素值的列表。如何使用Pillow获取float RGBA像素值列表?

到目前为止,我只能得到RGBA整型数据:

from PIL import Image 

im = Image.open("Lenna.png") 
im_alpha = im.convert('RGBA') 
Pixels = list(im.getdata()) 

这将让我的实例((226,137,125,255),...) 但是我不知道例如((0.88627451,0.537254902,0.490196078,1)...),如何以浮点形式获得此信息。

我该怎么做?

+1

http://stackoverflow.com/问题/ 2262100/rgb-int-to-rgb-python – PeteyPii

+1

@PeteyPii这对我有什么帮助?我希望像素信息的形式为(0.1454,0.4572,1,1),当然我可以将它归一化,但我正在寻找一种更好的方法来使用Pillow本身。 –

+0

哦,我误解了你的问题。您应该明确说明您在问题中的含义。 – PeteyPii

回答

1

这是我用什么RGB巴纽:

from PIL import Image 
import numpy 

# http://www.schaik.com/pngsuite/basn2c16.png 
im = Image.open('basn2c16.png') 
#~ data = numpy.asarray(im) 
data = numpy.array(im) # same as .asarray 
print("Array dimensions: %s"%(repr(data.shape))) 
data = data.astype(float) 
print("[20, 30]=%s"%(repr(data[20, 30]))) 
print(data) 
data = numpy.divide(data, 255.0) 
print(data) 

Nowever,请注意,这取决于类型png格式的;例如,参照http://www.schaik.com/pngsuite/pngsuite_bas_png.html测试文件,并为basn2c16.png这是“3x16位RGB颜色”,将打印输出:

Array dimensions: (32, 32, 3) 
[20, 30]=array([ 8., 90., 156.]) 
[[[ 255. 255. 0.] 
    [ 247. 255. 0.] 
    [ 239. 255. 0.] 
... 
[[[ 1.   1.   0.  ] 
    [ 0.96862745 1.   0.  ] 
    [ 0.9372549 1.   0.  ] 
    ..., 

所以,即使这是16位,值似乎跨越0-255 ,就好像是8位一样。在这种情况下,我们需要扩展与numpy.divide 255的数据获得的浮动范围0.0-1.0 ...

但是,如果你使用一个索引/ palleted png格式basn3p08.png,您可以:

Array dimensions: (32, 32) 
[20, 30]=120.0 
[[ 165. 165. 165. ..., 254. 254. 254.] 
[ 8. 8. 8. ..., 248. 248. 248.] 
.... 

所以现在矩阵内容并不代表RGB(A)值,而是一个调色板中的索引,因此用255来分隔并没有意义。

最后,如果它是一个RGBA png格式一样basn6a16.png,你会得到阿尔法以及:

Array dimensions: (32, 32, 4) 
[20, 30]=array([ 0., 88., 167., 16.]) 
[[[ 255. 255. 0. 0.] 
    [ 247. 255. 0. 0.] 
... 

再有,就算这是16位PNG,值似乎扩展到255,所以将255获得花车是有道理的。

换句话说,它比较容易与numpy和PIL缩放矩阵值,但是,你应该确保矩阵是为正确的格式...