边缘提取算子

合集下载

实现用三种边缘检测算子对一幅图像提取边缘

实现用三种边缘检测算子对一幅图像提取边缘

实现用三种边缘检测算子对一幅图像提取边缘,给出结果并分析。

用sobel,log,candy三种算子对图像进行边缘提取:f = imread('E:\木子的U盘\大三的木子\第一学期\数字图像处理\xback.jpg');f = rgb2gray(f); %将图像转化为灰度图像[gsobel_default,ts] = edge(f,'sobel');%利用sobel算子的默认语法得到边缘图像subplot(231);imshow(gsobel_default);title('g sobel default');[glog_default,tlog]=edge(f,'log');%利用log算子的默认语法得到边缘图像subplot(233);imshow(glog_default);title('g log default');[gcanny_default,tc]=edge(f,'canny');%利用candy算子的默认语法得到边缘图像subplot(235);imshow(gcanny_default);title('g canny default');gSobel_best=edge(f,'sobel',0.05);%减少不必要的细节subplot(232);imshow(gSobel_best);title('g sobel best');gLog_best=edge(f,'log',0.003,2.25);%subplot(234);imshow(gLog_best);title('g log best');gCanny_best=edge(f,'canny',[0.04 0.10],1.5);%subplot(236);imshow(gCanny_best);title('g canny best');MATLAB图像显示如下:分析如下:sobel得出的结果与试图检测边缘的目标相差太远。

图像识别中的轮廓提取算法探索(七)

图像识别中的轮廓提取算法探索(七)

图像识别中的轮廓提取算法探索引言:图像识别技术如今已经广泛应用于各个领域,其关键之一就是图像中的轮廓提取算法。

轮廓提取的准确与否直接影响到图像识别的效果。

本文将探索图像识别中常用的轮廓提取算法,并对其原理和优缺点进行分析。

一、边缘检测算法边缘检测是图像处理中最基础的一步,是进行轮廓提取的前提。

常用的边缘检测算法有Sobel算子、Laplacian算子和Canny算子等。

1. Sobel算子Sobel算子是一种基于梯度的边缘检测算法,其原理是通过计算每个像素点的梯度值来判断其是否为边缘点。

然后根据梯度值的大小确定边缘的强度,进而提取轮廓。

Sobel算子的优点是计算简单,对噪声鲁棒性强。

但其缺点也较为明显,容易产生边缘断裂的情况,并且对角线边缘检测效果较差。

2. Laplacian算子Laplacian算子是一种基于二阶导数的边缘检测算法,其原理是通过计算图像中每个像素点的二阶导数来判断其是否为边缘点。

Laplacian算子的优点是能够检测出边缘的交叉点,能够更精准地定位边缘。

但其缺点是对噪声比较敏感,容易产生误检。

3. Canny算子Canny算子是一种综合考虑多种因素的边缘检测算法,其原理是通过梯度计算、非极大值抑制和阈值处理来提取目标轮廓。

Canny算子的优点是能够提取清晰且连续的边缘,对噪声抑制效果好。

但其缺点是计算量较大,算法较为复杂。

二、区域生长算法区域生长算法是一种基于种子点的轮廓提取方法,其原理是在图像中选择若干个种子点,然后通过像素点之间的相似性判断来逐渐生长成为一个完整的区域。

区域生长算法的优点是能够提取出连续且相似的轮廓,适用于要求较高的图像识别任务。

但其缺点是对种子点的选择比较敏感,容易受到图像质量和噪声的影响。

三、边缘跟踪算法边缘跟踪算法是一种基于边缘连接的轮廓提取方法,其原理是通过追踪边缘点的连接关系,形成完整的轮廓。

边缘跟踪算法的优点是能够提取出精细的轮廓,并且对噪声抑制效果好。

图像边缘提取

图像边缘提取

