2个uint8相减,如果是负数(溢出),得到的不是真实结果。
- 1、将uint8转成int16/int32 再做差,但返回的数值类型不是uint8
- 2、使用opencv中的absdiff ,返回的仍然是uint8
import numpy as np
import cv2
fil = -1 + 2*np.random.random((5,5))
fil=np.asarray(fil,np.float32)
# print(fil,'\n\r')
def distance(x):
x=x.astype(np.int16)
return x-x[0]
fil_uint8=((fil+1)/2*256).astype(np.uint8) # [0,255]
print(fil_uint8,'\n\r')
fi_a=fil_uint8[0]
# uint8 --->int16
print(distance(fil_uint8),'\n\r')
# 使用absdiff
l=list([fi_a])*len(fil_uint8)
l=np.asarray(l,np.uint8)
c=cv2.absdiff(fil_uint8,l)
print(c)
print(c.dtype)
输出结果:
[[ 45 43 147 239 162]
[227 12 81 135 62]
[239 137 246 237 88]
[200 176 141 197 187]
[227 100 24 97 175]]
[[ 0 0 0 0 0]
[ 182 -31 -66 -104 -100]
[ 194 94 99 -2 -74]
[ 155 133 -6 -42 25]
[ 182 57 -123 -142 13]]
[[ 0 0 0 0 0]
[182 31 66 104 100]
[194 94 99 2 74]
[155 133 6 42 25]
[182 57 123 142 13]]
uint8