Вычитание изменяющегося значения из пикселей в изображении opencv python - PullRequest
0 голосов
/ 14 марта 2020

Я пытаюсь повторить исследование в этой статье , чтобы проверить это.

Короче говоря:

Я выделил ряд пикселей из всех кадров в использование видео:

values_list = []

for filename in glob.glob('frames//*.png'):

    img = cv2.imread(filename,0)    
    values_list.append(img[100, :]) #Get all rows at y-axis 17 which is the row pixels

Затем я создал сюжет, используя:

fig, ax = plt.subplots()
width = 10
xlim = 0, width*len(values_list)
ylim = 0, max([len(v) for v in values_list]) + 2


ax.set(xlim=xlim, ylim=ylim, autoscale_on=False)
for i in range(len(values_list)):
    plt.imshow(np.array(values_list[i]).reshape(-1, 1), extent=[i * width, (i + 1) * width, 0, len(values_list[i])],
               origin='lower', cmap='gray')

ax.set_aspect('auto')

fig.set_size_inches(20, 10.5)

plt.savefig('myimage.png', format='png', dpi=1000)

Это дает следующий сюжет

enter image description here

Вышесказанное эквивалентно тому, что они показывают на б) c) и г) из статьи авторов (но по горизонтали вместо вертикали и в оттенках серого вместо цветов). Как они преобразовали его в эквивалент е) е) и ж), как показано ниже?

enter image description here

Все претензии

Эта модуляция (b) c) и d)) плохо видна на рисунках. Чтобы сделать эту модуляцию более очевидной, мы вычли медленно изменяющийся компонент вдоль вертикального направления на диаграмме отдельно от значения переменной времени каждого пикселя, таким образом усиливая чередующийся компонент (A C) модуляции света, который изменяется при сердцебиении или выше скорость.

Как вычесть медленно меняющийся компонент из пикселей, хранящихся в values_list, которые являются пикселями изображения в каждом кадре?

Дополнительно:

values_list для репликации графика выглядит следующим образом

Загрузите ссылку на видео внизу бумаги под Electronic supplementary material и используйте следующий код для конвертировать из видео в кадры, а затем применить код выше.

import cv2

vidcap = cv2.VideoCapture('video/2.mp4')
success, image = vidcap.read()
count = 0
while success:

    cv2.imwrite("frames/%d.png" % count, image)
    success, image = vidcap.read()
    count += 1

1 Ответ

0 голосов
/ 14 марта 2020
import glob
import cv2

import matplotlib.pyplot as plt
import numpy as np
import random

values_list = []
values_mean = []

count = 0

for filename in glob.glob('video//frames//*.png'):

    count +=1
    img = cv2.imread(filename,0)    

    values_list.append(img[100,:]) #Get all rows at x-axis 17 which is the row pixels
    values_mean.append(np.round(np.mean(img[100:]), decimals=0))

values_list = np.array(values_list)
values_mean = np.array(values_mean).reshape(-1,1)
new_column_value = values_mean - values_list
new_column_value_scaled = np.interp(new_column_value, (new_column_value.min(), new_column_value.max()),(0, 255))

plotted_values_list = new_column_value_scaled

fig, ax = plt.subplots()
width = 10
xlim = 0, width*len(values_list)
ylim = 0, max([len(v) for v in values_list]) + 2


ax.set(xlim=xlim, ylim=ylim, autoscale_on=False)

for i in range(len(plotted_values_list)):
    plt.imshow(np.array(plotted_values_list[i,:]).reshape(-1, 1), extent=[i * width, (i + 1) * width, 0, 
                                                                          len(plotted_values_list[i,:])],origin='lower', cmap='gray')

ax.set_aspect('auto')

fig.set_size_inches(20, 10.5)

plt.savefig('myimage_whole.png', format='png', dpi=500)
#plt.show()

, который выдает это изображение:

enter image description here

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