DSP上玩玩视频雨滴检测与消除

  • 用陈年老DSP玩一下潮流的去雨算法
    • 理论介绍
      • LIP模型
      • 连通域约束
      • 雨滴消除
    • 平台参数
      • DSP平台图像采集接口
      • DSP平台视频驱动接口
    • 程序设计
      • 核心算法
    • 实验结果
    • 总结
    • 参考材料

用陈年老DSP玩一下潮流的去雨算法

视频图像去雨是指从视频图像中检测雨滴并将其去除的一种关键技术,也是计算机视觉中 的一个重要研究分支,近年来已得到深入的研究,在目标检测、识别、追踪、分割和监控等领域有巨大的应用前景。随着计算机视觉技术的迅猛发展,户外视觉系统开始广泛应用于军事、交通及安 全监控等领域。然而,由于各类恶劣天气造成的图像模糊和信息覆盖等问题,会直接或间接影响户外视觉系统的性能。建立一个去除各种恶劣天气对视频图像带来影响的全天候户外视觉系统很有必要。
资源有限,就暂时不玩深度学习那一套了,下次一定!具体的主要考虑以下方案:首先采用符合人眼视觉的对数图像处理方法, 用灰色调替代传统的亮度值, 分析受雨滴影响的像素光度特征, 建立灰色调约束条件提取候选雨滴, 可以凸显雨滴信息, 检测效果更佳。为满足实时性, 实验中采用连续三帧图像进行雨滴检测.,为去除干扰噪声, 实验对候选雨滴倾斜方向和长宽比进行实时的约束去除干扰.。针对去雨过程中可能导致的边缘突变问题, 实验中采用一种加权重构方法,能够有效改善去雨后的图像质量。

理论介绍

LIP模型

在图像处理中,一般的“+”和“x”算术操作不适用于一些实际的图像处理工作,两幅图像直接进行相加(或相乘)所得的结果与人的视觉效果有一定的差距,并且会产生“超区间值”问题,文献[5]中提出的LIP模型,它提供了一种新的算术结构,该模型定义了新的加法、减法、乘法等向量运算 。应用该模型的图像灰度值都在[0,M)区间内, 从而避免产生超区间值的问题,也与人眼的视觉系统的饱和特性相一致。在LIP框架中,LIP图像与输入的实数空间图像f的映射关系如下所示:


其中,灰度值f定义在[0,M)的范围内,M为正值常数。 LIP模型曲线如图1所示。

由上述曲线得知,该非线性变化过程扩展低灰度值而压缩高灰度值,实现了图像灰度扩展和压缩的功能,让图像的灰度分布更加符合人的视觉特征。
加法运算:灰度值f与g的加法表示为:

减法运算:灰度值f与g的减法表示为:

数乘运算:灰度值f与正实数的数乘法表示为:

由于雨滴会折射大范围的环境光线, 因而场景被雨滴遮挡后的亮度往往高于该处原先前几帧的相对背景的速度;同时,由于雨滴的下降速度较快,同一个像素的位置很少在连续三帧的图像中同时出现雨滴遮挡的问题于LIP模型的雨滴的灰度变化函数是呈现亮度递增变化函数(式(1)),而图像受到雨滴遮挡时也是呈现同样的灰度递增。因此,利用连续三帧的雨滴LIP帧差的检测雨滴,如下式所示。

其中,f(n-1),f(n),f(n+1)是连续的三帧图像的LIP数据,运动LIP的差值运算相比于直接的亮度图像的差值运算来说,灰度值差值的权重和调整的灰度的差值是随着亮度值自适应调节的,相比于直接的帧亮度线性差值来说,具有非线性的特点,保留并凸显了更多雨滴及其信息。

连通域约束

由于受到重力因素的影响,在同一个场景中雨滴的长宽比往往呈现一个的有规律的分布特点。因此,在任意一副雨滴的帧差图(二值图)中,雨滴往往是呈现一个连通区域的分布。通过检测场景中雨滴的主成分分布方向,u1为第一主成分方向,u2为第二主成分方向,统计第一主成分方向上雨滴的长度和第二主成分方向上雨滴的宽度,计算雨滴的长宽比例,通过长宽比例的约束,可以大幅度的减少环境亮度噪点的影响。