图像边缘提取图像的边界信息⼀般通过灰度值突变来体现,所以图像边缘提取⼀般通过捕捉灰度突变的⽅法来实现,捕捉灰度突变可以通过求微分来实现导数越⼤说明变化越⼤,边缘信号越强1.Sobel算⼦也叫离散微分算⼦,⼀阶微分算⼦,求导算⼦,先做⾼斯平滑在做微分求导可以在各个⽅向上求图像的梯度如⽔平⽅向 Gx=[-1,0,1,-2,0,2,-1,0,1],垂直⽅向Gy=[-1,-2,-1,0,0,0,1,2,1]最终G=sqrt(Gx^2+Gy^2),或者G=|Gx|+|Gy|第⼆种的运算速度要快于第⼀种,所以⼀般采⽤第⼆种⽅法Sobel算⼦的改进版叫Scharr算⼦[-3,0,3,-10,0,10,-3,0,3]#include<iostream>#include<opencv2/opencv.hpp>using namespace std;using namespace cv;int main(int argc, char **argv){Mat src, dst;src = imread("b.png");if (src.empty()){cout << "load img failed" << endl;return -1;}imshow("input img", src);Mat gaussian,gray_src;GaussianBlur(src, gaussian, Size(3, 3), 0, 0);cvtColor(gaussian, gray_src, CV_BGR2GRAY);imshow("blur gray", gray_src);Mat xgrad, ygrad;Sobel(gray_src, xgrad, CV_16S, 1, 0, 3);Sobel(gray_src, ygrad, CV_16S, 0, 1, 3);convertScaleAbs(xgrad, xgrad);convertScaleAbs(ygrad, ygrad);imshow("x grade", xgrad);imshow("y grade", ygrad);addWeighted(xgrad, 0.5, ygrad, 0.5, 0, dst);imshow("output img", dst);/*dst = Mat(xgrad.size(), xgrad.type());int width = dst.cols;int height = dst.rows;for(int i=0;i<height;++i)for (int j = 0; j < width; ++j){int xg = xgrad.at<char>(i, j);int yg = ygrad.at<char>(i, j);int xy = xg + yg;dst.at<char>(i, j) = saturate_cast<uchar>(xy);}imshow("output img", dst);*/waitKey(0);return0;}plance算⼦求⼆阶导数,在⼆阶导数的时候,最⼤变化处的值为0,即边缘的⼆阶导数是0流程:⾼斯模糊去噪GaussianBlur()转为灰度值cvtColor()Laplance⼆阶导数计算Laplancian()取绝对值convertScaleAbs()显⽰结果#include<iostream>#include<opencv2/opencv.hpp>using namespace std;using namespace cv;int main(int argc, char **argv){Mat src, dst;src = imread("b.png");if (src.empty()){cout << "load img failed" << endl;return -1;}imshow("input img", src);Mat gaussian,gray_src;GaussianBlur(src, gaussian, Size(3, 3), 0, 0);cvtColor(gaussian, gray_src, CV_BGR2GRAY);imshow("blur gray", gray_src);Laplacian(gray_src, dst, CV_16S,3);convertScaleAbs(dst, dst);imshow("Laplacian", dst);threshold(dst, dst, 0, 255, THRESH_OTSU | THRESH_BINARY);imshow("output img", dst);/*dst = Mat(xgrad.size(), xgrad.type());int width = dst.cols;int height = dst.rows;for(int i=0;i<height;++i)for (int j = 0; j < width; ++j){int xg = xgrad.at<char>(i, j);int yg = ygrad.at<char>(i, j);int xy = xg + yg;dst.at<char>(i, j) = saturate_cast<uchar>(xy);}imshow("output img", dst);*/waitKey(0);return0;}3.Canny边缘检测步骤:⾼斯模糊 GaussianBlur灰度转换cvtColor计算梯度Sobel/Scharr⾮最⼤信号抑制⾼低阈值输出⼆值图像⾮最⼤信号抑制需要计算梯度⽅向T1为低阈值,T2为⾼阈值,凡是⾼于T2的都保留,凡是低于T1的都丢弃,从⾼于T2的像素出发,凡是⼤于T1且相互连接的都保留,最终得到⼀个输出⼆值图像推荐的⾼低阈值⽐为3:1或2:1Canny(src,dst,threshold_low,threshold_high,Sobel_size,Lwgradient)最后⼀个如果是true就⽤L2归⼀化(开根),如果不是就L1归⼀化(绝对值),⼀般⽤L1 #include<iostream>#include<opencv2/opencv.hpp>using namespace std;using namespace cv;Mat src, dst, gray_src, gaussian;int t1_value = 50;int max_value = 255;const char* OUTPUT_TITLE = "Canny Result";void Canny_Demo(int,void*);int main(int argc, char **argv){//Mat src, dst;src = imread("b.png");if (src.empty()){cout << "load img failed" << endl;return -1;}imshow("input img", src);//Mat gaussian,gray_src;//GaussianBlur(src, gaussian, Size(3, 3), 0, 0);namedWindow(OUTPUT_TITLE, CV_WINDOW_AUTOSIZE);cvtColor(src, gray_src, CV_BGR2GRAY);createTrackbar("Threshold Value :", OUTPUT_TITLE, &t1_value, max_value, Canny_Demo);Canny_Demo(0, 0);waitKey(0);return0;}void Canny_Demo(int, void*){Mat edge_output;blur(gray_src, gray_src, Size(3, 3), Point(-1, -1), BORDER_DEFAULT);Canny(gray_src, edge_output, t1_value, t1_value * 2, 3, false);//dst.create(src.size(), src.type());//src.copyTo(dst, edge_output);imshow(OUTPUT_TITLE, ~edge_output);}去掉注释会变成彩⾊图,注意修改imshow中的输出变量。

