如何使用python opencv2减去两个图像来获取前景对象

时间:2014-01-29 08:42:54

标签: python opencv

有没有办法在python opencv2中减去两个图像?
 1)图像1:任何图像(例如:房屋图像)(静态图像)
 2)图像2:与对象相同的图像(在室内,一个人站着......)     (静态图像+动态对象)
 3)图像3 =图像2 - 图像1
如果我们从Image1中减去Image2意味着Image3应该只给对象(人)。
请举一个例子。
感谢。

4 个答案:

答案 0 :(得分:15)

如果两张图片中的背景完全相同,您可以在帖子中提及它们。

image1 = imread("/path/to/image1")
image2 = imread("/path/to/image2")
image3 = image1 - image2

答案 1 :(得分:10)

尝试背景扣除(http://docs.opencv.org/master/db/d5c/tutorial_py_bg_subtraction.html#gsc.tab=0

使用cv2.subtract(img1,img2)代替算术运算,因为cv2会处理负值。

答案 2 :(得分:1)

@dvigneshwr的答案进行了减法运算,将所得负值四舍五入为0。@ Taha Anwar M-Holmes的答案保留了负值,但更改了所得数组的数据类型,因此不再是常规的图像类型。

对于那些希望基于绝对值差异从背景图像中识别前景并返回与输入具有相同数据类型的数组的人(这就是我到这里为止的方式), absdiff

假设数组的宽度和高度相同...

import cv2 as cv

image3 = cv.absdiff(image1, image2)

值得注意的是,OP没有提供任何细节,要减去此处的图像...根据图像的内容,所有这些方法都可以回答OP的问题。

答案 3 :(得分:0)

cv2.subtract不起作用,它仅将值绑定在0-255之间,因此,如果您想获取负值,只需将图像从unit8转换为int32或int64。注意unint8只能取0-255的值,因此它不能处理负值

image1= np.int32(image1)

image2= np.int32(image2)

image3 = image1 - image2