令Ni为雨滴连通区域的像素个数。

其中,(xik,yik),k=1,2,3,…Ni是该雨滴中每个像素相对于该雨滴的质心的坐标。
令u1和u2为协方差矩阵的特征向量,分别计算器对应的特征值。u1即为雨滴长度方向,u2即为雨滴的宽度方向。令雨滴在图像中的水平宽度为l,垂直宽度为w,通过式(9)和式(8)即可得到雨滴的长度L和宽度W。

雨滴消除

为了从视频图像中去除雨滴, 需要估计当前帧被雨滴遮挡的背景的像素亮度值。由于大部分的雨滴的像素在相邻两帧基本不会同时被雨滴遮挡, 可利用前一帧及后一帧中该像素的平均值作为当前帧的值。

为了提高去雨后的图像质量,采用式 (11) 所示的加权重构法进行雨滴消除: 先对检测到的雨滴二值化图像实施高斯模糊, 然后, 将该图中确定的雨滴部分的数值归一化至 1, 再将该图作为权重w(x,y)进行图像的重建。

平台参数

仿真平台
操作系统:WINDOWS 8.1
仿真软件:MATLAB 2015
硬件平台
操作系统:WINDOWS XP(VMWARE)
硬件芯片:ICETEK-DM642
开发软件:CCS2.2.1

DSP平台图像采集接口

人眼对亮度信息是敏感的,主要通过亮度差别来分辨物体形状的细节,而对彩色信息是不敏感的,人眼区分不出物体颜色上的细小的变化,或者说人眼不容易觉察出来图像的色彩的细节部分的变化。在计算机中,彩色视频信号首先分解为亮度信号 Y 和色度信号,色度信号再分解为 U色差信号和 V 色差信号,最后由 YUV 三个分量经过矩阵运算变换为 RGB 信号,以便在显像管上显示。在嵌入式领域,数字视频也是可以应用的,比如用单片机或 DSP 来处理数字视频数据。模拟视频信号解码并量化成连续的数字视频流后所包含的一些信号元素:模拟视频信号每秒 25 帧,每帧周期 40ms,而每帧又分为 2 场,每场 20ms,先输出的是奇场,然后是偶场,奇场的行号为第 1 至 312.5 行,偶场的行号为第 312.5 至 625 行,其中,奇场的第23.5 至 310 行包含有效的视频信号,偶场的第 336 至 622.5 行包含有效的视频信号。把模拟视频信号解码为 YUV 分量后,分别进行 A/D 量化采样,转换为数字视频流,时间上也应该是按上面的顺序依次输出。

图象传输格式(H.26x):

  • SQCIF: Sub-QCIF, 128x96
  • QCIF: Quarter-CIF(1/4 x CIF Resolution), 176x144
  • CIF: Common Intermediate Format, 352x288
  • 4CIF: 4 x CIF Resolution, 704x576(本实验使用)
  • 16CIF: 16 x CIF Resolution, 1408x1152

ICETEK-DM642-AVM 板上的视频接口

(1) 视频输入:视频信号为标准 PAL/NTSC 制电视模拟信号。每路信号经过视频解码芯片(AD 转换芯片)TVP5150A 解码成数字并行信号 BT656 码流送 DM642 的视频接口。
(2) 视频存储: DM642 的视频接口解码 BT656 码流,得到图象,自动通过 EDMA 传输到SDRAM 中存储。
(3)图象处理: DM642 的 CPU 通过访问 SDRAM 中的图象,进行处理后送输出缓冲区(SDRAM 中)。
(4) 视频输出: DM642 的视频接口(输出)自动通过 EDMA 从 SDRAM 中的输出缓冲区取得数据后形成 BT656 码流送出。
(5) TV 输出:视频编码芯片(DA 转换芯片)SAA7104 接收输出 BT656 码流,转换成标准电视信号输出。

