如何通过删除移动对象从多个图像中获取背景?

Zoh*_*aib 3 python opencv image image-processing computer-vision

我用固定相机拍摄了同一场景的多张图像,其中有移动物体。我不明白如何在 Python 中使用这些图像通过删除所有移动对象来检索背景图像。

任何帮助,将不胜感激。谢谢!

下面附上了图片:

在这种情况下,我希望最终的图像没有任何人参与。

图像1:

图像2:

图 3:

Mar*_*ell 7

更新答案

我想出了如何在 Python 中执行我在下面建议的操作 - 但可能有更好的方法 - 我仍然是 Python 初学者!

#!/usr/bin/env python3

import numpy as np
from PIL import Image

# Load images
im0 = np.array(Image.open('1.jpg'))
im1 = np.array(Image.open('2.jpg'))
im2 = np.array(Image.open('3.jpg'))

# Stack the 3 images into a 4d sequence
sequence = np.stack((im0, im1, im2), axis=3)

# Repace each pixel by mean of the sequence
result = np.median(sequence, axis=3).astype(np.uint8)

# Save to disk
Image.fromarray(result).save('result.png')
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

原答案

最简单的方法是取 3 个图像中每个像素的中值,因为没有手的 2 个图像将具有彼此接近的值,而有手的图像将是异常值,中值滤波器将删除异常值。

所以,我并不是说你查看每张图像的 3x3 或 5x5 区域并计算中值。相反,我的意思是查看pixel[0,0]图像 1、2 和 3 并取这三个值的中位数 - 您可以通过将 3 个值按顺序排序并选择三个已排序像素的中间值作为输出值来实现。然后查看pixel[0,1]所有 3 个图像并重复该过程。

这是结果:

在此处输入图片说明

我没有写 Python,我只是在终端中对ImageMagick做了完全相同的事情,如下所示:

convert 1.jpg 2.jpg 3.jpg -evaluate-sequence median result.jpg
Run Code Online (Sandbox Code Playgroud)

为了让您看到我在做什么,如果我计算每个位置的 3 个像素的平均值/平均值,而不是中值,则手将仅以其原始密度的 1/3 显示:

在此处输入图片说明