2017-02-20 58 views
1

我試圖如下Python的OpenCV的規格化具有零均值和單位方差

out_image = np.zeros((32,32),dtype=np.float32) 
out_array = np.zeros((len(X),32,32), dtype=np.uint8)   
for imageindex in range(0,len(X)): 
    img = X[imageindex].squeeze() 
    if proctype == 'MeanSubtraction': 
     out_image = img.astype(np.float32) - np.mean(img.astype(np.float32)) 
    elif proctype == 'Normalization': 
     out_image = cv2.normalize(img.astype(np.float32), out_image, alpha=-0.5, beta=0.5,\ 
              norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F) 
    elif proctype == 'HistEqualization': 
     out_image = cv2.equalizeHist(img) 

    elif proctype == 'CLAHE': 
     clahe = cv2.createCLAHE(tileGridSize=(6,6),clipLimit = 20.0) 
     out_image = clahe.apply(img) 

    out_array[imageindex] = out_image.astype(np.uint8) 

return out_array 

然而正常化灰度圖像具有零均值和單位方差與cv2.normalize功能的數組,如果使用0和1(或0和255)用於歸一化函數的參數alpha和beta,它可以工作。但是如果我使用-0.5和+0.5,它會給我一個空的圖像(全零)

爲什麼會發生這種情況?

回答

2

​​的類型是np.uint8,所以不能精確地表示浮點值。因此,當您將out_image(其中包含[-0.5, 0.5]範圍內的浮點值)轉換爲np.uint8out_image.astype(np.uint8)時,所有這些值都被截斷爲零。考慮下面這個例子:

# generate random numbers in the range [-0.5, 0.5] 
x_float32 = (np.random.random((32, 32)) - 0.5).astype(np.float32) 
print x_float32.min(), x_float32.max() # prints -0.49861032, 0.4998906 
x_uint8 = x_float32.astype(np.uint8) 
print x_uint8.min(), x_uint8.max()  # prints 0, 0 

如果你想儲存浮點值​​,首先需要改變其dtypenp.float32。或者,您可以將[-0.5, 0.5]範圍內的值重新歸一化爲[0, 255]範圍內的無符號整數。

+0

是的。我將out_array的dtype更改爲np.float32,現在可以工作了。謝謝 – Mechanic

相關問題