5.2 基本边缘检测算子—Sobel

Sobel算子是应用广泛的离散微分算子之一,用于图像处理中的边缘检测,计算图像灰度的近似梯度。

基于图像卷积来实现在水平方向和垂直方向检测对应方向上的边缘。

对于源图像与奇数Sobel水平核Gx、垂直核Gy进行卷积可计算水平与垂直变换。

Sobel算子在进行边缘检测时候效率较高,对精度要求不是很高时候,是一种较为常用的边缘检测方法。

Sobel算子对沿着x轴和y轴的排列表示得很好,但是对于其他角度的表示却不够精确,这时候我们可以使用Scharr滤波器。

5.2.1 非极大值一直Sobel检测

步骤1/2/3/4

https://blog.csdn.net/gone_huilin/article/details/53223622

https://bbs.csdn.net/topics/370004267

5.2.2 图像直接卷积实现Sobel

5.2.3 图像卷积下非极大值抑制Sobel

非极大值抑制虽然能够较好剔除虚假边缘点,但对于某些特定场景下的边缘检测并不适用,例如污损文本字符识别。

5.2.4 Sobel库函数实现

 1 /////////////////////////////////5.2.4 Sobel库函数实现//////////////////////////////
 2 ////////https://blog.csdn.net/gone_huilin/article/details/53223636
 3 #include <opencv2/core/core.hpp>
 4 #include <opencv2/highgui/highgui.hpp>
 5 #include "opencv2/imgproc/imgproc.hpp"
 6 #include <iostream>
 7 using namespace cv;
 8 int main()
 9 {
10     cv::Mat srcImage = imread("D:\\楼房.jpg");
11     if (!srcImage.data)
12         return -1;
13     cv::Mat srcGray;
14     cvtColor(srcImage, srcGray, CV_RGB2GRAY);
15     imshow("srcGray", srcGray);
16     // 定义边缘图,水平及垂直
17     cv::Mat edgeMat, edgeXMat, edgeYMat;
18     // 求x方向Sobel边缘
19     Sobel(srcGray, edgeXMat, CV_16S, 1, 0, 3, 1,
20         0, BORDER_DEFAULT);
21     // 求y方向Sobel边缘
22     Sobel(srcGray, edgeYMat, CV_16S, 0, 1, 3, 1,
23         0, BORDER_DEFAULT);
24     // 线性变换转换输入数组元素成8位无符号整型
25     convertScaleAbs(edgeXMat, edgeXMat);
26     convertScaleAbs(edgeYMat, edgeYMat);
27     // x与y方向边缘叠加
28     addWeighted(edgeXMat, 0.5, edgeYMat, 0.5, 0, edgeMat);
29     cv::imshow("edgeYMat", edgeYMat);
30     imshow("edgeMat", edgeMat);
31     // 定义Scharr边缘图像
32     cv::Mat edgeMatS, edgeXMatS, edgeYMatS;
33     // 计算x方向Scharr边缘
34     Scharr(srcGray, edgeXMatS, CV_16S, 1, 0, 1,
35         0, BORDER_DEFAULT);
36     convertScaleAbs(edgeXMatS, edgeXMatS);
37     // 计算y方向Scharr边缘
38     Scharr(srcGray, edgeYMatS, CV_16S, 0, 1, 1,
39         0, BORDER_DEFAULT);
40     // 线性变换转换输入数组元素成8位无符号整型
41     convertScaleAbs(edgeYMatS, edgeYMatS);
42     // x与y方向边缘叠加
43     addWeighted(edgeXMatS, 0.5, edgeYMatS, 0.5, 0, edgeMatS);
44     cv::imshow("edgeMatS", edgeMatS);
45     cv::waitKey(0);
46     return 0;
47 }

5.3 基本边缘检测算子--Laplace

拉普拉斯算子是最简单的各向同性二阶微分算子,具有旋转不变形。

根据微分特性点,该像素点的二阶微分为零的点为边缘点。

图像中奇异点如亮点变得更亮,对于图像中灰度变化剧烈的区域,拉普拉斯算子能实现其边缘检测。其利用二次微分特性与峰值间过零点来确定边缘位置,对奇异点或边界点更加敏感,常应用于图像锐化(突出图像的细节或增强被模糊的图像细节,实现灰度反差增强,使图像变得清晰。积分运算或加权平均让图像变得模糊)工作。

 1 ///////////////////////////////////5.2.5 基本边缘检测算子--Laplace//////////////////////////////
 2 //////https://blog.csdn.net/Chenyukuai6625/article/details/74784626
 3 #include <opencv2/opencv.hpp>
 4 #include<opencv2/highgui/highgui.hpp>
 5 #include<opencv2/imgproc/imgproc.hpp>
 6
 7 using namespace cv;
 8
 9 int main()
10 {
11     //【0】变量的定义
12     Mat src, src_gray, dst, abs_dst;
13
14     //【1】载入原始图
15     src = imread("D:\\日光.jpg");
16
17     //【2】显示原始图
18     imshow("【原始图】图像Laplace变换", src);
19
20     //【3】使用高斯滤波消除噪声
21     GaussianBlur(src, src, Size(3, 3), 0, 0, BORDER_DEFAULT);
22
23     //【4】转换为灰度图
24     cvtColor(src, src_gray, CV_RGB2GRAY);
25
26     //【5】使用Laplace函数
27     Laplacian(src_gray, dst, CV_16S, 3, 1, 0, BORDER_DEFAULT);
28
29     //【6】计算绝对值,并将结果转换成8位
30     convertScaleAbs(dst, abs_dst);
31
32     //【7】显示效果图
33     imshow("【效果图】图像Laplace变换", abs_dst);
34
35     waitKey(0);
36
37     return 0;
38 }

