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