2D降噪是对单个图像进行空域降噪,3D降噪是对时域中的多张图像进行降噪,利用了历史信息。这里介绍一种比较好实现的3D降噪算法——ViBe算法。

ViBe算法

ViBe是一种像素级视频背景建模或前景检测的算法,效果优于所熟知的几种算法,对硬件内存占用也少。ViBe是一种像素级的背景建模、前景检测算法,该算法主要不同之处是背景模型的更新策略,随机选择需要替换的像素的样本,随机选择邻域像素进行更新。在无法确定像素变化的模型时,随机的更新策略,在一定程度上可以模拟像素变化的不确定性。

该算法实质是找出运动的前景和静止的背景,对前景和背景采用不同的降噪参数,背景的降噪强,前景的降噪弱。

流程图

流程图

ViBe算法处理的是灰度图像,图像以一个与图像尺寸(M×N)大小相同的矩阵来表示,主要的计算发生在一个数量为NumSample(一般为20)个的背景样本(20个与图像尺寸大小相同的矩阵)与当前帧之间,背景样本会随着帧的变化而不断地更新。

详细步骤

  1. 初始化:将20个背景样本的值全设为0(20个M×N的元素全为0的矩阵);

  2. 根据第一帧得到初始样本:对于某个样本,当前坐标(x,y)处的值将随机取第一帧同样位置(x,y)处附近的8个值中的一个,构成初始背景样本,见下图。因为每次都是随机选取的,所以20个样本矩阵是不相同的。

初始样本选取

  1. 比较(第二帧)当前像素与样本:从第二帧开始后面的每一帧都会与样本做像素差的计算,以此来判断当前帧各个像素点是前景还是背景,并且在这个过程中不断更新样本。

    假设当前处理的像素位于(x,y),像素差为当前帧在这个位置的像素值(p)与某个样本在这个位置的值(q)的差,p-q。若这个值小于阈值(程序中是最后一排参数ArrayMatchThresh,根据增益不同取值不同,取值0代表0,取值1代表255),则计数加1,20个样本会从第一个一直计算到最后一个,倘若中途小于阈值的次数超过了MatchNum,则会停止计算,将(x,y)处的像素作为当作背景,若20个样本计算结束小于阈值的次数都没有超过MatchNum,则将(x,y)处的像素作为当作前景。在这里ArrayMatchThresh越大,MatchNum越小,越容易将当前像素判成背景,在这种情况下缓慢移动的物体会很难检测出,因此可以适当降低ArrayMatchThresh,增大MatchNum

  2. 更新样本当前像素所在坐标的值:当(x,y)处的像素被作为背景像素点时,将以1/UpdateFactor的概率更新20个样本中的一个样本,更新的方式是随机选择20个样本中的一个,将该样本在(x,y)处的值更换为当前帧在(x,y)处的值。UpdateFactor越大,更新样本的可能性越小,经过多次测验发现适当减小UpdateFactor的值,可以减小拖影现象,因为这样可以保证样本随着视频不断更新,更好地区分前景和背景。

  3. 更新样本当前像素所在坐标邻近坐标的值:除了上面更新(x,y)处的值以外,算法还会随机选择(x,y)处周围的8个点中的一个,将它的值更换为当前帧在(x,y)处的像素值,更新的概率也是1/UpdateFactor,也是更新20个样本中的一个。

  4. 以当前像素更新样本:当(x,y)处的像素被视为前景像素点的时候,会判断经过多个帧的处理之后是否很长时间里都把该点的像素视为前景点,如果很多个帧(也就是很长时间)该点都被当作前景点,那么可能是判断出错,会以1/UpdateFactor的概率将20个样本中的一个在(x,y)处的值更换为当前帧在(x,y)处的值。

  5. 区分了前景与背景,接下来将进行3D降噪处理,每一帧的处理都会参考前一帧的降噪结果,前景和背景会分离开分别进行降噪处理,它们参考前一帧的强度分别是ForegroundAlphaThreshBackgroundAlphaThresh这两个参数,也是根据增益的不同而划分成6个参数,为了减少拖影现象,这两个参数可以是党的降低,但降低之后会影响降噪的效果。