Как убрать движущиеся объекты только для получения фона? - PullRequest
0 голосов
/ 10 декабря 2018

Я практически новичок в python и не очень разбираюсь в этом.Мне нужна помощь в преобразовании этого псевдокода в Python, который написан для получения фона путем удаления движущихся объектов на изображениях.Что касается псевдокода, я не понимаю строки 3, 4 и 5, поэтому, возможно, когда он будет преобразован в Python, я смогу лучше понять его.В строках 3 и 4 я не понимаю, что делает &, а в последней строке я не понимаю, как это вообще вычисляет изображение.

Любая помощь будет оценена.

Код указан ниже:

Mat sequence[3];// the sequence of images to loop through
Mat output, x = 0, y = 0; // looping through the sequence         
    matchTemplate(sequence[i], sequence[i+1], output, CV_TM_CCOEFF_NORMED)
    mask = 1 & (output>0.9) // get correlated part amongst the images
    x += sequence[i] & mask + sequence[i+1] & mask; // accumulate background infer
    y += 2*mask; // keep count 
end of loop;
Mat bg = x.mul(1.0/y); // average background

Примеры изображений, которые можно попробовать, также представлены ниже:

image1

image2

image3

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Как отметил один из комментаторов, среднее значение изображений удаляет передний план, но все изображение становится немного блеклым.Вот код, который делает это:

import skimage.io as io
import numpy as np
import matplotlib.pyplot as plt

cim1 = io.imread('https://i.stack.imgur.com/P44wT.jpg')
cim2 = io.imread('https://i.stack.imgur.com/wU4Yt.jpg')
cim3 = io.imread('https://i.stack.imgur.com/yUbB6.jpg')

x,y,z = cim1.shape
newimage = np.copy(cim1)
for row in range(x-1):
    for col in range(y-1):
        r = np.mean([cim1[row][col][0],cim2[row][col][0],cim3[row][col][0]]).astype(int)
        g = np.mean([cim1[row][col][1],cim2[row][col][1],cim3[row][col][1]]).astype(int)
        b = np.mean([cim1[row][col][2],cim2[row][col][2],cim3[row][col][2]]).astype(int)
        newimage[row][col] = [r,g,b]

fix, ax = plt.subplots(figsize=(10,10))
ax.axis('off')
ax.imshow(newimage)

Выходное изображение, которое я получаю из этого:

enter image description here

Лучший подход кэта проблема заключается в том, чтобы найти медиану из трех изображений.Чем больше изображений в алгоритме, тем лучше фон.Вот фрагмент кода, который я пробовал (просто заменить среднее значение медианой).Если у вас есть больше изображений, вы можете получить гораздо более точное изображение.

x,y,z = cim1.shape
newimage = np.copy(cim1)
for row in range(x-1):
    for col in range(y-1):
        r = np.median([cim1[row][col][0],cim2[row][col][0],cim3[row][col][0]]).astype(int)
        g = np.median([cim1[row][col][1],cim2[row][col][1],cim3[row][col][1]]).astype(int)
        b = np.median([cim1[row][col][2],cim2[row][col][2],cim3[row][col][2]]).astype(int)
        newimage[row][col] = [r,g,b]


fix, ax = plt.subplots(figsize=(10,10))   
ax.axis('off')
ax.imshow(newimage)

Окончательный результат:

enter image description here

Если выбыло больше изображений, вы можете полностью удалить передний план.Надеюсь, у вас есть идея, на которой вы можете опираться.

Мой код предполагает, что все ваши изображения имеют одинаковые размеры.Решение будет немного сложнее, если вы захватите изображения в разных видах.В этом случае вам, возможно, придется использовать алгоритм сопоставления с шаблоном (ваш псевдокод, похоже, делает что-то похожее), чтобы извлечь общий холст из ваших изображений.

0 голосов
/ 11 декабря 2018

Я не очень знаком с OpenCV, поэтому я надеюсь, что вы извините меня, если я не предоставлю фрагмент кода, который вы можете просто скопировать и вставить.Но если я правильно понимаю псевдокод, он делает следующее:

sequence = list of images
x will hold sum of backgrounds
y will hold the number of frames use to build x

for each index i in sequence:
    c = matrix of correlation coefficients between (sequence[i], sequence[i+1]) from matchTemplate
    mask = pixels that are highly correlated (90%+)
    x += actual pixels from sequence[i] & mask and sequence[i+1] & mask that are considered background
    y += 2 for every pixel in mask

bg = average of background images x / number of frames y

Итак, для каждой пары изображений отмечаются пиксели, которые одинаковы на обоих изображениях.Предполагается, что фон не меняется между соседними кадрами и передним планом.То, являются ли пиксели «одинаковыми», оценивается на основе корреляции, составляющей> 90%.Затем он берет все отмеченные пиксели и усредняет их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...