Matlab实现:图像边缘提取

Matlab实现:图像边缘提取

Matlab实现:图像边缘提取1、边缘提取算法⽅法⼀:⼀阶微分算⼦Sobel算⼦Sobel算⼦检测⽅法对灰度渐变和噪声较多的图像处理效果较好,Sobel算⼦对边缘定位不是很准确,图像的边缘不⽌⼀个像素。

Roberts算⼦Roberts算⼦检测⽅法对具有陡峭的低噪声的图像处理效果较好,但是利⽤roberts算⼦提取边缘的结果是边缘⽐较粗,因此边缘的定位不是很准确。

Prewitt算⼦Prewitt算⼦检测⽅法对灰度渐变和噪声较多的图像处理效果较好。

但边缘较宽,⽽且间断点多。

Canny算⼦Canny算⼦是⽬前边缘检测最常⽤的算法,效果也是最理想的。

Canny⽅法不容易受噪声⼲扰,能够检测到真正的弱边缘。

优点在于,使⽤两种不同的阈值分别检测强边缘和弱边缘,并且当弱边缘和强边缘相连时,才将弱边缘包含在输出图像中。

⽅法⼆:⼆阶微分算⼦Laplacian算⼦Laplacian算⼦法对噪声⽐较敏感,所以很少⽤该算⼦检测边缘,⽽是⽤来判断边缘像素视为与图像的明区还是暗区。

2、实验结果分析⼀、边缘提取:Sobel算⼦检测⽅法对灰度渐变和噪声较多的图像处理效果较好,sobel算⼦对边缘定位不是很准确,图像的边缘不⽌⼀个像素;Roberts算⼦检测⽅法对具有陡峭的低噪声的图像处理效果较好,但是利⽤roberts算⼦提取边缘的结果是边缘⽐较粗,因此边缘的定位不是很准确;Prewitt算⼦检测⽅法对灰度渐变和噪声较多的图像处理效果较好。

但边缘较宽,⽽且间断点多;Laplacian算⼦法对噪声⽐较敏感,所以很少⽤该算⼦检测边缘,⽽是⽤来判断边缘像素视为与图像的明区还是暗区;Canny⽅法不容易受噪声⼲扰,能够检测到真正的弱边缘。

优点在于,使⽤两种不同的阈值分别检测强边缘和弱边缘,并且当弱边缘和强边缘相连时,才将弱边缘包含在输出图像中。

⼆、边缘复合增强Sobel、Robert、Prewitt算⼦的增强效果并不是很明显,尤其是Robert算⼦,因为它提取的边缘点过于稀疏和离散;Laplacian算⼦和canny算⼦的增强效果都⽐较理想,将边缘叠加上去后,整个⼿的轮廓和边缘都很清晰,直观上看,canny算⼦实现的效果⽐Laplacian算⼦好,最明显的地⽅就是⼿指尖的边缘。

形态学边缘提取算法

形态学边缘提取算法

形态学边缘提取算法引言形态学边缘提取算法是一种基于形态学原理的图像处理算法,用于从图像中提取出目标物体的边缘信息。

