OpenCV学习笔记(七)提取直线、轮廓和区域

一、用Canny算子检测图像轮廓

1、Canny算法
Canny算法通过Canny(iamge, contours, 125, 350)函数实现。Canny算子通常基于Soble算子实现,也可以使用其他梯度算子,用两个不同的阈值判断哪个点属于轮廓,低阈值可以检测到较多的边缘,高阈值检测到较少的边缘,Canny算法将结合两种边缘分布图生成最优的轮廓分布图。高阈值分布图上的断裂处被补齐,低阈值中边缘点上的孤立链全部被移除。这种基于两个阈值获得的二值分布图的策略被称为滞后阈值化。Canny算法在滞后阈值化之前还会有一个细化轮廓的运算。

Canny边缘检测是一种非常流行的边缘检测算法,是John Canny在1986年提出的。它是一个多阶段的算法,即由多个步骤构成。

1.图像降噪
2.计算图像梯度
3.非极大值抑制
4.阈值筛选

首先,图像降噪。我们知道梯度算子可以用于增强图像,本质上是通过增强边缘轮廓来实现的,也就是说是可以检测到边缘的。但是,它们受噪声的影响都很大。那么,我们第一步就是想到要先去除噪声,因为噪声就是灰度变化很大的地方,所以容易被识别为伪边缘。

第二步,计算图像梯度,得到可能边缘。我们在前面的关于《图像梯度》文章中有所介绍,计算图像梯度能够得到图像的边缘,因为梯度是灰度变化明显的地方,而边缘也是灰度变化明显的地方。当然这一步只能得到可能的边缘。因为灰度变化的地方可能是边缘,也可能不是边缘。这一步就有了所有可能是边缘的集合。

第三步,非极大值抑制。通常灰度变化的地方都比较集中,将局部范围内的梯度方向上,灰度变化最大的保留下来,其它的不保留,这样可以剔除掉一大部分的点。将有多个像素宽的边缘变成一个单像素宽的边缘。即“胖边缘”变成“瘦边缘”。

第四步,双阈值筛选。通过非极大值抑制后,仍然有很多的可能边缘点,进一步的设置一个双阈值,即低阈值(low),高阈值(high)。灰度变化大于high的,设置为强边缘像素,低于low的,剔除。在low和high之间的设置为弱边缘。进一步判断,如果其领域内有强边缘像素,保留,如果没有,剔除。

这样做的目的是只保留强边缘轮廓的话,有些边缘可能不闭合,需要从满足low和high之间的点进行补充,使得边缘尽可能的闭合。

一般在使用Canny边缘检测时,只需降噪处理然后电泳Canny函数便可。

二、用霍夫变换检测直线

1、霍夫变换中用这个方程检测直线:\rho =x\cos \theta +y\sin \theta,注意\theta是直线到垂直线之间的角度,需要两个累加器。

2、基础版霍夫变换HoughLines(test, lines, 1, PI/180, 60)函数,一些对齐的点构成了直线。

3、概率霍夫变换:HoughLinesP(),目的是在二值图像中找出全部直线,并且这些直线必须穿过足够多的像素点。

4、任何可以用一个参数方程表示的物体都适合用霍夫变换检测,不过很复杂。

三、点集的直线拟合

拟合步骤为:首先识别出图像中靠近直线的点,可以自己画一条直线与轮廓进行线与,然后利用得到的点集拟合出直线,使用函数 
fitLine,这个函数将直线方程式作为参数。这个过程中涉及到的数据类型有Vec4f(float类型,长度为4的小向量),Point等。

四、提取连续区域

在物体检测和识别程序中,第一步通常是生成二值图像,找到感兴趣区域所在的位置。

1、findContours(image, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE)函数可以提取出图像中连续区域的轮廓,每一个轮廓用一个cv::Point类型的向量表示,因此输出参数是一个向量,元素是每一个轮廓,也是向量类型的。即:std::vector<std::vector<cv::Point>> contours;
可以选择不绘制轮廓中的空穴,也可以选择轮廓的格式。也可以查看轮廓的数量。也可以给定阈值,将超出阈值的轮廓从向量中删除。

2、使用drawContours函数可以绘制出轮廓。

五、计算区域的形状描述子

形状描述子是用来描述连续区域的形状。

1、常见类型有:边界框、最小覆盖圆、多边形逼近、凸包(是另一种类型的多边形逼近)还有计算轮廓矩 (虽然它不是一种形状,但还是一种描述子,在区域内部画出重心)

注意:可能会有疑惑,既然是画几个形状,直接用绘图函数绘制不行吗?很重要的区别是,这些形状描述子使用的参数是轮廓,一个由点集构成的vector向量。

2、凸包,可以看做是在轮廓外扎了一个橡皮筋,不难理解,凹进去的部分会与凸包轮廓偏移,通常用凸包缺陷来表示这些 位置。cv::convexityDefevts函数实现。

3、轮廓矩通常用于特征识别。

4、还有一些基于轮廓的形状描述子:最小覆盖自由矩形、轮廓面积、判断点是否在轮廓内、度量轮廓之间相似度。

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值