为什么cv2.GaussianBlur操作会修改输入数组的最大值?
原因分析
1. np.uint8类型输入最大值下降的本质
cv2.GaussianBlur的核心逻辑是对每个像素的邻域做高斯加权平均,权重总和为1。你构造的是上下硬边的二值掩码,下半部分纯255、上半部分纯0,当用15x15的高斯核做运算时,靠近边缘的255区域像素会混入上方0值的权重,计算结果本就会略低于255。
而OpenCV针对8位无符号整数这类整型输入做高斯模糊时,为了提升运算效率,不会直接用浮点核计算,而是先把浮点高斯核转换为整数定点核,运算完成后再除以核的总权重做归一化。这个过程会引入两次精度损失:
- 浮点核转定点整数时的截断误差
- 最终归一化时的整数除法向零取整+饱和截断
两种误差叠加,最终就导致原本的255最大值降到了253。
2. np.float32类型输入最大值接近255的原因
浮点数模式下OpenCV会直接用浮点高斯核做卷积,不需要做定点转换,也没有整数除法的截断问题,仅存在浮点数运算本身的微小舍入误差,所以最大值基本保持在255附近,你观察到的255.00002就是正常的浮点精度误差。
内容的提问来源于stack exchange,提问作者mrgloom
相关产品推荐
相关产品推荐

