sobel边缘检测算子例子
(整理)基于sobel、canny的边缘检测实现

基于sobel 、canny 的边缘检测实现一.实验原理Sobel 的原理:索贝尔算子(Sobel operator )是图像处理中的算子之一,主要用作边缘检测。
在技术上,它是一离散性差分算子,用来运算图像亮度函数的梯度之近似值。
在图像的任何一点使用此算子,将会产生对应的梯度矢量或是其法矢量.该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。
如果以A 代表原始图像,Gx 及Gy 分别代表经横向及纵向边缘检测的图像,其公式如下:101202*101x G A -+⎛⎫ ⎪=-+ ⎪ ⎪-+⎝⎭ 121000*121y G A+++⎛⎫ ⎪= ⎪ ⎪---⎝⎭在以上例子中,如果以上的角度Θ等于零,即代表图像该处拥有纵向边缘,左方较右方暗。
在边沿检测中,常用的一种模板是Sobel 算子。
Sobel 算子有两个,一个是检测水平边沿的 ;另一个是检测垂直平边沿的 。
与 和 相比,Sobel 算子对于象素的位置的影响做了加权,因此效果更好。
Sobel 算子另一种形式是各向同性Sobel(Isotropic Sobel)算子,也有两个,一个是检测水平边沿的 ,另一个是检测垂直平边沿的 。
各向同性Sobel 算子和普通Sobel 算子相比,它的位置加权系数更为准确,在检测不同方向的边沿时梯度的幅度一致。
由于建筑物图像的特殊性,我们可以发现,处理该类型图像轮廓时,并不需要对梯度方向进行运算,所以程序并没有给出各向同性Sobel 算子的处理方法。
由于Sobel 算子是滤波算子的形式,用于提取边缘,可以利用快速卷积函数, 简单有效,因此应用广泛。
美中不足的是,Sobel 算子并没有将图像的主体与背景严格地区分开来,换言之就是Sobel 算子没有基于图像灰度进行处理,由于Sobel 算子没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。
在观测一幅图像的时候,我们往往首先注意的是图像与背景不同的部分,正是这个部分将主体突出显示,基于该理论,我们给出了下面阈值化轮廓提取算法,该算法已在数学上证明当像素点满足正态分布时所求解是最优的。
sobel算子计算梯度

sobel算子计算梯度
Sobel算子是一种常用的边缘检测算子,用于计算图像中像素点的梯度值。
该算子由两个3x3的卷积核组成,分别用于计算图像中水平和竖直方向的梯度。
具体而言,Sobel算子可以通过以下公式来计算梯度值:
Gx = [-1 0 1 Gy = [-1 -2 -1
-2 0 2 0 0 0
-1 0 1] 1 2 1]
其中Gx和Gy分别代表水平和竖直方向的梯度值,[-1 0 1]和[-1 -2 -1; 0 0 0; 1 2 1]分别代表水平和竖直方向的卷积核矩阵。
在计算梯度值时,可以通过将Sobel算子与图像进行卷积运算,然后取得卷积结果中的梯度值来实现。
具体而言,可以采用以下步骤来计算Sobel算子的梯度值:
1. 将原图像转换为灰度图像,以方便进行计算。
2. 对灰度图像进行填充,以避免卷积结果的边角处出现不完整的像素值。
3. 将Sobel算子矩阵与填充后的灰度图像进行卷积运算,即可得到水平和竖直方向的梯度值。
4. 根据得到的梯度值,可以进一步计算出每个像素点的梯度大小和梯度方向。
通过计算图像中像素点的梯度值,可以有效地检测出图像中的边缘和轮廓,为后续的图像处理和分析提供有价值的信息。
sobel算子

