python - 从图像opencv python中的像素中减去不同的值
问题描述
我正在尝试复制本文中的研究来验证它。
长话短说:
我使用以下方法从视频中的所有帧中提取了像素行:
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 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
解决方案
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()
这给出了这个图像:
推荐阅读
- git - 第一次推送到 Gitlab 时得到![remote denied] development -> development (pre-receive hook denied)
- autodesk-forge - 要上传到 Autodesk Forge 的文件格式
- html - 单击R中的操作按钮时下拉
- javascript - 即使验证失败,jsPDF也会在提交时生成
- cmd - 如何使用来自多个目录的一个命令编译多个 proto 文件
- javascript - 计算唯一值算法
- python - 我想生成随机单词作为标签。我尝试了很多东西,但它不起作用
- python - 带有 IIS 服务器的 Django 意外重启
- wordpress - 我在登录我的 wordpress 网站时遇到问题,显示不可接受的问题
- sql - 我刚开始学习SQL,但无法进行查询,您能帮帮我吗?