DSP平台视频驱动接口

(1)DDK
DSP/BIOS Driver Developer’s Kit,提供 C 语言接口的 DSP 片上或扩展的外围设备的驱动,它是 CSL 的补充, DDK 使用 CSL 提供的接口初始化和操作这些外设。例如它提供音频编码解码(Codecs)、 PCI 控制器、视频接口(Video Ports)的驱动程序。

(2) 设备驱动程序在应用程序中的位置

(3)在程序中使用设备驱动程序

①在 DSP/BIOS 设置程序中添加用户定义设备(Device Drivers -> User Defined Devices)。
②在 DSP/BIOS 设置程序中添加或在程序运行时添加 PIO/DIO/GIO 的驱动实例。
③在程序中通过设备驱动程序初始化设备。
④在程序中使用设备驱动程序功能调用实现对外设的操作。

(4)VPort 接口的设备驱动程序

程序设计

算法使用MATLAB脚本语言和DSP(标准c语言)共同编写,前期通过MATLAB平台进行算法的仿真和调试,后期通过搭载DSP(DM-642)芯片实现。算法的整体流程如下(简单点)

核心算法

(1)LIP帧差函数
MATLAB版本

M=255.0;
a =uint8( -M * log(1-(f0/M)));
b=uint8( -M * log(1-(f1/M)));
function c = lipsub(a,b,M)c = M * ((a - b)/(M - b));if(c<0)c=-c;end
End

DSP版本

void deltaImg()
{int i,j;float y1,y2,y3;unsigned int t1,t2;unsigned char *py1,*py2,*py3,*pyout;for ( i=0;i<SIMGHEIGHT;i++ )   //行数,每行一次{   for ( j=0;j<SIMGWIDTH/2;j++ )   //列720点{py1 = m_dbFrameY_1 + i*SIMGWIDTH + j;py2 = m_dbFrameY_2 + i*SIMGWIDTH + j;py3 = m_dbFrameY_3 + i*SIMGWIDTH + j;pyout = m_dbFrameY_out + i*SIMGWIDTH + j;y1=(*py1);y2=(*py2);y3=(*py3);y1 = -M * log(1-(y1/M));y2 = -M * log(1-(y2/M));y3 = -M * log(1-(y3/M));  t1 = lipsub(y1,y2,M);t2 = lipsub(y2,y3,M);if( t1>30 && t2>30)(*pyout) = 255;else(*pyout) = 0;(*(pyout+(SIMGWIDTH/2)))=(unsigned char)y2;}}
}

(2)雨滴约束筛选函数
MATLAB版本

result = bwfill(RainImg, 'holes');//膨胀和腐蚀预处理result = bwareaopen(result, 10);result = bwfill(result, 'holes');result = bwfill(result, 'holes');result = bwfill(result, 'holes');[segments, num_segments] = bwlabel(result);%将成块的区域标号status = regionprops(segments, 'BoundingBox');for i=1:num_segmentswidth = status(i).BoundingBox(3);%连通的区域的宽度height = status(i).BoundingBox(4);%连通的区域的高度ratio =height/width;%宽高比例if height >5 && width < 30[a,b]=find(segments == i);for k=1:length(a)segments(a(k),b(k))=255;endelse[a,b]=find(segments == i);for k=1:length(a)segments(a(k),b(k))=0;endendend

DSP版本

