vc++数字图像运动检测处理系统 第10页
GlobalUnlock(hDIBBK);
GlobalUnlock(hDIBCurrent);
return true;
}
运动物体提取出来后的效果,如图18所示。
图18 运动物体提取图
(10)图像二值化
图像的二值化就是图像显示的时候只能看到两种颜色(经常是黑白两色),二值图像也就是只具有两个灰度级的图像,它是数字图像的一个重要子集。一个二值化图像(例如一个剪影或一个轮廓图)通常是由一个图像分割操作产生的。也就是图像的二值化,一般都是在实现了图像的灰度操作之后进行的。二值化的具体方法有很多,比较常用的是阀值判定法。给定一个数值,当灰度图像中像素点的亮度值小于这个数值时,把像素点设置成为黑色(可以是其他颜色),而当图像中像素点的亮度值大于这个数值时,把像素点设置成为白色(可以是其他颜色)。阀值的选择有自动阀值选取法和手动阀值选取法。自动阀值选取法,是先对灰度图像进行扫描,根据得到图像中点的亮度情况,自动地设定一个阀值。比如说,想使图像中70%的点的颜色是黑色的,那么这个阀值就应该取整个图像中所有像素亮度值排序中的70%位置上的亮度值。手动阀值设定比较简单,就是人为的设定一个阀值,一般来说,它要求在设定之前对整个图像的亮度有大致地了解。
图像二值化的函数WhiteBlack(参见源程序)。图19二值化后得图像
图19 二值化效果图
(11) 图像的膨胀
图像的膨胀就是根据条件,把图像中当前点的颜色给周围点,或者把周围点的颜色赋给当前点,最终使得我们关心的物体显得更加平整,更加明显。具体的说,膨胀就是将与某物体接触的所有背景点合并该物体中的过程。过程的结果是使物体的面积增大了相应数量的点。如果物体是圆的,它的直径在每次膨胀后增大两个像素,这样的操作其作用是在填补分割后物体中的空洞时很有用。图像的膨胀属于图形学内容,具体实现的时候,要根据需要来设定膨胀条件,系统中使用的是四方向判断算法,即当前点的上下左右有一个点的颜色是白色时,就把当前点的颜色填充成白色(图像已经处理为二值图像所以只有物体为白色,其他背景为黑色)。这样做的结果是使得运动物体的像素点变得更多,方便进行下面的边界提取的操作。
在其他实际应用中,要根据情况更改判定所用的模板。比如说可以只进行左右像素膨胀,或者只考虑上下、对角膨胀等。比较图19以及图20所示内容,可以很明显的看到图20所示的白色区域增加了很多,原来的图像变得更加平整,一些和白色区域相邻的黑色区域被去掉了。一般来说,经过膨胀操作,图像会变大,此时可以根据需要执行腐蚀操作。腐蚀操作就是消除物体所有边界点的一种过程,其结果使剩下的物体沿其周边比原来物体小一个像素的面积,如果物体是圆的,在每次腐蚀后将减少两个像素,这样的操作对从一幅分割图像中去除小且无意义的物体是很有用的。把膨胀和腐蚀结合起来的操作,图形学上叫做闭运算,它具有填充物体内细小空洞、连接邻近物体,在不明显改变物体面积的情况下平滑其边界的作用。先腐蚀后膨胀的过程称为开运算。它具有消除细小物体、在纤细点处分离物体、和平滑较大物体的边界时不明显改变其面积的作用。物体在本系统的实现中,因为物体的四方向均匀膨胀,不会改变对物体中心点位置的判定,所以无需进行腐蚀运算。图像膨胀的源代码函数OnMenuPengzhang(参见源程序)。运动物体膨胀后的效果如图20所示。
图20 运动物体膨胀图
(12)图像边缘求取
在膨胀操作之后,接下来要进行图片边缘的提取。边缘提取一般都是根据图像点的梯度值来求取。本系统实现的时候就是用sobel算子来求梯度的。代码和前面梯度求取是一样的。运动物体边缘提取后的效果如图21所示。
图21 运动物体边缘提取图
(13)图像细化
图像的细化是使粗的物体变细,同时保留了原来物体的轮廓特征。细化将一个曲线物体细化成为一条单像素宽的线,从而图形化地显示出其拓扑性质。图像的细化属于图形学的内容,它是骨架提取的一种方法,经常用在轮廓里面。抽骨架也称为中轴变换或焚烧草地技术。中轴是所有与物体在两个或更多非邻域边界点处相切的圆心的轨迹。但抽骨架很少通过在物体内拟合圆来实现。图像细化的算法也很多,根据不同的情况,可以选择不同的细化方法。在本系统中,使用的是查表的细化算法,即
8-邻域细化中有代表性的希尔迪奇方法。具体来说就事先设定一个二值化的表格,里面的数值表示该点能不能被细化掉,然后进行像素点周围的八方向扫描,查看八个方向上点的颜色情况,最后根据八个点的情况计算,得到一个索引值,利用这个索引值查看表格中的数值,最后确定当前像素是否应该被细化掉。原来图像的轮廓变细了,细化后的图像效果如图22所示。
图22 细化效果图
(14)图像的去离散点的操作
得到的运动物体的轮廓图像会有许多离散的白点。这些白点的产生可能是图像拍摄过程中的噪声,也可能是物体内部的一些区域有像素变化较大的点。如果不把这些点去掉,就会影响物体中心点的判定。去离散点的操作和膨胀的过程似乎相反,但又不同。系统对当前要处理的点进行这样的判定:分析是否有足够多的点和当前点相连,相连可以是直接的,也可以是间接的。足够多的前应该根据实际情况来确定。本系统中采用的点数上三点。要实现这样的去离散的操作,编程需要用到递归来处理。因为递归是效率比较低的,所以尽量不要把连续点的点数设得很高。系统在判定连续性的时候,采用八方向递归的方式,在有些系统的实现中,也可能采用四方向递归的方式。如图23所示,原图中的一些离散点消失了。
1)去离散点的函数IsScaterPoint
2)去掉离散点的函数OnMenuYdpdDeletescater(参见源程序)。
去掉离散点后的效果如图23所示。
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >>
vc++数字图像运动检测处理系统 第10页下载如图片无法显示或论文不完整,请联系qq752018766