zoukankan      html  css  js  c++  java
  • 【数字图像处理】帧差法与Kirsch边缘检测实现运动目标识别与分割

    本文链接:https://blog.csdn.net/qq_18234121/article/details/82763385

    作者:冻人的蓝鲸梁思成

    视频分割算法可以从时域和空域两个角度考虑。时域分割算法利用视频流时域连续性,通过 相邻帧的时域变化来检测运动目标。在摄像头静止的情况下,常用的方法有帧差法减背景法

            帧差法比较直观实用,对光照的变化干扰不敏感,但是 对目标的检测不准确,对于缓慢运动的目标甚至可 能无法提取出目标边界,对于快速运动的目标提取 出的目标区域又过大。减背景法容易得到目标的准 确描述,对静止和非静止的目标都适用,但是背景更新的计算量比较大,还必须建立合适的模型,同时在 背景大幅运动的场合也不适用。

            空域分割算法利用图像的空域属性( 颜色、 亮度、纹理以及边缘信息等) 来提取视频对象。例 如基于边缘的目标提取算法,虽然算法能检测出精 确的图像边缘,但是检测过程存在较大的盲目性,检 测出的边缘不仅包括所需要的运动目标的边缘,连 背景中的静止物体的边缘也一并被检测出来,这就 给目标分割带来困扰。

    1.运动目标检测

    采集某一时间段里的视频序列图像,设f( x,y, t) 表示t时刻当前帧,其前后相邻的两帧分别用 f( x,y,t - 1) 和f( x,y,t + 1) 表示。t时刻相邻两帧之间作差分运算:

      |f(x,y,t)-f(x,y,t-1)|<T            背景
      |f(x,y,t)-f(x,y,t-1)|>=T           前景
      其中f(x,y,t),f(x,y,t-1)分别为t,t-1时刻对应像素点的像素值,T为阈值。

    以下图为例:

     

           仅根据两帧序列图像间的差分来检测运动目标存在许多问题。如图1 所示,d、e 两帧图像差分的结果中,由于相邻两帧之间的差分并不完全是运动目标,上一帧被运动目标覆盖的背景,会在下一帧显露出来,并被误判为前景目标,这样导致得到的运动目标区域包括背景区域,因此会比实际运动区域大。

          在实际应用中,为了后续的运动分析与理解,总希望得到最准确的运动目标,因此本文中采用三帧差分代替两帧差分来实现运动目标检测。三帧差分法利用两帧差分结果Dt,t-1 ( x,y,t) 和 Dt,t + 1 (x,y,t) 的“与”运算确定当前帧f( x,y,t ) 中运动目标边缘D3( x,y,t) ,即

     

    其中,× 为与运算。图1 是一段subway 视频,图1f为得到的运动目标边缘D3(x,y,t) ,可以看出三帧差分法有效地解决了运动目标的遮挡和背景重现问题,得到了准确的运动目标边缘,并且在一定的程度上抑制了光照、阴影以及噪声的影响。

    ------------------------------------------------------------------------分界线----------------------------------------------------------------------------------------

           经过“与”运算后运动区域中的噪声得到了一 定程度的抑制,但在D3(x,y,t) 中还存在着部分孤 立的噪声点,若不加处理将影响对运动目标的有效 检测。可用邻域平均、中值滤波和高斯低通滤波等方法来抑制噪声。

           对于邻域平均法,如把求灰度平均值的邻域取得太大,或反复进行若干次操作,则会使图像模糊,图像的质量也会随之降低。中值滤波不仅能有效滤除图像中的孤立噪声点,与邻域平均法相比还能有效保护边界信息。图2为中值滤波前后的效果图。邻域S 采用大小为3 × 3 的窗口。

     

    2.边缘检测方法之Kirsch边缘检测

            该算法既能保持图像的边缘细节又具有一 定的抗噪声能力,有效地克服了经典的一阶和二阶微分边缘检测算子对噪声敏感的缺点。虽然该算法计算开销比较大,但它可以产生最大的梯度边界。 Kirsch 算子从8 个方向对图像边缘信息进行提取。 详细的边缘检测算法描述如下: 首先获得如图3 所示的8个滤波模板。

     

           下一步的操作有点绕,具体是:将这八个模板依次在图像中一点(x,y)处进行滤波,那么会产生八个值,选出其中的最大值Fmax。按这种取值方法,得到了整幅图的滤波值。

           由fmax ( x,y ) 组成滤波图像,基于滤波图像中的极值点可得到极值点图像FImax ( x,y) ,FImax ( x,y) 定义为:

    FI ( x,y) 表示图像中( x,y) 处的像素值,若 ( x,y ) 在滤波图像中是极值点,则FI ( x,y ) = fmax ( x,y ),否则FI( x,y ) = 0。

    根据极值点图像FImax和预设的阈值T,可得到边缘图像EI,EI 定义为:

     

    EI( x,y) 表示边缘图像中( x,y) 处的像素值,若FI( x,y) > T,则EI( x,y) = 1,否则,EI( x,y) = 0

           在边缘检测时,一些重要的边缘细节由于干扰或对比度不足变得模糊、微弱。直接利用Kirsch 边 缘检测获得的边缘线容易出现断点,效果不是很理 想。本文中通过图像边缘连续性检测来调节阈值 T,从而得到连通的图像边缘。通常在边缘不连续的地方,象素值会有较大的差异,文中用4 × 4 的方向模板计算目标点周围6个方向上的差值,当最大差值超过某个门限值时,则可认为该点为不连续点,由此来检测图像边缘的不连续性。通过该算法在抑制噪声、保证边缘连续性的同时较好地保护了低强度的边缘细节,获得了令人满意的效果。算法流程图如左图,预设的阈值T 取不同值的情况下,边缘检测效果如右图所示。

     

           阈值T决定着边缘定位的精度和边缘的连续。T较小时,边缘定位精度高,连续性差,低强度的边缘细节被漏检;T 较大时,情况正好相反,因此,要根据需要调节阈值T。

    3.运动目标分割

    设D3(x,y) 是经过中值滤波后由三帧差分得到的运动区域掩模,EI(x,y,t) 是由Kirsch 边缘检测算法得到的当前帧的边缘掩模,则最终的运动目标边缘图Mt为:

     

    结果下图所示:

            由图6可以看出,将时空域相结合可以准确的检测出运动目标的边缘,有效地克服了阴影问题。但所得到的边缘仍存在不连续的问题,需要对运动对象边缘进行连接。

    4.目标提取

            文中采用自适应数学形态学对图像边缘进行连接,对每一个端点,用自适应椭圆结构元素进行自适应膨胀运算,结构元素的大小和方向可根据像素的局部特性如斜率、曲率进行调整,得到膨胀后闭合的运动目标边缘B( x,y,t ) ,因为经过膨胀处理,原图像边缘难免会变宽,因此需要对处理后的B( x,y,t) 图像结合EI( x,y,t ) 重新进行边缘定位,得到最终的闭合的运动目标边缘O(x,y,t) :

     

    最后,对闭合的运动目标边界O(x,y,t) 进行区域填充,得到运动目标的二值掩模图像,将其与当前帧f( x,y,t) 相结合,便实现了对运动目标的分割,结果上面右图 所示。与图1中基于帧差法的分割结果相比较其定位精度高,分割效果好

    5.结论和小结

            文中采用的方法综合利用了时域和空域的检测结果来提高分割性能。帧差法提取运动信息的突出特点是实现简单、运算速度快,而且由于相邻帧间环境亮度变化很小,受光照突变影响较小,具有较强的鲁棒性。结合改进的Kirsch 边缘检测算法和基于形态学的边缘连接算法,有效地消除了三帧差分带来的“重影”和“空洞”现象,提取了关于运动目标更为完整的区域。实验表明,本算法能够快速响应实际场景的变化,准确、有效地进行运动对象分割。

    原文参考地址:http://suo.im/4LuhH4

  • 相关阅读:
    slqite3练习
    QStackedWidget 与 QStackedLayout 的用法区别
    pyqt5 菜单,工具栏,线程,matplotlib
    PyQt5 结合 matplotlib 时,如何显示其 NavigationToolbar
    tkinter事件高级用法实例
    tkinter菜单图标,工具栏
    tkinter界面卡死的解决办法
    8个经过证实的方法:提高机器学习模型的准确率
    结合Scikit-learn介绍几种常用的特征选择方法
    scikit-learn的主要模块和基本使用
  • 原文地址:https://www.cnblogs.com/-wenli/p/11747060.html
Copyright © 2011-2022 走看看