边缘检测

xiaoxiao2021-02-28  256

图像中的边缘检测是像素灰度值发生剧烈变化而不连续的结果。边缘检测是常见的图像基元检测的基础。

解释一下什么是基元检测? 基元泛指图像中有特点的基本单元。一般常说的基元主要有:边缘、角点、直线段、圆、孔等(也包括它们的结合体)。有人将这些基本单元称为特征,所以基元检测也有称特征检测的。 边缘是许多其他基元的基础,如角点可以看做两个边缘以接近直角相结合构成的基元,直线段可看做两个邻近又互相平行的边缘相结合而构成的基元。

- 边缘检测的原理

像素灰度值变化可利用求导数的方法检测,常用一阶和二阶导数。 三种边缘剖面如下:

图片来源: http://blog.csdn.net/u012627502/article/details/19830693

(a)、(b)是阶梯状边缘:处于图像中两个具有不同灰度值的相邻区域间; (c)是脉冲状边缘:对应细条状的灰度值突变区域,可以看成两个背靠背的阶梯状边缘构成; (d)是屋顶状边缘:边缘上升、下降沿都比较平缓,可以看成脉冲状边缘拉伸得到的。

由(a)、(b)的二阶导数可以看到,二阶导数的过零点是边缘的位置; 由(c)的二阶导数可以看到,二阶导数的两个过零点分别对应脉冲的上升沿和下降沿。通过检测脉冲剖面的二阶导数的两个过零点可以确定脉冲的范围; 而屋顶状边缘剖面(d)的一阶导数过零点可以确定屋顶的中心位置。

一阶导数算子 对边缘的检测可通过对图像空域微分算子卷积完成。一阶微分算子给出梯度,所以也叫梯度算子。分别对X和Y方向计算偏导分量。偏导分量的计算需对每个像素位置进行,使用模板卷积近似计算,X和Y各有一个模板,合起来构成梯度算子。最简单的梯度算子是Roberts算子,2x2,比较常用的还有Prewitt算子和Sobel算子,二者都是3x3。Sobel算子效果较好。 三个算子的模板后续再补 算子采用模板卷积的方式,将模板在图像上移动并在每个位置计算对应中心像素的剃度值。所以对一幅灰度图求梯度所得的结果是一幅梯度图。 在边缘灰度值过渡比较尖锐且图像中噪声比较小时,梯度算子的工作效果最好。 使用Sobel算子进行边缘检测: 代码: Mat sobel_X, sobel_Y, sobel; sobel = imread("D:\\My Documents\\Pictures\\house.jpg"); 转为灰度图 //cvtColor(sobel, sobel, CV_RGB2GRAY); //namedWindow("原图像的灰度图", 1); //imshow("原图像的灰度图", sobel); //waitKey(2000); //Sobel边缘检测,不用转为灰度图 //X梯度方向 Sobel(sobel, sobel_X, sobel.depth(), 1, 0); Sobel(sobel, sobel_Y, sobel.depth(), 0, 1); //使用线性变换转换输入数组元素成8位无符号整型。 //scale :比例因子,默认为1. //shift :原数组元素按比例缩放后添加的值, 默认为0.0 convertScaleAbs(sobel_X, sobel_X); convertScaleAbs(sobel_Y, sobel_Y); //合并XY梯度 addWeighted(sobel_X, 0.5, sobel_Y, 0.5, 0, sobel);

原图:

X梯度:

Y梯度:

XY梯度合并得到最终的边缘检测结果:

- 二阶导数算子 二阶导数算子检测边缘也是将算子的模板与图像卷积,并确定算子输出值的过零点。 1、拉普拉斯算子 拉普拉斯算子模板的基本要求是对应的中心像素的系数应是正的,对应中心像素邻近像素的系数应是负的,且系数总和为0. 由于拉普拉斯算子是二阶导数算子,对噪声比较敏感,另外常产生双像素宽的边缘,故而拉普拉斯算子很少直接用于边缘检测,主要用于已知边缘像素后确定该像素是在图像的暗区或明区一边。 使用拉普拉斯算子检测边缘:

Laplacian(lap, lapedge, lap.depth()); convertScaleAbs(lap, lap);

边缘检测结果:

在原图像上加了椒盐噪声以后,再次进行拉普拉斯边缘检测:

放大看,拉普拉斯检测出来的边缘存在双像素宽的现象,以及受噪声影响较大,因此一般不使用拉普拉斯算子进行边缘检测。 噪声添加参考链接: http://blog.csdn.net/qq_34784753/article/details/69379135?locationNum=14&fps=1 2、马尔算子 由于拉普拉斯算子对噪声敏感,为了减少噪声的影响,可在检测前先对图像平滑处理,再用拉普拉斯算子。由于一个给定像素点所对应场景点的周围点对该点的光强贡献呈高斯分布,所以可使用高斯加权函数作为平滑函数。将高斯加权平滑运算与拉普拉斯运算结合即是马尔边缘检测方法。 步骤如下: (1) 用一个2D的高斯平滑模板与原始图像卷积 (2) 计算卷积后图像的拉普拉斯值 (3) 检测拉普拉斯图像中的过零点并作为边缘点 3、坎尼算子(Canny) Canny提出一个好的边缘检测算子应满足三个准则:信噪比准则、定位准则和单边缘响应准则。 满足上面三个准则的算子称为Canny算子。 上面的拉普拉斯和Sobel算子在进行边缘检测时,不需使用灰度图,但是Canny需要将图像转为灰度图在进行检测。

//转为灰度图 cvtColor(canny, canny, CV_RGB2GRAY); //50是低阈值, 150是高阈值 //opencv建议高阈值是低阈值的三倍 //内部sobel模板大小为3*3 Canny(canny, canny, 50, 150, 3);

Canny算子边缘检测效果:

SUSAN算子 SUSAN算子很有特色。使用一个圆形模板得到各向同性的响应,可以检测角点和边缘。 后期进行补充。

参考书籍

计算机视觉教程 A Course of Computer Vision 章毓晋编著

转载请注明原文地址: https://www.6miu.com/read-59106.html

最新回复(0)