Sobel算子改进算法通过以上对经典边缘检测算法的分析可知,Sobel算法的优点是计算简单,速度快。
但是由于只采用了2个方向的模板,只能检测水平和垂直方向的边缘,因此这种算法对于纹理较为复杂的图像,其边缘检测效果就不是很理想。
该算法认为:凡灰度新值大于或等于阈值的像素点时都是边缘点。
这种判断欠合理,会造成边缘点的误判,因为许多噪声点的灰度值也很大。
由于图像的边缘有许多方向,除了水平方向和垂直方向外,还有其他的方向,下面将对Sobel算子进行改进,即将算子模板扩展到8个模板,如图3.1所示。
图3.1 8个方向模板进过8个方向模板的计算,对某一幅图像进行逐点计算,并且去最大值为像素点的新灰度值,通过阈值的设定,判断边缘点。
最大值对应的模板所表示的方向为该像素点的边缘方向。
Sobel改进算法的思想与步骤。
针对经典Sobel算子对边缘具有很强的方向性特点,设计了一种基于Sobel算子上改进的算法,其主要思想是先对图像进行全局阈值的分割处理,因为分割后的图像是二值图像,此时进行边缘提取,这就可以各个方向的边缘都可以检测到。
但也可能会丢失原本直接用算子检测到的边缘。
Sobel 算子的优点是方法简单、处理速度快, 并且所得的边缘光滑, 其缺点是边缘较粗, 得到的边缘象素往往是分小段连续, 由于处理时需作二值化处理, 故得到的边缘与阈值的选取有很大的关系, 并且边缘图中梯度幅值较小的边缘也丢失了。
为克服这个缺陷,对 S( i, j)引入一个衰减因子 D, 用它去除计算的结果, 即:(,)S i j=(3.1)因此,用处理后的所得到图像与Sobel 算子直接对原始图像进行边缘检测的图像相加,这一步显得尤为重要。
最后分别对数字图像和红外图像进行MATLAB 仿真,从仿真的结果可以看出,此算法具有较好的精度。
三次样条插值Sobel 算子检测出像素级边缘后,为了得到亚像素级的边缘,要对灰度边缘图进行内插处理。
插值算法有很多种,例如最近邻插值、双线性插值、三次样条插值等等。
matlab计算sobel边缘像素数

一、引言在图像处理领域,边缘检测是一项重要的任务,它可以帮助我们找到图像中物体的轮廓,识别物体的形状和结构,以及进行目标识别和目标跟踪。
Sobel算子是一种常用的边缘检测算法,它通过计算图像中像素点的梯度来寻找图像中的边缘。
在MATLAB中,我们可以利用内置的sobel函数来计算图像的边缘像素数,本文将详细介绍如何使用MATLAB计算图像的Sobel边缘像素数。
二、Sobel算子原理介绍Sobel算子是一种典型的基于梯度的边缘检测算子,它使用两个3×3的卷积核来计算图像的梯度,分别用于检测水平和垂直方向的边缘。
Sobel算子的两个卷积核分别如下:```Gx = [[-1, 0, 1],[-2, 0, 2],[-1, 0, 1]]Gy = [[-1, -2, -1],[0, 0, 0],[1, 2, 1]]```其中,Gx用于检测水平方向的边缘,Gy用于检测垂直方向的边缘。
通过对图像应用这两个卷积核,我们可以得到图像在水平和垂直方向上的梯度,进而找到图像中的边缘。
三、MATLAB中的Sobel边缘检测函数介绍在MATLAB中,我们可以使用内置的sobel函数来计算图像的边缘像素数。
sobel函数的语法格式如下:```E = edge(I, 'sobel', threshold)```其中,I是输入的图像,'sobel'表示使用Sobel算子进行边缘检测,threshold表示阈值,用于筛选边缘像素。
sobel函数会返回一个逻辑矩阵E,其中为1的位置表示图像中的边缘像素,为0的位置表示非边缘像素。
四、使用MATLAB计算Sobel边缘像素数的示例接下来,我们将通过一个具体的示例来演示如何使用MATLAB计算图像的Sobel边缘像素数。
我们需要准备一张输入的图像,并读入MATLAB中。
假设我们已经将图像保存为test.png,现在我们可以使用imread函数将图像读入MATLAB中:```I = imread('test.png');```接下来,我们可以利用sobel函数计算图像的边缘像素数。
sobel算子边缘检测

