基于OpenCv的边缘检测(Sobel算子)

边缘检测Sobel算子使用效果图

原始图

X方向效果图
这里写图片描述

Y方向效果图
这里写图片描述

整体方向效果图
这里写图片描述

1、Sobel算子简介

Sobel算法是像素图像边缘检测中最重要的算子之一,在机器学习、数字媒体、计算机视觉等信息科技领域起着举足轻重的作用。在技术上,它是一个离散的一阶差分算子,用来计算图像亮度函数的一阶梯度之近似值。在图像的任何一点使用此算子,将会产生该点对应的梯度矢量或是其法矢量。

2、算子分析

Sobel 算子是一个离散的一阶微分算子,用来计算图像灰度函数的近似梯度。
在空间域上Sobel算子很容易实现,执行速度快,对部分噪声具有平滑作用,还能够提供较为精确的边缘方向信息,缺点是边缘定位精度不够高。边缘是指一个物体与另一个物体的分界处,一般边缘内外处都会有灰度值上的差异,Sobel算子就是通过像素点空间邻域内上下,左右相邻点的灰度加权运算,求取物体边缘。

经典Sobel的卷积因子为:

这里写图片描述

对于待检测边缘的图像I,分别在水平(X)方向和垂直方向(Y)方向求导,方法是分别图像I与卷积核Gx和Gy进行卷积,公式表述如下:

这里写图片描述

之后对求得的水平和垂直方向的梯度图像上的每一点执行:

这里写图片描述

G即为Sobel求得的梯度图像。

3、代码参考

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace cv;

int main()
{
    //【1】创建矩阵
    Mat g_x, g_y;
    Mat a_x, a_y, dst;

    //【2】载入原始图
    Mat src = imread("F://3.png");

    //【3】显示原始图
    imshow("src", src);

    //【4】求X方向梯度
    Sobel(src, g_x, CV_16S, 1, 0, 3, 1, 1, BORDER_DEFAULT);
    convertScaleAbs(g_x, a_x);
    imshow("X_效果图", a_x);

    //【5】求Y方向梯度
    Sobel(src, g_y, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT);
    convertScaleAbs(g_y, a_y);
    imshow("Y_效果图", a_y);

    //【6】合并梯度(近似)
    addWeighted(a_x, 0.5, a_y, 0.5, 0,dst);
    imshow("整体方向",dst);

    waitKey(0);
    return 0;
}

效果如开始所示:

这里写图片描述

源代码链接

点我下载

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值