2017-02-20 149 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

相关问题