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