5.4 基本边缘检测算子——Roberts

Roberts算子是利用局部差分寻找边缘的一种算子,是最简单的边缘检测算子。Roberts算子利用对角线方向相邻两像素之差近似梯度赋值来检测边缘,检测垂直边缘的效果要优于其他方向边缘,定位精度高,但对噪声抑制能力较弱。

https://blog.csdn.net/qq_20823641/article/details/52079628

原文地址:https://www.cnblogs.com/thebreakofdawn/p/9571775.html

时间: 2024-10-11 10:36:16

5.2 基本边缘检测算子—Sobel的相关文章

边缘检测之Sobel检测算子

在讨论边缘算子之前,首先给出一些术语的定义: (1)边缘:灰度或结构等信息的突变处,边缘是一个区域的结束,也是另一个区域的开始,利用该特征可以分割图像. (2)边缘点:图像中具有坐标[x,y],且处在强度显著变化的位置上的点. (3)边缘段:对应于边缘点坐标[x,y]及其方位 ,边缘的方位可能是梯度角. 二.Sobel算子的基本原理 Sobel算子是一阶导数的边缘检测算子,在算法实现过程中,通过3×3模板作为核与图像中的每个像素点做卷积和运算,然后选取合适的阈值以提取边缘. 一个特殊卷积所实现的

【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本: 2.4.9 本篇文章中,我们将一起学习OpenCV中

图像处理常用边缘检测算子总结

图像处理常用边缘检测算子总结 转 不同图像灰度不同,边界处一般会有明显的边缘,利用此特征可以分割图像.需要说明的是:边缘和物体间的边界并不等同, 边缘指的是图像中像素的值有突变的地方,而物体间的边界指的是现实场景中的存在于物体之间的边界.有可能有边缘的地方并非边界,也有可能边界的地方并无边 缘,因为现实世界中的物体是三维的,而图像只具有二维信息,从三维到二维的投影成像不可避免的会丢失一部分信息:另外,成像过程中的光照和噪声也是不可避 免的重要因素.正是因为这些原因,基于边缘的图像分割仍然是当前图

图像处理常用边缘检测算子总结(转)

不同图像灰度不同,边界处一般会有明显的边缘,利用此特征可以分割图像.需要说明的是:边缘和物体间的边界并不等同,边缘指的是图像中像素的值有突变的地方,而物体间的边界指的是现实场景中的存在于物体之间的边界.有可能有边缘的地方并非边界,也有可能边界的地方并无边缘,因为现实世界中的物体是三维的,而图像只具有二维信息,从三维到二维的投影成像不可避免的会丢失一部分信息:另外,成像过程中的光照和噪声也是不可避免的重要因素.正是因为这些原因,基于边缘的图像分割仍然是当前图像研究中的世界级难题,目前研究者正在试图

灰度图像--图像分割 边缘检测算子 综述

转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不满意.有些网站转载了我的博文,很开心的是自己写的东西被更多人看到了,但不开心的是这段话被去掉了,也没标明转载来源,虽然这并没有版权保护,但感觉还是不太好,出于尊重文章作者的劳动,转载请标明出处!!!! 文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro 开篇废话 本来想这

OpenCV图像处理篇之边缘检测算子

3种边缘检测算子 灰度或结构等信息的突变位置是图像的边缘,图像的边缘有幅度和方向属性,沿边缘方向像素变化缓慢,垂直边缘方向像素变化剧烈.因此,边缘上的变化能通过梯度计算出来. 一阶导数的梯度算子 对于二维的图像,梯度定义为一个向量, Gx对于x方向的梯度,Gy对应y方向的梯度,向量的幅值本来是 mag(f)?=?(Gx2?+?Gy2)1/2,为简化计算,一般用mag(f)=|Gx|+|Gy|近似,幅值同时包含了x而后y方向的梯度信息.梯度的方向为 α?=?arctan(Gx/Gy) . 由于图像

边缘检测算子(edge detectors)

边缘检测算子是一组用于在亮度函数中定位变化的非常重要的局部图像预处理方法.描述边缘的检测子使用偏导数,图像函数的变化可以用指向函数函数最大增长方向的梯度来表示. 不同图像灰度不同,边界处一般会有明显的边缘,利用此特征可以分割图像.需要说明的是:边缘和物体间的边界并不等同,边缘指的是图像中像素的值有突变的地方,而物体间的边界指的是现实场景中的存在于物体之间的边界.有可能有边缘的地方并非边界,也有可能边界的地方并无边缘,因为现实世界中的物体是三维的,而图像只具有二维信息,从三维到二维的投影成像不可避

OpenCV2.4.10之samples_cpp_tutorial-code_learn-----ImgTrans(Laplace边缘检测和Sobel边缘检测,图像重映射)

本系列学习笔记参考自OpenCV2.4.10之opencv\sources\samples\cpp\tutorial_code和http://www.opencv.org.cn/opencvdoc/2.3.2/html/genindex.html 在图像处理中,往往需要对图像提取有效的边缘.本博文将介绍Laplace边缘检测和Sobel边缘检测,以及图像的重映射. 1.Laplace_Demo.cpp(Laplace边缘检测) Demo源码及注释如下: #include "stdafx.h&qu

边缘检测算子和小波变换提取图像边缘【matlab】

Roberts边缘检测算子:根据一对互相垂直方向上的差分可用来计算梯度的原理,采用对角线方向相邻两像素之差. 小波变换的方法比较适用于展现夹带在正常信号中的瞬间反常现象,具有方向敏感性.所以可以边缘检测. Roberts边缘检测算子: clear; I=imread('D:\文件及下载相关\图片\gray2.png'); I=rgb2gray(I); grayPic=mat2gray(I); [m,n]=size(grayPic); newGrayPic=grayPic; robertsNum=