Canny边缘检测算子是John F.Canny于1986年开发出来的一个多级边缘检测算法。
Canny边缘检测的步骤:
(1)消除噪声,一般使用高斯平滑滤波器卷积降噪
(2)计算梯度幅值和方向,此处按照sobel滤波器步骤来操作
(3)非极大值抑制,排除非边缘像素
(4)滞后阈值(高阈值和低阈值),若某一像素位置的幅值超过高阈值,该像素被保留为边缘像素;若小于低阈值,则被排除;若在两者之间,该像素仅在连接到高阈值像素时被保留。推荐高低阈值比在2:1和3:1之间
函数:Imgproc.Canny(image, edges, threshold1, threshold2, apertureSize, L2gradient);
参数说明:
image:输入图像,即源图像,填Mat类的对象即可,且需为单通道8位图像
threshold1:双阀值抑制中的低阀值
threshold2:双阀值抑制中的高阀值
apertureSize:sobel算子模板大小,默认为3
L2gradient:计算图像梯度幅值的标识,有默认值false,梯度幅值指沿某方向的方向导数最大的值,即梯度的模
示例代码:
public static void main(String[] args)
{
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat src = Imgcodecs.imread("F:\\2011031213205880528.jpg", Imgcodecs.IMREAD_GRAYSCALE);
Mat dst = src.clone();
Imgproc.GaussianBlur(src, dst, new Size(3, 3), 0);
Imgproc.Canny(dst, dst, 40, 100);
Imgcodecs.imwrite("F:\\dst.jpg", dst);
}
源图像:
Canny边缘检测: