时间推移图像的亮度/直方图标准化

时间:2016-09-07 06:59:40

标签: python opencv timelapse

我在实验室工作,我们经常制作干细胞的时间间隔系列(图像每小时一次)。目前的想法是将所有帧放在一起并制作一个视频来显示这些正在增长的单元格(类似于此youtube video)。使用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生成的简单示例来显示问题:

这是我从帧中获得的视频

enter image description here

这是我想要的视频(最小化闪烁而不是完全删除它也很棒)

enter image description here

有没有办法调整所有图像(或两幅图像之间)的直方图或亮度,以便使用OpenCV消除这些闪烁?

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

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

enter image description here

2 个答案:

答案 0 :(得分: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])

编辑: 我使用this page解决了一些解决3D数组的问题

答案 1 :(得分:0)

那些图像是RGB还是灰度值?我会在阅读每一帧后在循环中执行规范化:

frame = frame/np.max(frame)

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