2011-10-14 22 views
6

請考慮這個再現的例子:規格化numpy的各種「圖像」對象陣列

from PIL import Image 
import numpy as np 
import scipy.misc as sm 
import matplotlib.pyplot as plt 
import matplotlib.image as mpimg 
import matplotlib.cbook as cbook 
import urllib 

datafile = cbook.get_sample_data('lena.jpg') 
lena_pil = Image.open(datafile) 
lena_pil_np = np.asarray(lena_pil) 

lena_scipy = sm.lena() 

lena_tmp = open('lena_tmp.png', 'wb') 
lena_tmp.write(urllib.urlopen('http://optipng.sourceforge.net/pngtech/img/lena.png').read()) 
lena_tmp.close() 

lena_mpl = mpimg.imread('lena_tmp.png') 

sm.info(lena_pil_np) 
sm.info(lena_scipy) 
sm.info(lena_mpl) 

輸出是:

>>> sm.info(lena_pil_np) 
class: ndarray 
shape: (512, 512, 3) 
strides: (1536, 3, 1) 
itemsize: 1 
aligned: True 
contiguous: True 
fortran: False 
data pointer: 0xb707e01cL 
byteorder: little 
byteswap: False 
type: uint8 

>>> sm.info(lena_scipy) 
class: ndarray 
shape: (512, 512) 
strides: (2048, 4) 
itemsize: 4 
aligned: True 
contiguous: True 
fortran: False 
data pointer: 0xb6f7d008L 
byteorder: little 
byteswap: False 
type: int32 

>>> sm.info(lena_mpl) 
class: ndarray 
shape: (512, 512, 3) 
strides: (6144, 12, 4) 
itemsize: 4 
aligned: True 
contiguous: True 
fortran: False 
data pointer: 0xb6c7b008L 
byteorder: little 
byteswap: False 
type: float32 

因此所有數組是不同的形狀和類型。

對於其他處理,我希望這個數組可以用最後一個變量lena.mpl來表示,或者只是將數組值轉換爲它們的標準化的[0..1] float32類型。

這樣做的最好方法是什麼?

回答

5
def normalize(arr): 
    arr=arr.astype('float32') 
    if arr.max() > 1.0: 
     arr/=255.0 
    return arr