void CntImg()
{int i,j;float x1,x2,x3,x4;unsigned char *px1,*px2,*px3,*px4;unsigned int area_num = 1;unsigned int  *area = (unsigned int*)malloc(area_num*sizeof(unsigned int));area[0]=0;//膨胀操作for ( i=1;i<SIMGHEIGHT-1;i++)   //行数,每行一次{   for ( j=1;j<(SIMGWIDTH/2)-1;j++ )   //列720点{px1 = m_dbFrameY_out + (i-1)*SIMGWIDTH + j - 1;px2 = m_dbFrameY_out + (i-1)*SIMGWIDTH + j;px3 = m_dbFrameY_out + i*SIMGWIDTH + j - 1;px4 = m_dbFrameY_out + i*SIMGWIDTH + j;x1=(*px1);x2=(*px2);x3=(*px3);x4=(*px4);if(x1==255 && x2==255 && x3==255){x4=255;(*px4) = x4;}     }}//腐蚀操作for ( i=1;i<SIMGHEIGHT-1;i++ )   //行数,每行一次{   for ( j=1;j<(SIMGWIDTH/2)-1;j++ )   //列720点{px1 = m_dbFrameY_out + (i-1)*SIMGWIDTH + j - 1;px2 = m_dbFrameY_out + (i-1)*SIMGWIDTH + j;px3 = m_dbFrameY_out + i*SIMGWIDTH + j - 1;px4 = m_dbFrameY_out + i*SIMGWIDTH + j;x1=(*px1);x2=(*px2);x3=(*px3);x4=(*px4);if((x1+x2+x3)==0){x4=0;                   }else{x4=255;}(*px4) = x4;}}//统计连通区域for ( i=1;i<SIMGHEIGHT-1;i++ )   //行数,每行一次{   for ( j=1;j<(SIMGWIDTH/2)-1;j++ )   //列720点{px1 = m_dbFrameY_out + (i-1)*SIMGWIDTH + j;px2 = m_dbFrameY_out + i*SIMGWIDTH + j - 1;px3 = m_dbFrameY_out + i*SIMGWIDTH + j; x1=(*px1);x2=(*px2);x3=(*px3);if(x3==255){if(x1!=255 && x1!=0){x3=x1;area[(int)x1-1]++;}else if(x2!=255 && x2!=0){x3=x2;area[(int)x2-1]++;}else{x3=area_num;area_num++;area = (unsigned int*)realloc(area, area_num*sizeof(unsigned int));area[area_num-1]=0;}(*px3) = x3;               }}}for(i=0;i<area_num-1;i++){if(area[i]>30)continue;//消除环境噪声    for ( i=1;i<SIMGHEIGHT-1;i++ )   //行数576{   for ( j=1;j<(SIMGWIDTH/2)-1;j++ )   //列数720/2-1{px3 = m_dbFrameY_out + i*SIMGWIDTH + j; x3=(*px3);if(x3 == i+1){                    (*px3) = 0;            }}}}//处理后连通雨滴图像for ( i=1;i<SIMGHEIGHT-1;i++ )   //行数576{   for ( j=1;j<(SIMGWIDTH/2)-1;j++ )   //列数720/2-1{px3 = m_dbFrameY_out + i*SIMGWIDTH + j; x3=(*px3);if(x3!=0){                    (*px3) = 255;          }}}free(area);
}

(3)雨滴消除函数
MATLAB版本

    [a,b]=find(segments ~= 0);for k=1:length(a)segments(a(k),b(k))=segments(a(k),b(k))/255;endfor i = 1:rowsfor j = 1:colsf0 = double(LipImg0(i,j));f1 = double(LipImg1(i,j));f2 = double(LipImg2(i,j));w  = double(segments(i,j));outImg(i,j) = uint8( w * ((f0+f2)/2) + (1-w)*f1 );LipImg0(i,j) = uint8(f1);LipImg1(i,j) = uint8(f2);            endend

DSP版本

void outImg()
{int i,j;float y1,y2,y3,yout;unsigned char *py1,*py2,*py3,*pyout;for (i=1;i<SIMGHEIGHT;i++)   //行数,每行一次{   for (j=1;j<SIMGWIDTH/2;j++)   //列720点{py1 = m_dbFrameY_1 + (i-1)*SIMGWIDTH + j;py2 = m_dbFrameY_2 + (i-1)*SIMGWIDTH + j;py3 = m_dbFrameY_3 + (i-1)*SIMGWIDTH + j;pyout = m_dbFrameY_out + (i-1)*SIMGWIDTH + j;y1=(*py1);y2=(*py2);y3=(*py3);yout = (*pyout);  yout = (yout/255)*(y1+y3)/2 + (1-(yout/255))*y2;     (*pyout) = (unsigned char)yout;}}
}

