Skip to content

numpy 积分图不正确

复制本地路径 | 在线编辑

我服了,搞了一个多小时,最后发现是精度问题。我还在那一直拷问 AI,AI 也搞半天 Debug,最后我拿暴力遍历和积分图对比,才发现是精度问题...

需要转为 np.longdouble 才可以,最好和我上面一样,拿一个暴力求出的结果进行对比。

# 用 OpenCV 算一个
import cv2
out = cv2.blur(signal, (win_w, win_h))

pad_h, pad_w = win_h // 2, win_w // 2
padded = np.pad(signal, ((pad_h, pad_h), (pad_w, pad_w)), mode='edge')

# 积分图
S = np.zeros((padded.shape[0] + 1, padded.shape[1] + 1))

# 这里一定要有 np.longdouble 否则精度不够
S[1:, 1:] = padded.astype(np.longdouble).cumsum(axis=0).cumsum(axis=1)

# 窗口求和
out2 = (
    S[win_h:, win_w:]
    - S[:-win_h, win_w:]
    - S[win_h:, :-win_w]
    + S[:-win_h, :-win_w]
) / (win_h * win_w)
out2 = out2.astype(np.float32)

delta = out - out2
print(np.max(delta[10:-10, 10:-10]))

Comments