【问题标题】:Subtracting a varying value from pixels in image opencv python从图像opencv python中的像素中减去不同的值
【发布时间】:2020-03-14 13:47:18
【问题描述】:

我正在尝试在此 paper 中复制该研究以进行验证。

长话短说:

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

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)) 在图中很难看到。做这个 调制更明显,我们减去了一个缓慢变化的分量 沿图中的垂直方向与每个像素分开 时变值,从而增强交流分量(AC) 光调制,以心跳或更高的速率变化。

如何从values_list 中存储的像素中减去一个缓慢变化的分量,即每一帧图像的像素?

附加:

复制图的values_list如下

下载Electronic supplementary materialpaper底部的视频链接,使用下面的代码将视频转成帧,再套用上面的代码。

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 之间(按列)。

标签: python arrays opencv matplotlib image-processing


【解决方案1】:
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()

这给出了这张图片:

【讨论】:

  • @Pam 复制评论
  • 白线暗示你可能已经得到了一些环绕。独立插入每个“列”(或行,在你的情况下,我猜)(所以如果第一个像素从 0-10 变化,则将其映射到 1-255,如果下一个像素从 40-80 变化,则映射) .您实际上是在跟踪单个像素(没有空间变化,一整行像素),因此我认为将每个像素系列视为独立的。
猜你喜欢
  • 1970-01-01
  • 2017-12-12
  • 2014-06-13
  • 2016-01-08
  • 1970-01-01
  • 2017-06-23
  • 2011-04-09
  • 1970-01-01
  • 2015-06-26
相关资源
最近更新 更多