实验结果




通过实验中测试可得,场景 (a) 中, 雨滴在三帧之间存在较明显的亮度变换, 而且雨滴的方向和形态信息分布较明显, 去雨恢复的效果也较好。场景 (b) 中, 由于场景中存在运动物体,运动物体随着随着雨滴带动产生明显的环境噪声,由于LIP模型的约束和连通域约束, 消除了很多噪声斑点。场景 © 是基于DSP摄像机实现的,由于平台开发板采用的是数字CCD摄像头,由于开发环境摄像头需要手动聚焦,成像易受环境噪声影响,尤其是摄像头补获的是来自显示器的视频信息,显示器的定时刷屏更新显示也会造成亮度差值明显的变换,与LIP模型易造成冲突,通过LIP的阈值限制虽然消除了大部分的显示器影响,但是同时变化不明显的雨滴也同样会造成丢失。

总结

**总的来说,DSP还是可以的!!!**用于实现了一种传统的针对视频图像雨滴检测与消除的方法还是有价值的。首先, 将灰度图像映射至LIP空间,在 LIP 框架下利用帧间的亮度变化实现非线性的检测候选雨滴筛选, 之后进行形态学的膨胀和腐蚀,保证雨滴的连续性,然后, 利用主成分分析求取候选雨滴的倾斜方向, 获取雨滴形态的长宽比,并构建了雨滴筛选函数去除干扰。最后, 对雨滴图像进行高斯模糊,消除直接的帧差消除的边缘失真,利用所加权重构方法进行雨滴消除。实验部分在三个场景下对所提算法进行了验证,包括固定场景视频、移动场景视频和DSP实时视频, 给出了检雨图、 去雨图等检测效果。从结果上看,本算法可以适应动、 静态场景的在线雨滴去除, 且无需已知摄像参数, 适合于实际应用。但是呢,也不逃避,对于大雨和暴雨的检测效果不明显(很糟糕),存在考虑缺失的问题,考虑从大雨检测的频域分布特征和高斯背景建模的角度出发进行实现。不过选型的DSP是个压箱底的老物件了,能够重新把它翻出来好好学一遍并应用到前沿领域还是不错的一种尝试。

参考材料

[1]Garg K,Nayar S K. Version and rain [J]. International Journalof Computer Vision, 2007.75(1):3-27
[2]DONG Rong,LI Bo,CHEN Qi-mei. A method for detection and removal of rain in videos[J]. Acta Automatica Sini-ca,2013,39(7): 1093-1099.
董蓉,李勃,陈启美,一种视频雨滴检测与消除的方法[J]. 自动化学报,2013,39(7):1093-1099
[3]Zhang Yingxiang, Chen Qiang, Liu Yuncai. The rain drops are measured and get rid of the method to study in the video picture [J]. Microcomputer Applications, 2008, 23(12): 16-20.
张颖翔,陈强,刘允才.视频图像中雨滴检测与去除方法研究[J]. 微型电脑应用, 2018, 23(12): 16-20