通过分析和改变图像中物体的形状和结构,形态学边缘提取算法可以有效地去除图像中的噪声,突出目标物体的边缘特征,为之后的图像分析和识别任务提供基础。

一、形态学基础知识在介绍形态学边缘提取算法之前,我们首先需要了解一些形态学的基本概念和操作。

形态学是一种基于图像形状和结构的数学理论,其主要用于图像的形态学处理和分析。

在形态学中,常用的操作包括膨胀、腐蚀、开运算和闭运算等。

1. 膨胀操作膨胀操作是一种使用结构元素对图像进行扩张的操作。

膨胀可以使物体的边界膨胀和增大,从而连接物体的间断部分。

膨胀操作可以用来填充物体中的空洞或连接相邻物体。

2. 腐蚀操作腐蚀操作是一种使用结构元素对图像进行侵蚀的操作。

腐蚀可以使物体的边界腐蚀和减小,从而分离相邻物体或去除物体的凸起部分。

腐蚀操作可以用来去除图像中的噪声或者分离物体。

3. 开运算和闭运算开运算是指先对图像进行腐蚀操作,再对结果进行膨胀操作的叠加操作。

开运算可以去除图像中的小的噪点并保持物体的整体形状和结构。

闭运算则是先对图像进行膨胀操作,再对结果进行腐蚀操作的叠加操作。

闭运算可以填充图像中的空洞,并保持物体的整体形状和结构。

二、基于形态学的边缘提取算法基于形态学的边缘提取算法主要利用膨胀和腐蚀等形态学操作来突出图像中物体的边缘特征。

下面将介绍几种常见的基于形态学的边缘提取算法。

1. 基于梯度的边缘提取算法基于梯度的边缘提取算法是通过计算图像的梯度来提取物体的边缘信息。

其中,梯度操作是通过对图像应用膨胀和腐蚀操作来计算得到物体的边缘。

一般来说,先对图像进行膨胀操作,再对膨胀结果进行腐蚀操作,最后计算两者之差得到物体的边缘。

2. 基于灰度差分的边缘提取算法基于灰度差分的边缘提取算法是通过计算图像中像素灰度值的差分来提取物体的边缘信息。

其中,差分操作可以通过先对图像进行膨胀操作,再对膨胀结果和原图像进行减法操作得到。

计算机视觉08 42边缘以及边特征提取

计算机视觉08 42边缘以及边特征提取

计算消失线
C
l
ground plane
▪ Properties
➢ l is intersection of horizontal plane through C with image plane
➢ Compute l from two sets of parallel lines on ground plane ➢ All points at same height as C project to l
in vector notation :
x
0 a b c y
z
lp
• 一条直线也可以表示为一个三维向量 l
点与直线的二元性质
➢ 直线l 是一个齐次的三维向量 ➢ 它 于直线上的每个点(射线)p : l p=0
l
p1 p2
可以得出结论:
l1
p
l2
• l 于 p1 和 p2 l = p1 p2 • l 是平面的法线
(0,0,0)
z
(sx,sy,s) (x,y,1)
x image plane
• 图像平面上每个点 (x,y) 对应于一条射线 (sx,sy,s)
– 射线上所有点在齐次坐标系下是等价的: (x, y, 1) (sx, sy, s)
直线的投影
▪ 图像中的一条直线对应于投影空间中的什么呢?
• 直线对应于一个通过初始直线的平面(由无数条射线构成) • 每条射线 (x,y,z)满足: ax + by + cz = 0
S(i, j) g(i 1, j 1)2g(i 1, j) g(i 1, j 1)[g(i 1, j 1)2g(i 1, j) g(i 1, j 1)]
g(i 1, j 1)2g(i, j 1) g(i 1, j 1)[g(i 1, j 1)2g(i, j 1) g(i 1, j 1)]

边缘提取

边缘提取

