使用matlab修复视频中的荧光闪烁

时间:2014-06-23 11:43:06

标签: matlab flicker

我有几个视频序列表现出光强度闪烁(在荧光光源下)。 这是由于快门速度和/或采样率不是电频率的整数倍。例如 - 以1/50秒的快门速度拍摄视频,电子频率为60Hz。

一般而言 - 我需要在不知道采样率,电频率,视频帧率的情况下解决这个问题。我只是看到了闪烁,需要修复它们。

视频场景也包括移动物体(有些移动速度慢,有些速度与闪烁导致的强度快速变化一样快)。

有没有一种众所周知的处理这种闪烁的方法?

谢谢!

1 个答案:

答案 0 :(得分:4)

消除闪烁的常用方法如下。观察连续帧之间的差异图像,闪烁应该表现为沿图像垂直轴的强周期信号。因此,它应该在频域中具有强系数。因此,通过在频域中找到表示差异图像中的闪烁的系数,使它们无效并转换回空间域,可以检测和消除闪烁。

在伪代码中,此算法如下所示:

imDiff = I_{t+1} - I_t (Compute the difference between subsequent video frames)
imDiff = FilterImDiff(imDiff)
imDiffRowSum = RowSum(imDiff) (summing the rows of the diff image)
dctCoef = DiscreteCosineTransform(imDiffRowSum)
flickeringDctCoef = SomeHeuristicToFindFlickeringCoef(dctCoef)
flickeringIm = CloneColumn(InverseDiscreteCosineTransform(fixedDctCoef), numCols)
fixedimDiff = imDiff - flickeringIm 
fixedI_{t+1} = I_{t+1} + fixedimDiff 

其中:

  • RowSum(x)将m x n图像作为输入,并返回大小为m x 1的列向量,其中元素i包含图像x中第i行的总和。
  • CloneColumn(x,n)采用大小为m的列向量x并将其克隆n次以创建m x n矩阵。
  • numCols是输入图像中的列数。
  • SomeHeuristicToNullifyFlickeringCoef的简单算法可以选择前几个最大系数,如果它们大于某个阈值。
  • FilterImDiff应丢弃不包含闪烁的差异图像中的内容,例如前景对象的移动。例如,具有大于闪烁的最大幅度的时间差的像素。此外,太亮或太暗的像素通常不会闪烁。