DSP上玩玩视频雨滴检测与消除相关推荐

  1. 视频目标检测与图像目标检测的区别

    一. 前言 本文介绍了知乎上关于视频目标检测与图像目标检测的区别的几位大佬的回答.主要内容包括有视频目标检测与图像目标检测的区别.视频目标检测的研究进展.研究思路和方法. 作者:Naiyan Wang ...

  2. 视频显著性检测----《Flow Guided Recurrent Neural Encoder for Video Salient Object Detection》

    本文将重点与大家探讨和分享发表于CVPR2018上的视频显著性检测文章–<Flow Guided Recurrent Neural Encoder for Video Salient Objec ...

  3. 学界 | 斯坦福提出高速视频目标检测系统NoScope:速度超现有CNN上千倍

    卷积神经网络在目标检测任务上已经取得了优良的表现,但它们的计算成本比较高.速度比较慢,不适用于大规模的实时视频处理.为了解决这个问题,斯坦福大学的几位研究者提出了一个名叫 NoScope 的系统,将目 ...

  4. Google又放大招:高效实时实现视频目标检测 | 技术头条

    点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」,购票请扫码咨询 ↑↑↑ 作者 | 陈泰红,算法工程师,研究方向为机器学习.图像处理 来源 | 极市平台(ID:extrememart) ...

  5. Google又发大招:高效实时实现视频目标检测

    首发于极市平台微信号:Google又发大招:高效实时实现视频目标检测 作者:陈泰红 如有兴趣可以**点击加入极市CV专业微信群**,获取更多高质量干货 图像目标检测是图像处理领域的基础.自从2012年 ...

  6. 基于帧间频域分析的视频篡改检测

    基于帧间频域分析的视频篡改检测 摘要:提出一种通过帧间频域分析,来对视频频篡进行盲检测.本文首先梳理分析目前视频分析取证的一些方法.总结出视频分析的依赖于视频连续帧中某一特性的不变性或连续性,提出可以 ...

  7. 机器学习与计算机视觉入门项目——视频投篮检测(二)

    机器学习与计算机视觉入门项目--视频投篮检测(二) 一.手工特征与CNN特征 在上一次的博客中,介绍了计算机视觉和机器学习的关系.篮球进球检测的基本问题和数据集的制作.这次的我们主要介绍如何从原始图像 ...

  8. ICRA2023|基于时空融合的驾驶场景视频雨滴移除算法+数据集

    作者 | GlobalTrack  编辑 | 极市平台 点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心[目标检测]技术交流群 导读 本 ...

  9. YOLOV:图像对象检测器在视频对象检测方面表现也很不错

    前言 与传统的两段pipeline不同,论文提出了在一段检测之后再进行区域级的选择,避免了处理大量低质量的候选区域.此外,还构建了一个新的模块来评估目标帧与参考帧之间的关系,并指导聚合. 作者进行了大 ...

最新文章

  1. HTML中显示数学公式
  2. 剑桥少儿英语预备级教案(上) unit15 I can draw it.
  3. bash循环控制语句之for循环
  4. java二叉树 最大值_leetcode刷题笔记-654. 最大二叉树(java实现)
  5. python3 for_Python3: for 表达式
  6. 关于RGB屏调试的一些知识(转)
  7. BZOJ3435[Wc2014]紫荆花之恋——动态点分治(替罪羊式点分树套替罪羊树)
  8. Maximize The Beautiful Value
  9. php 模拟并发请求_PHP模拟并发请求
  10. linux下执行shell修改用户密码,[转] 关于linux下通过shell命令(自动)修改用户密码...
  11. PHP实现http与https转化
  12. [转载] 王长松:传统文化与中医养生(东南大学)——第2讲 中医养生方法的源泉(上)...
  13. 阿里 2 年内市值将赶超苹果;腾讯回应吃鸡下架;滴滴恢复深夜运营 | 极客头条...
  14. easyui框架中关于dialog自带关闭事件的使用
  15. Mysql私有增强性命令小记
  16. selenium webdriver——鼠标事件
  17. 华为ENSP配置VLAN间路由
  18. Mac 如何免费支持NTFS 格式移动硬盘读写
  19. 使用python爬取图片(爬取百度图片为例)
  20. python的if语句怎么写-Python的if语句

热门文章

  1. u盘拷贝服务器文件,服务器向u盘拷贝数据库
  2. oracle怎么赋予系统权限,讲解Oracle系统中用户权限的赋予和查看
  3. 智能视频分析技术与被动红外技术的整合应用
  4. 服装检索-DeepFashion
  5. Google Earth Engine(GEE)——逐月降水数据下载和直方图表展示
  6. 算法提高课学习——2.搜索——2.1.Flood Fill算法
  7. JZOJ 1008 1010
  8. matlab下载实录:matlab2022a好用吗
  9. 第七届蓝桥杯有奖竞猜 JAVA
  10. Hibernate中:cannot simultaneously fetch multiple bags的问题