图像SSD计算错误值

时间:2015-04-15 05:51:59

标签: python numpy

以下是代码,此功能是获取SSD(标准差的总和)矩阵的输入。输入video_volume是图像列表(4D numpy数组,格式:(num_frames, rows, cols, 3))。

但是,当我传入以下矩阵时,它不起作用。看起来255的平方溢出或者有什么事情发生在255?

测试输入:

np.array([[[[2, 2, 2],
            [2, 2, 2],
            [2, 2, 2],
            [2, 2, 2]],
           [[2, 2, 2],
            [2, 2, 2],
            [2, 2, 2],
            [2, 2, 2]]],
          [[[1, 1, 1],
            [1, 1, 1],
            [1, 1, 1],
            [1, 1, 1]],
           [[1, 1, 1],
            [1, 1, 1],
            [1, 1, 1],
            [1, 1, 1]]],
          [[[0, 0, 0],
            [0, 0, 0],
            [0, 0, 0],
            [0, 0, 0]],
           [[255, 255, 255],
            [255, 255, 255],
            [255, 255, 255],
            [255, 255, 255]]]], dtype=np.uint8)

预期输出:

[[  0.00000000e+00   2.40000000e+01   7.68156000e+05]
 [  2.40000000e+01   0.00000000e+00   7.74204000e+05]
 [  7.68156000e+05   7.74204000e+05   0.00000000e+00]]

实际输出:

[[   0.   24.  156.]
 [  24.    0.   60.]
 [ 156.   60.    0.]]

SSD功能:

output = np.zeros((len(video_volume), len(video_volume)), dtype=np.float)
ssd = 0
for i in range(len(video_volume)):
    cur_frame = video_volume[i]
    #print 'i:{}'.format(i)
    for j in range(0, i+1):
        comparison_frame = video_volume[j]
        ssd = float(np.sum((cur_frame[:,:,0:3] - comparison_frame[:,:,0:3])**2))
        output[i][j] = ssd            
        if i != j:
            output[j][i] = ssd

return output

1 个答案:

答案 0 :(得分:2)

输入数组的dtype为np.uint8。一个8位无符号整数可以存储2个 8 个不同的值,即从0到255.因此,无论平方差的总和的值是什么,都会溢出:

np.sum((cur_frame[:,:,0:3] - comparison_frame[:,:,0:3])**2)

大于255.由于它是无符号格式,uint8也不能表示负值,因此如果

中有任何值,您也会遇到下溢
cur_frame[:,:,0:3] - comparison_frame[:,:,0:3]

是否定的。

一个简单的解决方法是将输入转换为具有更高位深度的带符号整数格式:

video_volume = video_volume.astype(np.int64)