OpenCV如何实现Sobel边缘检测

今天小编给大家分享一下OpenCV如何实现Sobel边缘检测的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

    一、Sobel算法

    1、算法概述

    Sobel边缘检测算法比较简单,实际应用中效率比canny边缘检测效率要高,但是边缘不如Canny检测的准确,然而在很多实际应用的场合,sobel边缘却是首选,Sobel算子是高斯平滑与微分操作的结合体,所以其抗噪声能力很强,用途较多。尤其是在对效率要求较高,而对细纹理不太关系的时候。

    使用Sobel算子提取图像边缘分3个步骤:

    提取X方向的边缘,X方向一阶Sobel边缘检测算法为:

    OpenCV如何实现Sobel边缘检测  opencv ss 节点 第1张

    提取Y方向的边缘,Y方向一阶Sobel边缘检测算法为:

    OpenCV如何实现Sobel边缘检测  opencv ss 节点 第2张

    综合两个方向的边缘信息得到整幅图像的边缘。

    2、主要函数

    Sobel_x_or_y = cv2.Sobel(src, ddepth, dx, dy, dst, ksize, scale, delta, borderType)
    • src:传入的图像

    • ddepth:图像的深度

    • dxdy:指的是求导的阶数,0表示这个方向上没有求导,所填的数一般为0、1、2。

    • ksize:是Sobel算子的大小,即卷积核的大小,必须为奇数1、3、5、7。如果ksize=-1,就演变成为3x3的Scharr算子,scale是缩放导数的比例常数,默认情况为没有伸缩系数。

    • borderType:是判断图像边界的模式,这个参数默认值为cv2.BORDER_DEFAULT。

    • dstdst之后的参数都是可选参数。

    二、C++代码

    #include <iostream>
    #include <opencv2\opencv.hpp>
    
    using namespace cv;
    using namespace std;
    
    int main()
    {
    	//----------------读取图像-----------------
    	Mat img = imread("1.jpg");
    	//黑白图像边缘检测结果较为明显
    	Mat gray_img;
    	cvtColor(img, gray_img, COLOR_BGR2GRAY);
    	Mat resultX, resultY, resultXY;
    	//-------------Sobel边缘检测--------------
    	//X方向一阶边缘
    	Sobel(img, resultX, CV_16S, 2, 0, 1);
    	convertScaleAbs(resultX, resultX);
    
    	//Y方向一阶边缘
    	Sobel(img, resultY, CV_16S, 0, 1, 3);
    	convertScaleAbs(resultY, resultY);
    
    	//整幅图像的一阶边缘
    	resultXY = resultX + resultY;
    
    	//显示图像
    	imshow("resultX", resultX);
    	imshow("resultY", resultY);
    	imshow("resultXY", resultXY);
    	waitKey(0);
    	return 0;
    }

    三、python代码

    import cv2
    
    img = cv2.imread("1.jpg")
    gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # -------------------Sobel边缘检测------------------------
    x = cv2.Sobel(gray_img, cv2.CV_16S, 1, 0)
    y = cv2.Sobel(gray_img, cv2.CV_16S, 0, 1)
    # cv2.convertScaleAbs(src[, dst[, alpha[, beta]]])
    # 可选参数alpha是伸缩系数,beta是加到结果上的一个值,结果返回uint类型的图像
    Scale_absX = cv2.convertScaleAbs(x)  # convert 转换  scale 缩放
    Scale_absY = cv2.convertScaleAbs(y)
    result = cv2.addWeighted(Scale_absX, 0.5, Scale_absY, 0.5, 0)
    # ----------------------显示结果----------------------------
    cv2.imshow('img', gray_img)
    cv2.imshow('Scale_absX', Scale_absX)
    cv2.imshow('Scale_absY', Scale_absY)
    cv2.imshow('result', result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    四、结果展示

    1、灰度图

    OpenCV如何实现Sobel边缘检测  opencv ss 节点 第3张

    2、X方向一阶边缘

    OpenCV如何实现Sobel边缘检测  opencv ss 节点 第4张

    2、Y方向一阶边缘

    OpenCV如何实现Sobel边缘检测  opencv ss 节点 第5张

    3、整幅图像的一阶边缘

    OpenCV如何实现Sobel边缘检测  opencv ss 节点 第6张

    以上就是“OpenCV如何实现Sobel边缘检测”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注蜗牛博客行业资讯频道。

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    评论

    有免费节点资源,我们会通知你!加入纸飞机订阅群

    ×
    天气预报查看日历分享网页手机扫码留言评论Telegram