Как взять стандартное отклонение изображения - PullRequest
0 голосов
/ 26 марта 2020

Моя цель - взять среднее из 200+ изображений, а затем найти стандартное отклонение от указанного среднего. Спросите пользователя о пороге, а затем сравните порог со стандартным отклонением. Если порог <стандартное отклонение для данного конкретного пикселя, измените его на красный [255,0,0]. Моя проблема связана со стандартным отклонением пикселя. Мы будем благодарны за любую помощь красный </a>

и вот для l oop отладка в действии

[avg_img изменяется на 255,0,0

Фрагмент того, на что похож std

[[0.19792126 0.05137325 0.03966657]
  [0.09997863 0.06348856 0.07472634]
  [0.0367469  0.18667144 0.21834356]
  ...
  [0.02421235 0.02454335 0.14083997]
  [0.02319027 0.02351524 0.13969136]
  [0.02285284 0.02317629 0.13930877]]

 [[0.03304812 0.06428259 0.04262938]
  [0.0978733  0.02841616 0.04049174]
  [0.09566899 0.02877731 0.0357872 ]
  ...
  [0.08500231 0.03502595 0.12032651]
  [0.08347222 0.03630779 0.1217759 ]
  [0.08385488 0.03598539 0.12141356]]

1 Ответ

1 голос
/ 27 марта 2020

Поскольку вы не предоставили никаких входных данных, я использовал отдельные кадры этой анимации в качестве своих 18 входных кадров для усреднения по:

enter image description here

Я извлек их, используя ImageMagick :

magick animation.gif -coalesce frame-%02d.jpg

Код, который я придумал, выглядит так:

#!/usr/bin/env python3

import glob
import numpy as np
from PIL import Image

# Generate list of image names
names = glob.glob('frame-*.jpg')

# Load all images into list
images = []
for filename in names:
    im = Image.open(filename)
    images.append(np.array(im))

# Generate average image, where each pixel is the average of that pixel position across all images
average = np.mean(images, axis=0)
Image.fromarray(average.astype(np.uint8)).save('tmp-average.png')    # DEBUG

# Generate stdev image, where each pixel is the stdev of that pixel position across all images
stdev = np.std(images, axis=0)
Image.fromarray(stdev.astype(np.uint8)).save('tmp-stdev.png')        # DEBUG

threshold = 80
average[np.any(stdev>threshold, axis=2)] = [255,0,0]
Image.fromarray(average.astype(np.uint8)).save(f'result.png')

И результат такой:

enter image description here

Ради интереса я немного позаботился о том, как установить порог по-разному:

enter image description here

...