您的位置:首页 > 其它

数字图像处理编成入门笔记——第7章 边沿检测与提取,轮廓跟踪

2010-09-01 18:52 696 查看
7.1 边沿检测
由于图像边界上的灰度和其它地方的相差较大,所以可以通过模板的方式检测出边沿。这种模板就是一种边沿检测器,又称边沿算子。模板的梯度和图像边沿的方向总是正交,例如,边是水平方向的,那可以用梯度是垂直方向的模板

检测它的边沿;而边是垂直方向的,就可以用梯度是水平方向的模板

检测它的边沿;一个梯度为45度方向模板

,可以检测出135度方向的边沿。
下面介绍几种算子:
1.Sobel算子
Sobel算子是一种常用的模板,和上面提到的算子相比,对于象素的位置的影响做了加权,因此效果更好。该算子有两种形式:一种是:检测水平边沿的

;检测垂直平边沿的

。另一种形式是各向同性Sobel算子,检测水平边沿的

,检测垂直平边沿的

。各向同性Sobel算子和普通Sobel算子相比,它的位置加权系数更为准确,在检测不同方向的边沿时梯度的幅度一致。

2.高斯拉普拉斯算子
为了消除噪声点对边沿检测的影响,该算子采用将高斯平滑滤波器和拉普拉斯锐化滤波器结合了起来,先平滑掉噪声,再进行边沿检测,所以效果会更好。常用的LOG算子是5×5的模板,如下所示

。到中心点的距离与位置加权系数的关系用曲线很象一顶墨西哥草帽,所以LOG又叫墨西哥草帽滤波器。
7.2 Hough变换
Hough变换用来在图象中查找直线。它的原理很简单:假设有一条与原点距离为s,方向角为θ的一条直线,直线上的每一点都满足方程7.1:



可以利用这个变换找出图中最长的直线,实现算法如下:
1.创建一个二维数组hDistAlpha,其中第一维表示距离s(计算可能出现的最大距离为

,用来确定数组第二维的大小),第二维表示方向角θ(书上正好和我说的相反,但看了程序以后我更坚持自己的想法)。
2.创建一个二维数组Line,计算每条直线的上下两个端点。
3.对图像中的每个黑点,角度的变化范围从00到1780(角度每次增加20 ),按方程(7.1)求出对应的距离s来,相应的数组元素[s][

]加1,同时相应的填写数组Line的内容。
4.所有的象素都算完后,找到数组元素中最大的,就是最长的那条直线。直线的端点可以在Line中找到。
7.3 轮廓提取
轮廓提取的算法非常简单,就是掏空内部点:如果原图中有一点为黑,且它的8个相邻点都是黑色时(此时该点是内部点),则将该点删除。
7.4 种子填充
种子填充算法用来在封闭曲线形成的环中填充某中颜色,在这里我们只填充黑色。其原理是:准备一个堆栈,先将要填充的点push进堆栈中;以后,每pop出一个点,将该点涂成黑色,然后按左上右下的顺序查看它的四个相邻点,若为白(表示还没有填充),则将该邻点push进栈。一直循环,直到堆栈为空。此时,区域内所有的点都被涂成了黑色。
要注意的是:(1)要填充的区域是封闭的;(2)我们处理的虽然是二值图,但实际上是256级灰度图,不过只用到了0和255两种颜色;(3)在菜单中选择种子填充命令时,提示用户用鼠标点取一个要填充区域中的点,处理是在WM_LBUTTONDOWN中。
7.5 轮廓跟踪
轮廓跟踪,顾名思义就是通过顺序找出边缘点来跟踪出边界。一个简单二值图象闭合边界的轮廓跟踪算法很简单:首先按从上到下,从左到右的顺序搜索,找到的第一个黑点一定是最左上方的边界点,记为A。它的右,右下,下,左下四个邻点中至少有一个是边界点,记为B。从开始B找起,按右,右下,下,左下,左,左上,上,右上的顺序找相邻点中的边界点C。如果C就是A点,则表明已经转了一圈,程序结束;否则从C点继续找,直到找到A为止。判断是不是边界点很容易:如果它的上下左右四个邻居都是黑点则不是边界点,否则是边界点。

一直拖到现在才看完这一章,内容感觉挺有用的。最近一直在学日语,看动画片,因为再过几天就要开学,不看完不行。对于学计算机,说到有天分不算,但学得并不吃力。从大学选专业开始,到现在读研,花了并将要花很多时间去研究计算机,怎甘心以后不把它当作生存的技能呢~但有时想想,当初选的时候也是因为不知道选什么才选的,考研也是,不是不想转专业,而是不知道转哪个,毕竟对计算机不到那种狂热的程度,所以想到以后要以此为生,难免会有些担忧。开始学日语后,发现自己好像真的有那股冲劲了,不过从现在才开始学,怕是不能当做生存技能吧!如果冲动去抛弃以前的一切去研究日语和动画片,万一又厌倦了怎么办?自己这种短热度的性格。。。
想法很多,做起来可不容易呀!兴趣这玩意对于我来说,就只能当做消遣吧!不管怎么样,就暂时这样吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: