【问题标题】:Numpy sum messing up adding negative numbersNumpy总和搞砸了添加负数
【发布时间】:2021-12-02 17:53:44
【问题描述】:

我正在尝试编写一个用于图像处理的简单卷积循环。当内核加起来为 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]

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

【问题讨论】:

  • 图像和内核的dtype是什么?
  • 内核是float64,img是uint8,这似乎是问题所在。我如何一起计算它们?抱歉,python 新手

标签: python opencv image-processing convolution


【解决方案1】:

实际上,您的问题似乎是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 就足够了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-16
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多