源程序如下:#include<math.h>#include <iomanip.h>#include <stdlib.h>#include <windows.h>#include <stdio.h>#include <stdlib.h>#include <iostream.h>#include <fstream.h>#define ff(x,y) pBmpBuf0[256*(y)+(x)]#define gg(x,y) pBmpBuf9[256*(y)+(x)]//---------------------------------------------------------------------------------------unsigned char *pBmpBuf;//读入图像数据的指针int bmpWidth;//图像的宽int bmpHeight;//图像的高RGBQUAD *pColorTable;//颜色表指针int biBitCount;//图像类型,每像素位数//-------------------------------------------------------------------------------------------//读图像的位图数据、宽、高、颜色表及每像素位数等数据进内存,存放在相应的全局变量中bool readBmp(char *bmpName){FILE *fp=fopen(bmpName,"rb");//二进制读方式打开指定的图像文件if(fp==0) return 0;//跳过位图文件头结构BITMAPFILEHEADERfseek(fp, sizeof(BITMAPFILEHEADER),0);//定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中BITMAPINFOHEADER head;fread(&head, sizeof(BITMAPINFOHEADER), 1,fp); //获取图像宽、高、每像素所占位数等信息bmpWidth = head.biWidth;bmpHeight = head.biHeight;biBitCount = head.biBitCount;//定义变量,计算图像每行像素所占的字节数(必须是4的倍数)int lineByte=(bmpWidth * biBitCount/8+3)/4*4;//灰度图像有颜色表,且颜色表表项为256if(biBitCount==8){//申请颜色表所需要的空间,读颜色表进内存pColorTable=new RGBQUAD[256];fread(pColorTable,sizeof(RGBQUAD),256,fp);}//申请位图数据所需要的空间,读位图数据进内存pBmpBuf=new unsigned char[lineByte * bmpHeight];fread(pBmpBuf,1,lineByte * bmpHeight,fp);fclose(fp);//关闭文件return 1;//读取文件成功}//-----------------------------------------------------------------------------------------//给定一个图像位图数据、宽、高、颜色表指针及每像素所占的位数等信息,将其写到指定文件中bool saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height,int biBitCount, RGBQUAD *pColorTable){//如果位图数据指针为0,则没有数据传入,函数返回if(!imgBuf)return 0;//颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0 int colorTablesize=0;if(biBitCount==8)colorTablesize=1024;//待存储图像数据每行字节数为4的倍数int lineByte=(width * biBitCount/8+3)/4*4;//以二进制写的方式打开文件FILE *fp=fopen(bmpName,"wb");if(fp==0) return 0;//申请位图文件头结构变量,填写文件头信息BITMAPFILEHEADER fileHead;fileHead.bfType = 0x4D42;//bmp类型//bfSize是图像文件4个组成部分之和fileHead.bfSize= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + colorTablesize + lineByte*height;fileHead.bfReserved1 = 0;fileHead.bfReserved2 = 0;//bfOffBits是图像文件前3个部分所需空间之和fileHead.bfOffBits=54+colorTablesize;//写文件头进文件fwrite(&fileHead, sizeof(BITMAPFILEHEADER),1, fp);//申请位图信息头结构变量,填写信息头信息BITMAPINFOHEADER head;head.biBitCount=biBitCount;head.biClrImportant=0;head.biClrUsed=0;head.biCompression=0;head.biHeight=height;head.biPlanes=1;head.biSize=40;head.biSizeImage=lineByte*height;head.biWidth=width;head.biXPelsPerMeter=0;head.biYPelsPerMeter=0;//写位图信息头进内存fwrite(&head, sizeof(BITMAPINFOHEADER),1, fp);//如果灰度图像,有颜色表,写入文件if(biBitCount==8)fwrite(pColorTable, sizeof(RGBQUAD),256, fp);//写位图数据进文件fwrite(imgBuf, height*lineByte, 1, fp);//关闭文件fclose(fp);return 1;}void sobel(unsigned char *pBmpBufsobel);void main(){char readPath[]="C:\\Users\\Administrator\\desktop\\0.bmp";readBmp(readPath);sobel(pBmpBuf);delete []pBmpBuf;delete[]pColorTable;}void sobel(unsigned char *pBmpBufsobel){unsigned char *pBmpBuf0;unsigned char pBmpBuf9[256*256];pBmpBuf0=pBmpBufsobel;int i,j,vx=0,vy=0;for (i=1;i<255;i++){for(j=1;j<255;j++){vx=(ff(i-1,j-1)+2*ff(i-1,j)+ff(i-1,j+1))-(ff(i+1,j-1)+2*ff(i-1,j)+ff(i-1,j+1));vy=(ff(i-1,j-1)+2*ff(i,j-1)+ff(i+1,j-1))-(ff(i-1,j-1)+2*ff(i,j+1)+ff(i+1,j+1));gg(i,j)=abs(vx)+abs(vy);}}char writePath[]="C:\\Users\\Administrator\\desktop\\3.bmp"; saveBmp(writePath,pBmpBuf9,bmpWidth,bmpHeight,biBitCount,pColorTable);}运行前效果图:。
pythonopencvSobel、Laplace、canny算子的边缘提取以及参数解析

