1

我在实验室工作,我们经常制作干细胞的延时系列(每小时图像)。目前的想法是将所有帧放在一起并制作一个视频来展示这个正在生长的细胞(类似于这个youtube 视频)。使用 OpenCV + Python 可以做到简单而酷炫。

import numpy as np
import os
import cv2

fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))

timelapse_folder = '../myTimeLapse/'

for file in os.listdir(timelapse_folder):
    frame = cv2.imread(timelapse_folder+file, 0)
    out.write(frame)

out.release()

但是我们有一个问题,所有图像的亮度都略有不同,所以我们的输出视频会出现一些闪烁。

我不允许上传视频,但这里有一些使用 gimp 生成的简单示例来可视化问题:

那是我从帧中得到的视频

在此处输入图像描述

这就是我想要的视频(最好尽量减少闪烁而不是完全删除它)

在此处输入图像描述

有没有办法调整所有图像(或可能在 2 个图像之间)的直方图或亮度,以使用 OpenCV 消除那些闪烁?

感谢您的每一个想法或提示!

编辑:安德鲁的想法产生的gif序列(下面的答案)

在此处输入图像描述

4

2 回答 2

1

如果您的数据在 3D 数组中,则不需要循环它来执行此操作。使用 5 张图像,例如 256 x 256,您应该能够构造一个arr.shape == (256, 256, 5). 我认为我最初的评论有点偏离,但下面的例子应该做到这一点。

target_array = []

for file in os.listdir(timelapse_folder):
    frame = cv2.imread(timelapse_folder+file, 0)
    if target_array:#Not entirely happy with this, but it should work
        target_array = np.dstack((target_array, frame))
    elif not target_array:
        target_array = np.asarray(frame)
target_array = target_array / np.max(target_array)
#target_array *= 255 #If you want an intensity value with a more common range here  
for idx in xrange(target_array.shape[2]):
    out.write(target_array[:, :, idx])

编辑:我用这个页面来解决一些关于寻址 3D 数组的问题

于 2016-09-07T13:05:15.903 回答
0

这些图像是 RGB 值还是灰度值?在阅读每一帧后,我会在你的循环中执行标准化:

frame = frame/np.max(frame)

如果是灰度值,则每个图像的值应介于 0 和 1 之间,但取决于图像的外观,您还可以尝试其他标准化,例如使用np.medianornp.mean代替np.max.

于 2016-09-07T07:37:05.343 回答