Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从图像opencv python中的像素中减去可变值_Python_Arrays_Opencv_Matplotlib_Image Processing - Fatal编程技术网

从图像opencv python中的像素中减去可变值

从图像opencv python中的像素中减去可变值,python,arrays,opencv,matplotlib,image-processing,Python,Arrays,Opencv,Matplotlib,Image Processing,我试图复制这项研究来验证它 长话短说: 我使用以下方法从视频中的所有帧中提取像素行: 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 然后,我使用以下方法创建了一个绘图:

我试图复制这项研究来验证它

长话短说:

我使用以下方法从视频中的所有帧中提取像素行:

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)
这给出了下面的图

上述内容相当于作者论文中b)c)和d)的内容(但水平而非垂直,灰度而非颜色)。他们是如何将其转换为如下所示的e)f)和g)的等价物的

所有的索赔都是无效的

该调制(b)c)和d)在图中不可见。做这个 更明显的是,我们减去了一个缓慢变化的分量 在图中沿垂直方向与每个像素分开 时间变量值,从而增强 光调制,以心跳或更高的速率变化

如何从存储在
values\u list
中的像素中减去缓慢变化的分量,这些像素是每帧图像的像素

附加服务:

复制图形的
值\u列表
如下所示

下载
电子补充资料下底部的视频链接
,使用以下代码将视频转换为帧,然后应用上面的代码

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
它给出了这幅图像:


我不确定这是否是他们的意思,但我看不到蓝色的图案,但可以在其他两个中看到。我会对他们图像中的每一列取平均值,从该列中减去它,然后将所有值缩放到0到255之间(按列)。@Pam要复制注释,白线意味着可能有一些环绕。独立地插值每个“列”(或行,我猜在您的情况下是这样的)(因此,如果第一个像素从0-10变化,那么将其映射到1-255,如果下一个像素从40-80变化,则映射该像素)。你基本上是在跟踪一个像素(没有空间变化,一整行像素),所以我认为把每一系列像素看作是独立的。
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()