边缘edge检测、轮廓contours检测、图像分割(背景提取)这三个概念在我看来有些不好理解,因为边缘检测感觉就是检测轮廓的边缘啊,检测出来边缘不就检测出来轮廓了么。另外图像分割是前景与背景之间的分割,那不也就是轮廓的检测,所有的轮廓之外不就是背景了么。
最近把这三个概念集中在一起看了看,总结一下。
边缘检测主要是检测轮廓边缘的那条线,而且那条线是有宽度的不只是1个像素宽的边缘;
而轮廓检测得到的是边缘和边缘内部的所有的点坐标Point,而且轮廓不止一个,一个轮廓是vector,那图片上的所有轮廓就是vector<vector>,而且除了轮廓还有轮廓之间的包含关系hierarchy,它是个vector型的数据。最后,在使用findcontours函数查找轮廓之前先进性二值化主要效果会比较好。
边缘检测
边缘就是像素值发生突变的点,也就是一阶导数的极大值点,或者二阶导数的过0点。
边缘检测的结果是Mat,直接的边缘点图,每一点保存的是该点在kernel指定方向上的梯度信息。可以直接绘制出来。
而轮廓检测得到的是边缘、边缘内的点的位置坐标信息,就是很简单的Point型数据,此外还有hierarchy这种表示轮廓包含关系的数据。但边缘检测的结果就是每一点的梯度信息,边缘内部没有梯度变化,所以值是0.
边缘检测的基本原理
可以通过原图与滤波器kernel进行卷积运算得到各个像素点在某个方向上的梯度(边缘)。
函数:filter2d(输入图像,输出图像,输出图像的深度,卷积核,anchor)
- 输入图像是单通道或者多通道, 输出