Python 两幅图像的减法

Python 两幅图像的减法,python,opencv,Python,Opencv,我想得到两幅图像中像素值的差异 out_img = cv2.imread(output_path) tar_img = cv2.imread(target_path) difference = out_img - tar_img 但是我没有得到理想的结果,所以我检查了减法的工作原理,查看了一个特定的像素 print out_img[0][0] #shows [254 254 254] print tar_img[0][0] #shows [255 255 255] print out_img[

我想得到两幅图像中
像素
值的差异

out_img = cv2.imread(output_path)
tar_img = cv2.imread(target_path)
difference = out_img - tar_img
但是我没有得到理想的结果,所以我检查了
减法的工作原理,查看了一个特定的
像素

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]

是什么原因造成的?

结果是正确的。像素存储为8位无符号数字;它们的范围是0-255<代码>-1
不是此类型中支持的值;该算法再次回到范围的顶部,丢失假定的符号位以溢出


添加时会产生类似的效果:255+1=>0

您需要将读入的
图像
转换为支持负数的
数据
类型
,例如
无符号整数8
np.int8
)。这可以通过
.astype()
完成:

您之前遇到问题的原因是
cv2.imread()
返回一个
numpy
数组
,其中包含
数据
类型
无符号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数据类型
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)

希望这能为你澄清一些事情

opencv的减法方法将使用饱和度转换,将结果截断为0,而不是得到底流。
>>> 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)