pythonopencvSobel、Laplace、canny算⼦的边缘提取以及参数解析前提:各种算⼦不完全区分好坏,但根据我实际操作分析得到,有的算⼦之间效果⼤相径庭,但有的也很相似,也就是各有各的⽤法,这⾥按Sobel、Laplace、canny三种算⼦作⽐较,看其结果:⼀、 Sobel、Laplace、canny边缘提取()1. Sobel算⼦边缘提取注释:gray 灰度转换后的图像,前⾯省略了⼀部灰度转换的步骤,后⾯代码会补上1,表⽰x⽅向的差分阶数,1或0------------------------------>如果只写⼀个1,代表x⽅向提取---》1,01,表⽰y⽅向的差分阶数,1或0------------------------------->如果只写⼀个1,代表y⽅向提取---》0,1sobel = cv2.Sobel(gray, cv2.CV_8U, 1, 1)#sobel算⼦边缘检测PointInvert_sobel=255-sobel#反⾊ place算⼦边缘提取注释:这⾥要说的是通过对⽐sobel算⼦的结果,发现Laplace⽐sobel效果更好,可以说是加强版,效果如下所⽰laplace = placian(gray, cv2.CV_8U, ksize=3)#laplace算⼦边缘检测PointInvert_laplace=255-laplace 3.Canny算⼦边缘提取注释:上⼀节提到过:其效果多变,主要是看设置的阈值的范围,当我们改变阈值后,图像后渐渐过滤掉⼀些背景,当然,重在阈值的选取上,当阈值选⼤的时候,也是会将图像的特征完全损坏的。
canny=cv2.Canny(gray, 50, 150)#canny边缘检测PointInvert_canny=255-canny#canny图像反⾊函数中阈值1和阈值2两者的⼩者⽤于边缘连接,⽽⼤者⽤来控制强边缘的初始段,推荐的⾼低阈值⽐在2:1到3:1之间⼆、四种图像的代码演⽰三、源码。
sobel算子梯度计算

sobel算子梯度计算
Sobel算子是一种常用的图像边缘检测算子,用于计算图像中每个像素点的梯度值。
Sobel算子在水平和垂直方向上分别采用了以下两个3x3的卷积核:
水平方向上的卷积核:
-1 0 1
-2 0 2
-1 0 1
垂直方向上的卷积核:
-1 -2 -1
0 0 0
1 2 1
对于每个像素点,分别对其周围的3x3邻域进行卷积运算,然后将水平和垂直方向上的卷积结果求平方和再开方,得到该像素点的梯度值。
具体的计算步骤如下:
1. 将图像转换为灰度图像(如果原图像不是灰度图像)。
2. 对于每个像素点,计算其水平方向上的卷积结果和垂直方向上的卷积结果。
3. 计算每个像素点的梯度值,即将水平和垂直方向上的卷积结果求
平方和再开方。
4. 根据需要对梯度值进行阈值处理,得到二值图像或者灰度图像。
Sobel算子可以用于边缘检测、图像增强等应用。
sobel算子计算例题

sobel算子计算例题Sobel算子是一种常用的边缘检测算法,它能够通过计算图像中像素点的梯度来找到图像中的边缘。
本文将介绍一个使用Sobel算子计算边缘的例子,并拓展讨论Sobel算子的原理和应用。
假设我们有一幅灰度图像,我们想要找到图像中的水平边缘。
首先,我们需要将图像转化为灰度图像,这可以通过常见的方法如将RGB图像的三个通道取平均值来实现。
接下来,我们需要应用Sobel算子来计算每个像素点的梯度。
Sobel算子分为水平和垂直两个方向的算子,分别用于计算像素点在水平方向和垂直方向上的梯度。
在这个例子中,我们只关注水平边缘,所以我们只需要使用水平方向的Sobel算子。
水平方向的Sobel算子如下:```-1 0 1-2 0 2-1 0 1```我们需要将该算子与图像中的每个像素进行卷积运算。
卷积运算的过程是将算子与图像的局部区域进行元素级别的乘法,并将乘积相加,最后得到一个新的像素值。
这个新的像素值表示了该位置上的梯度大小。
我们可以使用以下公式来计算每个像素点的梯度:```Gx = (P1 * -1) + (P2 * 0) + (P3 * 1) +(P4 * -2) + (P5 * 0) + (P6 * 2) +(P7 * -1) + (P8 * 0) + (P9 * 1)```其中,P1到P9表示了图像中某个像素点周围的8个像素点。
计算完所有像素点的梯度之后,我们可以将梯度值进行阈值处理,以确定哪些像素点属于边缘。
一种简单的方法是将梯度值与一个预先设定的阈值进行比较,大于阈值的像素点被认为是边缘点,小于阈值的像素点被认为是非边缘点。
除了边缘检测之外,Sobel算子还可以用于图像的模糊处理、图像增强等。
在图像模糊处理中,我们可以通过计算图像的梯度来减少图像中的高频噪声,从而实现图像的平滑效果。
在图像增强中,我们可以通过增加图像的梯度来强化图像的边缘信息,使图像更加清晰。
总结而言,Sobel算子是一种常用的边缘检测算法,它可以通过计算图像中像素点的梯度来找到图像中的边缘。