• OpenCV(二十六):边缘检测(二)


    目录

    1.Laplacian算子边缘检测

    原理:

    Laplacian边缘检测函数Laplacian()

    示例代码:

    2.Canny算子边缘检测

    原理:

    Canny算法函数Canny()

    示例代码:


    1.Laplacian算子边缘检测

    原理:

            Laplacian算子的原理基于图像的二阶导数。一阶导数可以帮助我们检测图像中的边缘,而二阶导数则可以检测边缘的交叉点,即图像中的角点。

    Laplacian算子定义为二阶空间导数的和,在二维情况下用于图像处理,其离散形式如下:

    L(x, y) = d^2(I(x, y)) / dx^2 + d^2(I(x, y)) / dy^2 

    其中,I(x, y)表示图像中的像素值,d^2表示偏导数,dx表示在X方向上的导数,dy表示在Y方向上的导数。

    Laplacian算子可以通过应用离散卷积来计算。一种常见的离散Laplacian算子模板如下:

     
    

    通过将该模板与图像进行卷积操作,我们可以计算图像中每个像素的Laplacian响应。

    具体步骤如下:

    1. 将图像转换为灰度图像(如果不是灰度图像)。
    2. 对图像应用Laplacian算子的离散模板。
    3. 对卷积结果进行阈值处理,以提取边缘信息。
    4. 可选地对阈值处理后的边缘图像进行非最大抑制和边缘连接等后处理操作。

    Laplacian算子的输出结果是一个表示边缘的高频分量图像。边缘通常显示为明亮像素与暗亮像素之间的边界。边缘的宽度和强度取决于Laplacian算子的大小和图像中的灰度变化。

    Laplacian边缘检测函数Laplacian()

    void cv::Laplacian ( InputArray src,

    OutputArray dst,

    int        ddepth,

    int     ksize = 1,

    double   scale = 1,

    double    delta =0,

    int     borderType = BORDER DEFAULT

    )

    • src:输入原图像,可以是灰度图像和彩色图像。
    • dst: 输出图像,与输入图像src具有相同的尺寸和通道数。
    • ddepth: 输出图像的数据类型(深度),根据输入图像的数据类型不同拥有不同的取值范围。
    • ksize:滤波器的大小,必须为正奇数。
    • scale:对导数计算结果进行缩放的缩放因子,默认系数为1,不进行缩放。
    • delta:偏值,在计算结果中加上偏值。
    • borderType:像素外推法选择标志。
    示例代码:
    1. void Laplacian_f(Mat image){
    2. Mat gray;
    3. cvtColor(image,gray,COLOR_BGR2GRAY);
    4. Mat result,result_g,result_G;
    5. //未滤波提取边缘
    6. Laplacian(gray,result,CV_16S,3,1,0);
    7. convertScaleAbs(result,result);
    8. //滤波后提取边缘
    9. GaussianBlur(gray,result_g,Size(3,3),5,0);//高斯滤波
    10. Laplacian(result_g,result_G,CV_16S,3,1,0);
    11. convertScaleAbs(result_G,result_G);
    12. //显示图像
    13. imwrite("/sdcard/DCIM/result.png",result);
    14. imwrite("/sdcard/DCIM/result_G.png",result_G);
    15. }

                       

      (未滤波提取边缘图像)                            (滤波后提取边缘图像)

    2.Canny算子边缘检测

    原理:

    Canny算法函数Canny()

    void cv::Canny ( InputArray image,

    OutputArray edges,

    double  threshold1,

    double   threshold2,

    int  apertureSize = 3,

    bool   L2gradient = false

    )

    • image:输入图像,必须是CV 8U单通道或者三通道图像
    • edges:输出图像,与输入图像具有相同尺寸的单通道图像,且数据类型为CV 8U。
    • threshold1:第一个滞后阙值
    • threshold2:第二个滞后阀值
    • apertureSize: Sobel算子的直径
    • L2gradient:计算图像梯度幅值的标志
    示例代码:
    1. void Canny_f(Mat image){
    2. Mat gray;
    3. cvtColor(image,gray,COLOR_BGR2GRAY);
    4. Mat resultHigh,resultLow,resultG;
    5. //大阈值检测图像边缘
    6. Canny(image,resultHigh,100,200,3);
    7. //小阈值检测图像边缘
    8. Canny(image,resultLow,20,40,3);
    9. //高斯模糊后检测图像边缘
    10. GaussianBlur(gray,resultG,Size(3,3),5);
    11. Canny(resultG,resultG,100,200,3);
    12. //显示图像
    13. imwrite("/sdcard/DCIM/resultHigh.png",resultHigh);
    14. imwrite("/sdcard/DCIM/resultLow.png",resultLow);
    15. imwrite("/sdcard/DCIM/resultG.png",resultG);
    16. }

    (大阈值检测图像边缘)            (小阈值检测图像边缘)            (高斯模糊后检测图像边缘)

  • 相关阅读:
    [激光原理与应用-22]:《激光原理与技术》-8- 控制技术-选模技术:横模、纵模
    对webwork的理解与使用
    【无标题】剑指offer——寻找峰值
    实验三:机器学习1.0
    常用封装工具类
    Stable Diffusion WebUI使用AnimateDiff插件生成动画
    基于SQL布尔盲注与联合查询的WEB渗透
    技术人员如何培养业务的敏感度?掌握原动力和方法
    芯无界,才未来 “科创中国”第二届汽车芯片百人论坛在嘉定成功举办
    【函数讲解】botorch中的函数 is_non_dominated():用于计算非支配(non-dominated)前沿
  • 原文地址:https://blog.csdn.net/weixin_63357306/article/details/132735357