Поиск разностного изображения между несколькими изображениями

#python #image #numpy #difference

#python #изображение #numpy #разница

Вопрос:

Я сделал несколько скриншотов с веб-камеры в моем кампусе, и я сделал в среднем 300 скриншотов, и это дает мне изображение со многими призрачными людьми. Я пытаюсь выяснить, как получить изображение разницы между изображениями, чтобы я мог изменить различия на красный, чтобы показать более четко. Мне просто нужна помощь, чтобы понять, с чего начать. Я знаю, что мне нужно вычесть первое изображение на второе, а затем это изображение на третье, но я не уверен, как это сделать в Python.

 import os, os.path, time
import matplotlib.pyplot as mplot
from PIL import Image
import numpy as np

files=os.listdir('./images')
print files

image=[]

for file in files:
    img=Image.open('./images/' file)
    img=np.float32(img)
    image.append(img)

avg_img=[]

for img in image:
    try:
        avg_img =img
    except:
        avg_img=img

avg_img/=len(image)
avg_img=np.clip(avg_img, 0, 255)
avg_img=np.uint8(avg_img)
mplot.imshow(avg_img)
mplot.show()
  

Ответ №1:

Существует множество способов сделать это, но сначала я буду придерживаться того, что у вас есть в данный момент. Затем я покажу более компактный способ.

 import os, os.path, time
import matplotlib.pyplot as mplot
from PIL import Image
import numpy as np

files=os.listdir('./images')
print files

image=[]

for file in files:
    img=Image.open('./images/' file)
    img=np.float32(img)
    image.append(img)

avg_img=np.zeros_like(image[0])

for img in image:
    avg_img  = img

avg_img/=len(image)
avg_img=np.clip(avg_img, 0, 255)
avg_img=np.uint8(avg_img)
mplot.imshow(avg_img)
mplot.show()

# get series of differences
differences = []
for img0, img1 in zip(image[:-1], image[1:]):
    differences.append(img1 - img0)
  

Вот более простой способ с использованием numpy.

 import os, os.path, time
import matplotlib.pyplot as mplot
from PIL import Image
import numpy as np

files = os.listdir('./images')
print files

img = Image.open(os.path.join('./images', files[0])

image_stack = np.ndarray((len(files), img.shape[0], img.shape[1], 3), dtype=np.float32)

for i, file in enumerate(files):
    img = Image.open('./images/' file)
    img = np.float32(img)
    image_stack[i] = img

avg_img = np.mean(image_stack, axis=0)
avg_img = np.clip(avg_img, 0, 255)
avg_img = avg_img.astype(np.uint8)

mplot.imshow(avg_img)
mplot.show()

difference_stack = image_stack[1:] - image_stack[:-1]
  

Я сомневаюсь, что ваше изображение с веб-камеры хранит поплавки, но, возможно, это так.