二阶微分锐化
2 f
2 f x2
2 f y 2
—— 算法推导
2 f x2 [ f x (i, j) f x (i 1, j)]
[ f (i, j) f (i 1, j)] [ f (i 1, j) f (i, j)]
2 f y 2
[ f y (i, j) f y (i, j 1)]
三、线的检测
通过比较典型模板的计算值,确定一个点是 否在某个方向的线上。
-1 -1 -1 222 -1 -1 -1
R1
-1 -1 2 -1 2 -1 2 -1 -1
R2
-1 2 -1 -1 2 -1 -1 2 -1
R3
2 -1 -1 -1 2 -1 -1 -1 2
R4
111111111
555555555
00 0 0 0 0 -3 -13 -20 0
30876
0 -6 -13 -13 0
12786 23269
0 1 12 00 0
50 00
问题:计算结果中出现了小于零的像素值
垂直方向的一阶锐化
—— 基本方法
垂直锐化算法的设计思想与水平锐化算法相 同,通过一个可以检测出垂直方向上的像素 值的变化模板来实现。
1 0 1 H 2 0 2
1 0 1
垂直方向的一阶锐化
—— 例题
1 0 1 H 2 0 2
1 0 1
1*1+2*2+1*3-1*3-2*2-1*8=-7
12321 21262 30876 12786 23269
00 0 00
0 -7 -17 4 0
0 -16 -25 5 0
0 -17 -22 -3 0
• Roberts算法的模板为2*2,提取出的信息较弱。 • 单方向锐化经过后处理之后,也可以对边界进行

图像边缘提取中三个算子的初步分析

图像边缘提取中三个算子的初步分析

• 95•图像边缘提取是图像识别中很重要的一步,提取边缘的效果可直接影响到目标识别的精度和准确度。

本文针对此问题,选择了三种有代表性的边缘提取算子,分别讨论了Sobel算子、Laplace算子和Canny算子,并分析各算子的特性和优缺点,初步证明了它们的边缘提取效果和适用场景。

引言:随着人工智能的飞速发展,计算机视觉方面的发展也越来越快,图像处理更是日趋成熟。

本文针对图像处理中的边缘提取,进行初步分析,为图像处理的深入研究奠定基础。

1.边缘提取Sobel 算子主要用于边缘提取,目的是计算图像灰度的近视梯度。

Sobel 算子是一种一阶微分算子,通过对上下、左右邻近点的灰度求加权差,来计算当前灰度值,因此对噪声有平滑效果,由于Sobel 算子没有把图像的主题和背景严格区分,所以边缘提取效果一般,对精度要求不高时,比较常用。

Laplace 算子是一种二阶算子,图像像素值发生最大变化的时候,它的二阶导数为零,Laplace 算子依此理论计算图像二阶导数,提取边缘。

Laplace 算子对孤立算子要比对边缘更加敏感,因此更适合于无噪声图像。

在边缘提取方面,通常和高斯模糊相结合来优化提取效果。

Canny 算子是一种多级边缘检测算法,首先利用高斯滤波器对图像进行平滑去噪,灰度转换并计算梯度,然后对非边缘像素进行抑制,最后通过高低阈值检测方法实现连接边缘。

Sobel 算子能检测出图像中比较细的边缘部分,且适用于不同的场合,有检测率高、定位精准和响应明确等特点。

缺点也特别明显,图像处理速度较慢。

图1 原图像图像边缘提取中三个算子的初步分析沈阳理工大学 史利莹• 96•2.结束语本文对Sobel 算子、Laplace 算子和Canny 算子在边缘提取上的表现进行了初步讨论,通过了解算法的工作原理,分析出算法的边缘提取思路。

三种算子可应用于不同的工作场景,比如对精度要求不高时,用Sobel 算子效率更高,对精度要求较高时,Canny 算子的效果更好。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一阶: Roberts算子、Sobel算子、Prewitt算子、Kirsch 算子、Robinson算子
二阶: Laplacian算子、Canny算子、Marr-Hildreth(LoG 算子)
Roberts 算子
在(i+1/2,j+1/2)处差分
转化为模板即为
Roberts算子,又称罗伯茨算子,是一种最简单的算子,是一种利用局部差分算子寻找边缘的算子。

他采用对角线方向相邻两象素之差近似梯度幅值检测边缘。

检测垂直边缘的效果好于斜向边缘,定位精度高,对噪声敏感,无法抑制噪声的影响。

Roberts算子检测方法对具有陡峭的低噪声的图像处理效果较好,但是提取边缘的结果是边缘比较粗,因此边缘的定位不是很准确。

相关文档
最新文档