Sobel边缘检测
Sobel算子:[-1 0 1
-2 0 2
-1 0 1]
用此算子与原图像做卷积,可以检测出垂直方向的边缘。算子作用在图像的第二列,结果是:200,200,200;作用在第三列,结果是:
200,200,200;
对当前列左右两侧的元素进行差分,由于边缘的值明显小于(或大于)周边像素,所以边缘的差分结果会明显不同,这样就提取出了垂直边缘。同理,把上面那个矩阵转置一下,就是提取水平边缘。这种差分操作就称为图像的梯度计算。
图像梯度
概念: 把图片想象成连续函数,因为边缘部分的像素值是与旁边像素明显有区别的,所以对图片局部求极值,就可以得到整幅图片的边缘信息了。不过图片是二维的离散函数,导数就变成了差分,这个差分就称为图像的梯度。
理解:求一阶差分应该是指对图像相邻像素求取差分。
边缘 – 是像素值发生跃迁的地方(变化率最大处,导数最大处),是图像的显著特征之一,在图像特征提取、对象检测、模式识别等方面都有重要的作用。
Sobel算子和Scharr算子
(1)Sobel算子:是离散微分算子(discrete differentiation operator),用来计算图像灰度的近似梯度,梯度越大越有可能是边缘。
Soble算子的功能集合了高斯平滑和微分求导,又被称为一阶微分算子,求导算子,在水平和垂直两个方向上求导,得到的是图像在X方法与Y方向梯度图像。
缺点:比较敏感,容易受影响,要通过高斯模糊(平滑)来降噪。
算子是通过权重不同来扩大差异。
梯度计算:(在两个方向求导,假设被作用图像为 I)
水平变化: 将 I 与一个奇数大小的内核 Gx进行卷积。比如,当内核大小为3时, Gx的计算结果为:
垂直变化: 将 I 与一个奇数大小的内核 Gy进行卷积。比如,当内核大小为3时, Gy的计算结果为:
在图像的每一像素上,结合以上两个结果求出近似梯度:

有时也用下面更简单公式代替,计算速度快:(最终图像梯度)。
(2)Scharr:当内核大小为3时, 以上Sobel内核可能产生比较明显的误差(毕竟,Sobel算子只是求取了导数的近似值)。 为解决这一问题,OpenCV提供了 Scharr 函数,但该函数仅作用于大小为3的内核。该函数的运算与Sobel函数一样快,但结果却更加精确,不怕干扰,其内核为:
(3)Sobel/Scharr提取边缘(求导)步骤:
1)高斯模糊平滑降噪:
GaussianBlur( src, dst, Size(3,3), 0, 0, BORDER_DEFAULT );
2)转灰度:
cvtColor( src, gray, COLOR_RGB2GRAY );
3)求X和Y方向的梯度(求导):
Sobel(gray_src, xgrad, CV_16S, 1, 0, 3);
Sobel(gray_src, ygrad, CV_16S, 0, 1, 3);
Scharr(gray_src, xgrad, CV_16S, 1, 0);
Scharr(gray_src, ygrad, CV_16S, 0, 1);
4)像素取绝对值:
convertScaleAbs(A, B); //计算图像A的像素绝对值,输出到图像B
5)相加X和Y,得到综合梯度,称为振幅图像:
addWeighted( A, 0.5,B, 0.5, 0, AB); //混合权重相加,效果较差
或者循环获取像素,每个点直接相加,效果更好。
来源:https://zhuanlan.zhihu.com/p/40491339
来源:https://zhuanlan.zhihu.com/p/50966625
Sobel算子根据像素点上下、左右邻点灰度加权差,在边缘处达到极值这一现象检测边缘。对噪声具有平滑作用,提供较为精确的边缘方向信息,边缘定位精度不够高。当对精度要求不是很高时,是一种较为常用的边缘检测方法。
Sobel算子是典型的基于一阶导数的边缘检测算子,由于该算子中引入了类似局部加权平均的运算,因此对噪声具有平滑作用,能很好的消除噪声的影响。Sobel算子对于象素的位置的影响做了加权。
Sobel算子包含两组3x3的矩阵,分别为横向及纵向模板,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。
Sobel算子是典型的基于一阶导数的边缘检测算子,是离散型的差分算子。该算子对噪声具有平滑作用,能很好的消除噪声的影响。Sobel算子对于像素的位置的影响做了加权,与Prewitt算子、Roberts算子相比因此效果更好。
Sobel算子包含两组3x3的矩阵,分别为横向及纵向模板,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。
链接:https://zhuanlan.zhihu.com/p/56728333
- import cv2
- import numpy as np
- img = cv2.imread("fengjing.jpg", 0)
- x = cv2.Sobel(img,cv2.CV_16S,1,0) #1,0代表只计算x方向计算边缘
- y = cv2.Sobel(img,cv2.CV_16S,0,1) #0,1代表只在y方向计算边缘
- absX = cv2.convertScaleAbs(x)
- absY = cv2.convertScaleAbs(y)
- dst = cv2.addWeighted(absX,0.5,absY,0.5,0)
- cv2.imshow("absX", absX)
- cv2.imshow("absY", absY)
- cv2.imshow("Result", dst)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
测试图片:
运行结果:
Sobel边缘检测的更多相关文章
- 图像特征提取:Sobel边缘检测
前言 点和线是做图像分析时两个最重要的特征,而线条往往反映了物体的轮廓,对图像中边缘线的检测是图像分割与特征提取的基础.文章主要讨论两个实际工程中常用的边缘检测算法:Sobel边缘检测和Canny边缘 ...
- Sobel边缘检测算法(转载)
转载请注明出处: http://blog.csdn.net/tianhai110 索贝尔算子(Sobel operator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰 ...
- 数字图像处理之sobel边缘检测
在前两部文章介绍了几种边缘检测算法,和位图的内存结构.如果对前两篇文章已经理解透彻 了,那么本文将带你进入数字图像处理的世界. 本文通过C代码实现基本的sobel边缘检测,包括8个方向和垂直方向: 代 ...
- 基于FPGA的Sobel边缘检测的实现
前面我们实现了使用PC端上位机串口发送图像数据到VGA显示,通过MATLAB处理的图像数据直接是灰度图像,后面我们在此基础上修改,从而实现,基于FPGA的动态图片的Sobel边缘检测.中值滤波.Can ...
- 基于MATLAB的Sobel边缘检测算法实现
图像边缘就是图像灰度值突变的地方,也就是图像在该部分的像素值变化速度非常之快,就比如在坐标轴上一条曲线有刚开始的平滑突然来个大转弯,在变化出的导数非常大. Sobel算子主要用作边缘检测,它是一离散型 ...
- 【转】基于FPGA的Sobel边缘检测的实现
前面我们实现了使用PC端上位机串口发送图像数据到VGA显示,通过MATLAB处理的图像数据直接是灰度图像,后面我们在此基础上修改,从而实现,基于FPGA的动态图片的Sobel边缘检测.中值滤波.Can ...
- Sobel边缘检测算法
索贝尔算子(Sobel operator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度之近似值.在图像的任何一点使用此算子,将会产生对应的灰度矢量或是其法矢量 Sobe ...
- zedboard zynq 学习 sobel 边缘检测 IP核 制作 根据 文档 Xapp890
官方文档http://www.xilinx.com/support/documentation/application_notes/xapp890-zynq-sobel-vivado-hls.pdf ...
- SSE再学习:灵活运用SIMD指令6倍提升Sobel边缘检测的速度(4000*3000的24位图像时间由180ms降低到30ms)。
这半年多时间,基本都在折腾一些基本的优化,有很多都是十几年前的技术了,从随大流的角度来考虑,研究这些东西在很多人看来是浪费时间了,即不能赚钱,也对工作能力提升无啥帮助.可我觉得人类所谓的幸福,可以分为 ...
随机推荐
- 已经mock类中引用的其它service类,但是在invoke私有方法的时候,该service类是空值
错误原因:没有在开始测试用例的时候,初始化类的所有注解方法. 解决方法: 使用mock方法创建mock对象时,需要在测试用例执行前执行以下代码.通常, 这句代码可以放在测试基类或者@Before 中. ...
- bzoj3174【TJOI2013】解救小矮人
3174: [Tjoi2013]解救小矮人 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 573 Solved: 293 [Submit][Stat ...
- C#趣味程序---理財高手
问题:如果银行存款分五种 利率:0.63% 一年 月 利率:0.66% 二年 月 利率:0.69% 三年 月 利率:0.75% 五年 月 利率:0.84% 八年 月 如今 ...
- 4.关于QT中的QFile文件操作,QBuffer,Label上加入QPixmap,QByteArray和QString之间的差别,QTextStream和QDataStream的差别,QT内存映射(
新建项目13IO 13IO.pro HEADERS += \ MyWidget.h SOURCES += \ MyWidget.cpp QT += gui widgets network CON ...
- tcp 状态转移图详解
首先看一张图片: 虚线表示服务端的状态转移,实现表示客户端的状态转移. 初始的close状态并不是真是的状态,只是为了方便描述开始和终止状态而构造出来的. 从服务端的状态转移开始说: 服务端打开后处于 ...
- php 判断数组中是否有重复的值
$input = array(4, "4", "3", 4, 3, "3"); $result = array_unique($input) ...
- PYTHON流向下载
#-*- coding:utf-8 -*- import gzip import re import http.cookiejar import urllib.request import urlli ...
- 浅析js绑定同一个事件依次触发问题系列(一)
算了 还是上代码吧 记得写过这篇文章,但是找不到了(对,就是找不到了,算了再写一遍吧) 也是在群中有人问这个绑定不同事件 或者同一个事件的依次触发问题 个人建议如果是一个事件的话那么最好写成函数, ...
- iOS开发 剖析网易新闻标签栏视图切换(addChildViewController属性介绍)
本文转载至 http://www.tuicool.com/articles/3ymMzub CSDN博客原文 http://blog.csdn.net/hmt20130412/article/det ...
- task15-18
[说明]貌似maven在真实的项目实战中挺重要的,可以省去大量的工作,有必要单独学习一下 15.创建一个新的maven项目 16.在src/main/java下随便创建一个java文件,clean,i ...