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

Tha*_*izh 8 python opencv

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

小智 19

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

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


Moh*_*imi 13

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

image1 = imread("/path/to/image1")
image2 = imread("/path/to/image2")
image3 = image1 - image2
Run Code Online (Sandbox Code Playgroud)

  • 你不应该使用`-`运算符,因为它不处理负值(在图像中没有意义).请使用@viki提供的[此答案](http://stackoverflow.com/a/34585872/616644). (8认同)
  • 祝你好运 uint8 图像,结果将是完全错误的 (4认同)

RTb*_*ard 5

@dvigneshwr 的答案做了一个减法,其中产生的负值四舍五入为 0。@Taha Anwar M-Holmes 的答案保留了负数,但改变了结果数组的数据类型,因此它不再是传统的图像类型。

对于那些想要根据绝对差异从背景图像中识别前景并返回与输入相同数据类型的数组(这就是我在这里结束的方式)的人,请使用absdiff

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

import cv2 as cv

image3 = cv.absdiff(image1, image2)
Run Code Online (Sandbox Code Playgroud)

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