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)