Как удалить / удалить выбросы из массива Numpy - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть код, написанный для получения в среднем нескольких изображений для извлечения фона, который в основном удаляет движущиеся объекты на изображениях.Я пытался отбросить выбросы перед усреднением, чтобы получить только фон, а не блеклые объекты.Я перепробовал несколько трюков, последний из которых был таким:

#!/usr/bin/env python3

import numpy as np
from PIL import Image
from scipy import stats

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

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

mean = np.mean(sequence, axis=3)
sd = np.std(sequence, axis=3)

finalSequence = [x for x in sequence if (x > mean - 2 * sd)]
finalSequence = [x for x in finalSequence if (x < mean + 2 * sd)]

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

# Save to disk
Image.fromarray(result).save('result.png')

Это дает мне ошибку:

final_list = [x for x in sequence if (x > mean - 2 * sd)]
ValueError: operands could not be broadcast together with shapes (474,3,3) (266,474,3) 

Любая помощь или обходной путь для этого будетоценили.Спасибо!

1 Ответ

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

Трудно отлаживать без установленных пакетов.Ваша операция не работает, потому что массивы имеют разные формы ноль фигур .Вы можете просмотреть их с помощью:

print(x.shape)
print(mean.shape)
print(sd.shape)

Вы также можете умножить среднее значение / sd на np.ones (sequence.shape), а затем сравнить целые массивы вместо того, чтобы проходить через них (должно быть более эффективным)

mean_vec = mean * np.ones(sequence.shape)
sd_vec = sd * np.ones(sequence.shape)
sequence > (mean_vec - 2 * sd_vec)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...