一、边缘检测的一般步骤
1、滤波
边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感,因此必须采用滤波器来改善与噪声有关的边缘检测器的性能。
2、增强
增强边缘的基础是确定图像各点领域强度的变化值。增强算法可以将图像灰度点领域强度值有显著变化的点凸显出来。在具体编程实现时,可通过计算梯度幅值来确定。
3、检测
经过增强的图像,往往领域中有很多点的梯度值比较大,而在特定的应用中,这些点并不是要找的边缘点,所以应该采用某种方法来对这些点进行取舍。实际工程中,常用的方法是通过阈值化方法来检测。
二、基于Canny、Sobel、laplacian、Scharr算子的边缘检测示例
Mat srcImage = imread("E:\CodeResource\opencv\car_pic\car5.jpg",0); imshow("srcImage", srcImage); Mat canyImage; Canny(srcImage, canyImage, 3, 9, 3); imshow("canyImage", canyImage); Mat sobel_x; Mat sobel_y; Mat sobelImage; Sobel(srcImage, sobel_x,CV_16S,1,0,3,1,1,BORDER_DEFAULT); convertScaleAbs(sobel_x, sobel_x); Sobel(srcImage, sobel_y, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT); convertScaleAbs(sobel_y, sobel_y); addWeighted(sobel_x, 0.5, sobel_y, 0.5, 0, sobelImage); imshow("sobel_x", sobel_x); imshow("sobel_y", sobel_y); imshow("sobelImage", sobelImage); Mat laplacianImage; Laplacian(srcImage, laplacianImage, CV_16S, 3, 1, 0, BORDER_DEFAULT); convertScaleAbs(laplacianImage, laplacianImage); imshow("laplacianImage", laplacianImage); Mat scharr_x; Mat scharr_y; Mat scharrImage; Scharr(srcImage, scharr_x, CV_16S, 1, 0, 1, 0, BORDER_DEFAULT); convertScaleAbs(scharr_x, scharr_x); Scharr(srcImage, scharr_y, CV_16S, 0, 1, 1, 0, BORDER_DEFAULT); convertScaleAbs(scharr_y, scharr_y); addWeighted(scharr_x, 0.5, scharr_y, 0.5, 0, scharrImage); imshow("scharr_x", scharr_x); imshow("scharr_y", scharr_y); imshow("scharrImage", scharrImage); waitKey(0);
效果图: