Brightness/Histogram 延时图像的归一化
Brightness/Histogram normalization for time lapse images
我在实验室工作,我们经常制作干细胞的延时系列(每小时图像)。目前的想法是把所有的帧放在一起,制作一个视频来展示这个正在生长的细胞(类似于这个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 生成的简单示例来可视化问题:
这是我从帧中得到的视频
这就是我想要的视频(如果能最大程度地减少闪烁而不是完全删除它也很棒)
有没有办法调整所有图像(或可能在 2 个图像之间)的直方图或亮度以使用 OpenCV 消除那些闪烁?
感谢您的每一个想法或提示!
编辑:安德鲁的想法制作的gif序列(下面的答案)
这些图片是RGB值还是灰度值?我会在阅读每一帧后在你的循环中执行标准化:
frame = frame/np.max(frame)
在灰度值的情况下,每个图像的值应介于 0 和 1 之间,但根据图像的外观,您还可以尝试其他标准化,例如使用 np.median
或 np.mean
而不是 np.max
.
如果您的数据位于 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 数组寻址的一些问题
我在实验室工作,我们经常制作干细胞的延时系列(每小时图像)。目前的想法是把所有的帧放在一起,制作一个视频来展示这个正在生长的细胞(类似于这个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 生成的简单示例来可视化问题:
这是我从帧中得到的视频
这就是我想要的视频(如果能最大程度地减少闪烁而不是完全删除它也很棒)
有没有办法调整所有图像(或可能在 2 个图像之间)的直方图或亮度以使用 OpenCV 消除那些闪烁?
感谢您的每一个想法或提示!
编辑:安德鲁的想法制作的gif序列(下面的答案)
这些图片是RGB值还是灰度值?我会在阅读每一帧后在你的循环中执行标准化:
frame = frame/np.max(frame)
在灰度值的情况下,每个图像的值应介于 0 和 1 之间,但根据图像的外观,您还可以尝试其他标准化,例如使用 np.median
或 np.mean
而不是 np.max
.
如果您的数据位于 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 数组寻址的一些问题