Skip to content
鼓励作者:欢迎打赏犒劳

边缘检测

Canny边缘检测

Canny边缘检测 (Canny Edge Detection)是一种多阶段的边缘检测算法,用于检测图像中的边缘。它 由John F. Canny在1986年提出,目的是通过减少噪声同时保持边缘信息来提高边缘检测的效果。

Canny边缘检测算法步骤

  • 灰度化:将彩色图像转换为灰度图像,因为边缘信息通常不依赖于颜色。
  • 高斯滤波:通过高斯滤波器去噪,减少图像噪声的干扰。
  • 梯度计算:使用 Sobel算子计算图像的梯度(强度和方向),以找到边缘的位置。
  • 非最大值抑制:抑制梯度强度较小的像素,保留局部最大值的边缘。
  • 双阈值检测:使用两个阈值来判断哪些边缘是真正的边缘,哪些是噪声。根据边缘强度判断边缘是否属 于边缘或是噪声
  • 边缘连接:将边缘连接起来,去除孤立的边缘,形成连续的边缘。

最主要是设置有2个阈值,大于搞阈值的会保留,低于低阈值的会去掉,介于之间的像素则会根据与周围像素的关系来决定是否保留

示例代码

java
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class OpenCVTest {
    public static void main( String[] args )
    {
        // 方式一加载OpenCV库
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

        // 图片文件路径
        String imagePath = "C:\\Users\\Think\\Desktop\\3.jpg";
        // 使用OpenCV加载图片,可以加第二个参数,是读取的类型,比如读取灰色图像
        Mat image = Imgcodecs.imread(imagePath);

        // 转换为灰度图像
        Mat grayImage = new Mat();
        Imgproc.cvtColor(image, grayImage, Imgproc.COLOR_BGR2GRAY);

        // 使用Canny算法进行边缘检测
        Mat edges = new Mat();
        Imgproc.Canny(grayImage, edges, 50, 150);

        // 显示边缘检测结果
        HighGui.imshow("Edges", edges);


        HighGui.waitKey(0);
        HighGui.destroyAllWindows();
    }
}

Laplacian边缘检测

Laplacian边缘检测是一种基于二阶导数的边缘检测方法,它通过计算图像灰度的二阶导数来检测图像 中的边缘。与一阶导数的边缘检测(如 Sobel或 Canny) 相比,Laplacian边缘检测可以捕捉到更多 细节,但也更容易受到噪声的干扰。

Laplacian操作原理:

Laplacian算子计算的是图像像素的二阶导数,它可以在图像的梯度变化快速的地方检测到边缘。在图 像处理中,Laplacian算子通常与高斯滤波结合使用,以去除噪声并平滑图像。

java
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

/**
 * 公众号:干货食堂
 */
public class Test {

    public static void main(String[] args) {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        //读取图像,使用灰度模式
        Mat src=Imgcodecs.imread("C:\\Users\\Think\\Desktop\\TestCV\\fish.png",Imgcodecs.IMREAD_GRAYSCALE);

        //创建输出图像
        Mat dst = new Mat();
        //应用Laplacian 操作
        //参数说明:
        //1.输入图像(灰度图像)
        //2.输出图像
        //3.ddepth:输出图像深度,-1表示与输入图像相同
        //4.ksize:Sobel核大小,推荐为3或5
        Imgproc.Laplacian(src, dst, -1, 3);
        //将图像转换回CV_8U类型(无符号8位整数)
        Mat abs_dst = new Mat();
        Core.convertScaleAbs(dst, abs_dst);
        //保存结果图像
        HighGui.imshow("before Image", src);
        HighGui.imshow("after Image", abs_dst);


        HighGui.waitKey(0);
        HighGui.destroyAllWindows();
    }
}

如有转载或 CV 的请标注本站原文地址