减去两个图像

时间:2017-10-31 17:20:45

标签: python opencv

我希望在两张图片中获得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]

是什么导致这种情况?

2 个答案:

答案 0 :(得分:1)

您需要将您所读的images转换为支持负数的data type,例如unsigned int 8np.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 datatypenp.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