Numpy sum 弄乱了添加负数

Numpy sum messing up adding negative numbers

我正在尝试为图像处理编写一个简单的卷积循环。当内核加起来为 1,即平滑滤波器时,它似乎工作正常。

但是当使用边缘检测滤镜时,会出现奇怪的值:

  for i in range(img.shape[1]):
    index = []
    for j in range(order):
      index.append(i+j)
    array_aux=img_processed[:,index]
    img_final[:,i]=np.sum(array_aux*kernel_x,axis=1)

我正在应用一个 1D 内核,它扩展到图片的整个高度,并通过将扩展的内核与所需的列相乘并将所有值相加来进行卷积。我正在使用 cv2.BORDER_REFLECT_101 填充:

  Image:                Kernel:    Final Image:

  [ 85  85  85  85  85] [ 1  0 -1] [  0   0   0   0   0]
  [ 85  85  85  85  85] [ 1  0 -1] [  0   0   0   0   0]
  [ 84  84  84  84  84] [ 1  0 -1] [  0   0   0   0   0]
           ...              ...             ... 
  [106 136 179 170 152] [ 1  0 -1] [  0 183 222  27   6]
  [113 129 172 175 153] [ 1  0 -1] [  0 197 210  19  30]
  [123 125 168 183 156] [ 1  0 -1] [  0 211 198  12  57]

如您所见,虽然前三行似乎没问题,但后三行是错误的,因为应该是负数。怎么回事?

实际上,您的问题似乎是 img_final,我怀疑它也是 dtype uint8

如果您在浮点数和整数之间进行运算,结果将是正确的浮点数。但是,当您尝试将浮点数放入 uint8 数组时,它会强制转换为该值。

>>> img_final = np.zeros((3, 3), dtype=np.uint8)
>>> img_final[0,0] = -2.5
>>> img_final
array([[254,   0,   0],
       [  0,   0,   0],
       [  0,   0,   0]], dtype=uint8)

只需为 img_final 设置正确的类型,应该没问题。如果要处理正整数和负整数,int32 就足够了。