Gitee地址:/jzhou955/edge_detection.git
欢迎star or fork。
项目需求
检测图片中特定部分的轮廓。To do list
用各种算子提取元器件的边缘。二值化边缘图,调整二值化阈值得到更清晰的轮廓。调整二值化阈值,获取PCB的边缘。利用色域差异进行边缘提取,提高准确度。两种器件改用不同的色域分离方法,并且在原图上面叠加边缘线。叠加的边缘线调整透明度以及粗细。B2B边缘线拟合成直线。遍历测试图片集,看图片明暗对结果的影响。Clip中钢片上面的噪点太多,尝试去除:pyrMeanShiftFiltering。提取钢板的上边缘:用两张方法提取出来的边缘图并将其重合。项目记录
其实一开始的时候就使用了各种opencv中集成的边缘提取算法来对图片进行处理,比如说 Laplacian,Sobel,Scharr,Canny等,但是单种方法的效果都不够理想,最终还是结合多种ISP方法对图片进行处理。
边缘检测是计算机视觉领域非常重要的一种图像特征提取方法,同样也是比较好用的特征提取方法。我们通过边缘检测就是为了找到图像中像素亮度发生剧烈变化像素点集合,通常这些集合表现出来往往是轮廓。因为边缘的提取本身就是一个滤波的过程,通过不同的算子来去提取不同的特征。每种算子都有他的特点,抛开现在神经网络方法不谈,传统的方法一般有三种:Sobel算子,Laplacian算子,Canny算子。
在目标检测中,Sobel算子对灰度渐变和噪声较多的图像处理效果较好,但是Sobel算子对边缘定位不是很准确(图像的边缘不止一个像素),因此精度要求不是很高时,Sobel比较常用。
由于Laplacian算子法对噪声比较敏感,所以很少用该算子检测边缘,而是用来判断边缘像素视为与图像的明区还是暗区。拉普拉斯高斯算子是一种二阶导数算子,将在边缘处产生一个陡峭的零交叉, Laplacian算子是各向同性的,能对任何走向的界线和线条进行锐化,无方向性。这是拉普拉斯算子区别于其他算法的最大优点。
Canny最厉害的地方在于,他提出了一套对于边缘检测算法的标准:
1)以低的错误率检测边缘,也即意味着需要尽可能准确的捕获图像中尽可能多的边缘。
2) 检测到的边缘应精确定位在真实边缘的中心。
3) 图像中给定的边缘应只被标记一次,并且在可能的情况下,图像的噪声不应产生假的边缘。
概括来说,边缘要全,位置要准,抵抗噪声要强
Canny边缘检测主要分四步进行:去噪声;计算梯度与方向角;非最大值抑制;滞后阈值化;
scharr:sobel的加强版
prewitt
laplacian
roport
Roberts 边缘检测因为使用了很少的邻域像素来近似边缘强度,因此对图像中的噪声具有高度敏感性。因此,先对图像做平滑处理再进行Roberts边缘检测效果会更好。
3阶sobel
OpenCV相关函数
cv2.Sobel(src, ddepth, dx, dy[, ksize[, scale[, delta[, borderType]]]]) OpenCV 提供三种不同的梯度滤波器,或者说高通滤波器:Sobel,Scharr 和 Laplacian。在数学上,Sobel,Scharr 是求一阶或二阶导数,Scharr 是对 Sobel(使用小的卷积核求解求解梯度角度时)的优化,Laplacian是求二阶导数。src:输入图像;ddepth:图像颜色深度,针对不同的输入图像,输出图像有不同的深度,-1 表示图像深度一致;dx:x 方向求导阶数;dy:y 方向求导阶数;ksize:内核大小,一般取奇数,1,3,5,7等值;scale:缩放大小,默认值为 1;delta:增量数值,默认值为 0;borderType:边界类型,默认值为 BORDER_DEFAULT。备注:如果 ksize=-1,会使用 3x3 的 Scharr 滤波器,该效果要比 3x3 的 Sobel 滤波器好(而且速度相同,所以在使用 3x3 滤波器时应该尽量使用 Scharr 滤波器)。 cv.Canny: 第一个参数是输入图像img。第二和第三个分别是minVal和maxVal。要确定那些边界才是真正的边界,需要设置两个阀值:minVal和maxVal。当图像的灰度梯度高于maxVal时被认为是真的边界,那些低于minVal的边界会被抛弃。如果介于两者之间的话,就要看这个点是否与某个被确定为真正边界点相连,如果是,就认为它也是边界点,如果不是就抛弃。第四个参数设置用来计算图像梯度的Sobel卷积核的大小,默认值为3。最后一个参数是L2gradient,它可以用来设定求梯度大小的方程。
如果觉得《【openCV边缘检测】用传统方法实现边缘检测(一)提取边缘》对你有帮助,请点赞、收藏,并留下你的观点哦!