我希望在两张图片中获得pixel
值的差异。
out_img = cv2.imread(output_path)
tar_img = cv2.imread(target_path)
difference = out_img - tar_img
但是我没有得到理想的结果,所以我检查subtraction
的工作方式,查看具体的pixel
。
print out_img[0][0] #shows [254 254 254]
print tar_img[0][0] #shows [255 255 255]
print out_img[0][0] - tar_img[0][0] #this should show [-1 -1 -1], but shows [255 255 255]
是什么导致这种情况?
答案 0 :(得分:1)
您需要将您所读的images
转换为支持负数的data
type
,例如unsigned int 8
(np.int8
)。这可以通过.astype()
:
out_img = cv2.imread(output_path).astype(np.int8)
tar_img = cv2.imread(target_path).astype(np.int8)
difference = out_img - tar_img
之前您遇到此问题的原因是cv2.imread()
返回numpy
array
data
type
unsigned int 8
。因此,当您尝试将值存储为-1
时,会循环到255
。
我们可以用一个更简单的例子证明这一点:
>>> a
array([1, 2, 3, 4], dtype=uint8)
>>> a[0] = -1
>>> a
array([255, 2, 3, 4], dtype=uint8)
但是,如果我们将a
转换为signed int datatype
(np.int8
),我们可以按照预期的方式执行此操作:
>>> a
array([1, 2, 3, 4], dtype=uint8)
>>> a = a.astype(np.int8)
>>> a
array([1, 2, 3, 4], dtype=int8)
>>> a[0] = -1
>>> a
array([-1, 2, 3, 4], dtype=int8)
希望这能为你解决一些问题!
答案 1 :(得分:0)
结果是正确的。像素存储为8位无符号数;他们的范围是0-255。 -1
不是此类型支持的值;算术再次绕回到范围的顶部,使假定的符号位丢失。
添加时会产生类似的效果:255 + 1 => 0