[Image-SIG] help for conversion of NUMARRAY to PIL object

Zhenglong Li zlli at nlpr.ia.ac.cn
Fri Sep 16 15:43:39 CEST 2005


Thank you very much for your generous help.


Bob Klimek wrote:
> Zhenglong Li wrote:
> 
>> Hi, Fredrik,
>>
>>     Thank you very much for your help. But there still exists a 
>> problem that the code cann't deal with 3-channel RGB image. If I want 
>> to read a len*width*3 matrix from PIL object into NumArray, and vice 
>> versa, what should I do?
>>  
>>
> Try this.
> 
> import numarray as N
> import Image
> 
> screenLevels = 255.0 # we have 8 bit video cards
> 
> def image2array(im, convertType='UInt8'):
>    """
>    Convert PIL image to Numarray array
>    """
>    if im.mode == "L":
>        a = N.fromstring(im.tostring(), N.UInt8)
>        a = N.reshape(a, (im.size[1], im.size[0]))
>        #a.shape = (im.size[1], im.size[0], 1)  # alternate way
>    elif (im.mode=='RGB'):
>        a = N.fromstring(im.tostring(), N.UInt8)
>        a.shape = (im.size[1], im.size[0], 3)
>    else:
>        raise ValueError, im.mode+" mode not considered"
> 
>    if convertType == 'Float32':
>        a = a.astype(N.Float32)
>    return a
> 
> def array2image(a):
>    """
>    Converts array object (numarray) to image object (PIL).
>    """
>    h, w = a.shape[:2]
>    int32 = N.Int32
>    uint32 = N.UInt32
>    float32 = N.Float32
>    float64 = N.Float64
> 
>    if a.type()==int32 or a.type()==uint32 or a.type()==float32 or 
> a.type()==float64:
>        a = a.astype(N.UInt8) # convert to 8-bit
>    if len(a.shape)==3:
>        if a.shape[2]==3:  # a.shape == (y, x, 3)
>            r = Image.fromstring("L", (w, h), a[:,:,0].tostring())
>            g = Image.fromstring("L", (w, h), a[:,:,1].tostring())
>            b = Image.fromstring("L", (w, h), a[:,:,2].tostring())
>            return Image.merge("RGB", (r,g,b))
>        elif a.shape[2]==1:  # a.shape == (y, x, 1)
>            return Image.fromstring("L", (w, h), a.tostring())
>    elif len(a.shape)==2:  # a.shape == (y, x)
>        return Image.fromstring("L", (w, h), a.tostring())
>    else:
>        raise ValueError, "unsupported image mode"
> 
> Bob
> 
> 
> 



More information about the Image-SIG mailing list