基于MATLAB的图像边缘提取并计算其角度和距离
图像边缘检测各种算子MATLAB实现以及实际应用

《图像处理中的数学方法》实验报告学生姓名:赵芳舟教师姓名:曾理学院:数学与统计学院专业:信息与计算科学学号:联系方式:梯度和拉普拉斯算子在图像边缘检测中的应用一、数学方法边缘检测最通用的方法是检测灰度值的不连续性,这种不连续性用一阶和二阶导数来检测。
1.(1)一阶导数:一阶导数即为梯度,对于平面上的图像来说,我们只需用到二维函数的梯度,即:,该向量的幅值:,为简化计算,省略上式平方根,得到近似值;或通过取绝对值来近似,得到:。
(2)二阶导数:二阶导数通常用拉普拉斯算子来计算,由二阶微分构成:2.边缘检测的基本思想:(1)寻找灰度的一阶导数的幅度大于某个指定阈值的位置;(2)寻找灰度的二阶导数有零交叉的位置。
3.几种方法简介(1)Sobel边缘检测器:以差分来代替一阶导数。
Sobel边缘检测器使用一个3×3邻域的行和列之间的离散差来计算梯度,其中,每行或每列的中心像素用2来加权,以提供平滑效果。
-1-21000121-101-202-101(2)Prewitt边缘检测器:使用下图所示模板来数字化地近似一阶导数。
与Sobel检测器相比,计算上简单一些,但产生的结果中噪声可能会稍微大一些。
-1-1-1000111-101-101-101(3)Roberts边缘检测器:使用下图所示模板来数字化地将一阶导数近似为相邻像素之间的差,它与前述检测器相比功能有限(非对称,且不能检测多种45°倍数的边缘)。
-10010-110(4)Laplace边缘检测器:二维函数的拉普拉斯是一个二阶的微分定义:0101-41010(八邻域)(5)LoG边缘检测器由于噪声点(灰度与周围点相差很大的像素点)对边缘检测有一定的影响,所以效果更好的是LoG算子,即Laplacian-Guass算子。
引入高斯函数来平滑噪声:该函数的Laplace算子:它把Guass平滑滤波器和Laplace锐化滤波器结合起来,先平滑掉噪声,再进行边缘检测,所以效果比单用Laplace算子要更为平滑,效果更好。
matlab中edge原理

matlab中edge原理
Matlab中的edge函数用于检测图像中的边缘特征。
边缘是图
像中灰度值突变的地方,常常对图像进行分割和特征提取非常有用。
该函数基于Canny边缘检测算法,以下是其原理:
1. 高斯滤波:首先对输入图像进行高斯平滑滤波,去除图像中的噪声,使得后续边缘检测更加精确和稳定。
2. 计算梯度:使用Sobel、Prewitt或Robert等算子计算图像灰
度值的梯度幅值和梯度方向。
3. 梯度幅值非极大值抑制:在图像中的每个点处,根据梯度方向进行非极大值抑制,即对每个像素点只保留具有最大幅值的边缘点,其他点设为零。
4. 双阈值处理:通过设置高阈值和低阈值来进一步处理边缘,将幅值大于高阈值的点作为强边缘点,将幅值介于高阈值和低阈值之间的点作为弱边缘点,并将低阈值以下的点舍弃。
5. 边缘连接:通过连接强边缘点和相邻的弱边缘点,形成完整的边缘。
6. 结果输出:最终输出的是二值图像,其中边缘点为白色,非边缘点为黑色。
Edge函数还提供了其他可选参数,如阈值选择、边缘链接等,可以根据具体应用场景和需求进行调整。
matlab imfindcircles 发现圆区域后提取

matlab imfindcircles 发现圆区域后提取如何使用Matlab中的imfindcircles函数进行圆区域的检测与提取。
第一步:什么是imfindcircles函数?imfindcircles是Matlab图像处理工具箱中的一个函数,用于在给定的图像中检测和定位圆形区域。
它基于Hough变换并使用Adaptive Gradient 方法来寻找图像中的圆形轮廓。
第二步:imfindcircles函数的语法和输入参数是什么?imfindcircles函数的基本语法如下:[centers, radii, metric] = imfindcircles(A, r, varargin)它有三个输出参数和多个输入参数:- 输出参数centers是一个m×2矩阵,其中m是检测到的圆的数量,每一行对应一个圆的中心坐标。
- 输出参数radii是一个m×1矩阵,其中每个元素对应一个圆的半径。
- 输出参数metric是一个m×1矩阵,其中每个元素对应一个圆的度量值,用于表示圆检测的可信度。
- 输入参数A是待处理的图像,可以是灰度图像或彩色图像。
- 输入参数r是一个长度为2的向量,它定义了要检测的圆半径的范围。
例如,r = [rmin, rmax]表示要检测的圆的半径范围从rmin到rmax。
- 输入参数varargin是可选的参数,可以用于设置其他参数,如灵敏度、边缘阈值等。
第三步:如何调用imfindcircles函数进行圆区域检测?假设我们有一幅灰度图像img,我们希望在其中检测圆形区域。
最简单的调用方式是:[centers, radii, metric] = imfindcircles(img, [rmin, rmax])这将使用默认参数进行圆形区域检测,并返回检测到的圆的中心坐标、半径和度量值。
如果我们想要指定额外的参数,可以使用varargin参数。
例如,我们可以设置灵敏度为0.9,并设置边缘阈值为0.1:[centers, radii, metric] = imfindcircles(img, [rmin, rmax], 'Sensitivity', 0.9, 'EdgeThreshold', 0.1)第四步:如何提取圆区域?一旦我们检测到了圆形区域,我们可以使用图像处理工具箱提供的函数来提取这些区域。
Canny算子提取边缘Matlab源代码

Canny算子提取边缘Matlab源代码介绍function e=canny_edge(I,sigma)%functione=edge(I,'canny',thresh,sigma);%该函数实现Canny算子提取边缘点%输入图像为I,标准差sigma,输出为边缘图像e[m,n]=size(I);Rr=2:m-1;cc=2:n-1;e=repmat(logical(uint8(0)),m,n);%产生同样大小的边缘图像e,初始化为1 ,即初始化边缘GaussianDieOff=-0.001;%设定高斯函数消失门限PercentOfPixelsNotEdges=-7;%用于计算边缘门限ThresholdRatio=-4;%设置两个门限的比例%首先设计高斯滤波器和它的微分pw=1:30;%设定滤波器宽度ssq=sigma*sigma;%计算方差width=max(find(exp(-(pw.*pw)/(2*sigma*sigma))>GaussianDieOff)); %计算滤波算子宽度t=(-width:width);len=2*width+1;t3=[t-.5;t;t+.5];%对每个像素左右各半个像素位置的值进行平均gau=sum(exp(-(t3.*t3)/(2*ssq))).'/(6*pi*ssq);%一维高斯滤波器dgau=(-t.*exp(-(t.*t)/(2*ssq))/ssq).';%高斯滤波器的微分ra=size(I,1);ca=size(I,2);ay=255*double(I);ax=255*double(I');h=conv(gau,dgau);%利用高斯函数滤除噪声和用高斯算子的一阶微分对图像滤波合并为一个算子ax=conv2(ax,h,'same').';%产生x方向滤波ay=conv2(ay,h,'same');%产生y方向滤波mag=sqrt((ax.*ax)+(ay.*ay));%计算滤波结果的幅度magmax=max(mag(:));if magmax>0mag=mag/magmax;%对滤波幅度进行归一化end%下面根据滤波幅度的概率密度计算滤波门限[counts,x]=imhist(mag,64);%计算滤波结果的幅度的直方图highThresh=min(find(cumsum(counts)>PercentOfPixelsNotEdges*m*n))/64; %通过设定非边缘点的比例来确定高门限lowThresh=ThresholdRatio*highThresh;%设置低门限为高门限乘以比例因子thresh=[lowThresh,highThresh];%下面进行非极大抑制%大于高门限的点归于强边缘图像%小于低门限的点归于弱边缘图像idxStrong=[];for dir=1:4idxLocalMax=cannyFindLocalMaxima(dir,ax,ay,mag); idxWeak=idxLocalMax(mag(idxLocalMax)>lowThresh);e(idxWeak)=1;idxStrong=[idxStrong;idxWeak(mag(idxWeak)>highThresh)]; endrstrong=rem(idxStrong-1,m)+1;%rem是求余数cstrong=floor((idxStrong-1)/m)+1;%向-∞取整e=bwselect(e,cstrong,rstrong,8);%通过形态学算子将两幅图像的边缘进行连接(资料素材和资料部分来自网络,供参考。
bwboundaries函数提取的边缘坐标

bwboundaries函数提取的边缘坐标bwboundaries函数是MATLAB中的一种图像分割工具,用于提取二值图像的边缘坐标。
对于二值图像,其中只有两种颜色,一般情况下是黑色和白色。
通过调用bwboundaries函数,可以将二值图像中的白色部分(即目标)提取出来,并返回所有的边界点的坐标值。
bwboundaries函数的基本语法是:B=bwboundaries(BW);其中,BW表示输入的二值图像,B是一个二维的单元数组,里面包含着所有白色目标的边界点坐标。
具体而言,B{i}表示第i个目标的边界坐标,如果输入图像中没有白色目标,则B为空。
从概念上理解,bwboundaries函数的实现过程是基于边缘检测算法,其主要思想是在图像中寻找亮度和颜色变化剧烈的边界点,即像素值变化最大的位置。
在使用bwboundaries函数时,需要注意到几个关键点:1. 输入图像必须是二值图像(即只包含黑色和白色两种颜色),否则会产生错误。
2. 由于bwboundaries处理的是二值图像,因此在进行边缘检测时,像素值只有两个选择:0和1。
在目标区域中,一般为1,而在背景区域中,一般为0。
因此,在使用bwboundaries函数时,需要注意一些二值图像的预处理操作。
3. 由于边缘检测是基于像素值变化的,因此在分割的过程中,会包括图像中所有的目标区域,不仅包括外轮廓,还包括内部的孔洞等。
如果需要去除孔洞,可以考虑使用imfill函数。
总的来说,bwboundaries函数是一种基于边缘检测的图像分割算法,它可以提取二值图像中的白色目标边界坐标,并以一个二维单元数组的形式返回这些坐标。
在使用该函数时,需要注意输入图像是否为二值图像、是否预处理好、是否需要去除孔洞等问题,并根据实际应用需求进行调整。
matlab数字图像处理实验报告

《数字图像处理实验报告》实验一图像的增强一.实验目的1.熟悉图像在MATLAB下的读写、输出;2.熟悉直方图;3.熟悉图像的线性指数等;4.熟悉图像的算术运算和几何变换。
二.实验仪器计算机、MATLAB软件三.实验原理图像增强是指根据特定的需要突出图像中的重要信息,同时减弱或去除不需要的信息。
从不同的途径获取的图像,通过进行适当的增强处理,可以将原本模糊不清甚至根本无法分辨的原始图像处理成清晰的富含大量有用信息的可使用图像。
其基本原理是:对一幅图像的灰度直方图,经过一定的变换之后,使其成为均匀或基本均匀的,即使得分布在每一个灰度等级上的像素个数.f=H等或基本相等。
此方法是典刑的图像空间域技术处理,但是由于灰度直方图只是近似的概率密度函数,因此,当用离散的灰度等级做变换时,很难得到完全平坦均匀的结果。
频率域增强技术频率域增强是首先将图像从空间与变换到频域,然后进行各种各样的处理,再将所得到的结果进行反变换,从而达到图像处理的目的。
常用的变换方法有傅里叶变换、DCT变换、沃尔什-哈达玛变换、小波变换等。
假定原图像为f(x,y),经傅立叶变换为F(u,v)。
频率域增强就是选择合适的滤波器H(u,v)对F(u,v)的频谱成分进行处理,然后经逆傅立叶变换得到增强的图像。
四.实验内容及步骤1.图像在MATLAB下的读写、输出;实验过程:>> I = imread('F:\image\');figure;imshow(I);title('Original Image');text(size(I,2),size(I,1)+15, ...'', ...'FontSize',7,'HorizontalAlignment','right');Warning: Image is too big to fit on screen; displaying at 25% > In imuitools\private\initSize at 86In imshow at 1962.给定函数的累积直方图。
matlab计算边缘保持指数 epi

matlab计算边缘保持指数 epi边缘保持指数(Edge Preservation Index,EPI)是一种用于评估图像处理算法对图像边缘保持能力的指标。
在数字图像处理中,边缘保持是一项重要的任务,其目的是在对图像进行处理的同时尽可能地保留图像中的边缘信息,以保证图像的清晰度和细节。
EPI的计算方法基于图像的灰度梯度,即图像中像素灰度值的变化率。
一般来说,边缘区域的灰度梯度较大,而平坦区域的灰度梯度较小。
因此,EPI可以通过计算处理后图像和原始图像的灰度梯度之间的差异来评估图像处理算法的边缘保持能力。
具体而言,EPI的计算方法如下:首先,对原始图像进行边缘检测,得到边缘图像。
然后,对处理后的图像同样进行边缘检测,得到处理后的边缘图像。
接下来,计算原始边缘图像和处理后边缘图像之间的差异。
最后,将这些差异值求平均得到EPI的值,数值越接近1表示处理结果对边缘的保持能力越好,数值越接近0表示处理结果对边缘的保持能力越差。
EPI的应用广泛,特别是在图像增强、图像去噪和图像压缩等领域。
通过计算EPI,我们可以比较不同算法在边缘保持方面的效果,从而选择最适合的算法应用于特定的图像处理任务中。
例如,在图像增强中,我们希望能够提高图像的对比度和清晰度,同时保留图像中的边缘信息。
通过计算不同算法的EPI值,我们可以选择对边缘保持能力较好的算法来增强图像,从而达到我们的目标。
在图像去噪中,我们希望去除图像中的噪声,但是同时又不希望丢失图像中的细节和边缘信息。
通过计算EPI,我们可以评估不同去噪算法在边缘保持方面的效果,选择对边缘保持能力较好的算法来去噪图像,从而在去除噪声的同时保留图像的细节。
在图像压缩中,我们需要在尽可能减小图像文件大小的同时,保持图像的质量和细节。
通过计算不同压缩算法的EPI值,我们可以选择对边缘保持能力较好的算法来进行图像压缩,从而在减小文件大小的同时保持图像的清晰度。
边缘保持指数(EPI)是一种用于评估图像处理算法对图像边缘保持能力的指标。
canny边缘检测及matlab实现

北京工业大学研究生课程考试答题纸课程类别:学位课选修课研究生学号:研究生姓名:学生类别:博士硕士工程硕士进修生考试时间:年月日一、实验目的:熟悉边缘检测原理,并运用matlab软件实现图像的canny边缘检测,体会canny 边缘检测的优缺点。
二、实验内容:编写matlab程序,实现对lena图像的边缘检测,输出程序运行结果。
三、实验原理或步骤:首先回顾一下边缘检测的一般步骤:边缘检测算法一般包含如下四个步骤:1.滤波(去噪)。
2.增强(一般是通过计算梯度幅值)。
3.检测(在图像中有许多点的梯度幅值会比较大,而这些点并不都是边缘,所以应该用某种方法来确定边缘点,比如最简单的边缘检测判据:梯度幅值阈值)。
4.定位(有的应用场合要求确定边缘位置,可以在子像素水平上来估计,指出边缘的位置和方向)Canny边缘检测的算法步骤:1.用高斯滤波器平滑图像(不同尺度的Canny检测子由高斯的不同标准差来表示)用一阶偏导的有限差分来计算梯度的幅值和方向。
2.对高斯平滑后的图像进行sobel边缘检测。
这里需要求横的竖的还有联合的,所以一共三个需要sobel边缘检测图像。
3.对联合的sobel检测图像进行非极大值抑制(Non-Maxima Suppression, NMS)4.用双阈值算法检测和连接边缘,并进行滞后阈值处理。
其中非极大值抑制细化了幅值图像中的屋脊带,只保留幅值局部变化最大的点。
双阈值算法:用两个阈值得到两个阈值图像,然后把高阈值的图像中的边缘连接成轮廓,连接时到达轮廓的端点时,在低阈值图像上找可以连接的边缘。
不断收集,直到所有的间隙连接起来为止。
四、运行结果和分析每步运行效果:Figure1原图:Figure2 高斯模糊后:Figure3 sobel边缘检测后:Figure4 非极大抑制后:Figure5 上阈值120,下阈值100检测结果:Canny算子的方向性使得它的边缘检测和定位优于其他算子,具有更好的边缘强度估计,能产生梯度方向和强度两个信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MATLAB
目的:检测下列图像的白色区域和红色区域的边缘,并计算其角度和距离。
1)利用烟草包装纸、基准线以及传送带三者之间的特性,首先将高速相机拍摄到的图片进
行红色通道分离。
2)将通道分离后的图片进行二值化,得到二值图像
3)将所得到的二值图像进行边缘检测
4)将边缘检测后的图像先腐蚀运算,再进行膨胀运算,得到最终图像
5)将图8最终得到的两条边界线使用MATLAB进行最小二乘法拟合,分别得到两条边界线
的关系式,并使用数学方法计算出两条边界线的角度以及图像最左端的直线距离。
此例中,计算得到的两边沿的偏离角大小为3.15°,两边沿最左端距离大小为303.51像素。
clear clc
image=imread('Image.jpg'); %读取图片imtool(image); %显示所读取的图片
imager = image(:,:,1); %提取图片红色通道
imtool(imager);
BW = im2bw(imager,0.15); %二值化
BW = ~BW;
imtool(BW);
BW1 = edge(BW,'canny',0.95); %检测边缘imtool(BW1);
se1 = strel('line',9,176); %腐蚀
IM1 = imerode(BW1,se1);
imtool(IM1);
se2 = strel('line',60,176); %膨胀
IM2 = imdilate(IM1,se2);
imtool(IM2);
[a,b]=size(IM2);
[h,w]=find(IM2==1); %筛选边界点,像素值为1
yx=[h,w];
yx_size = size(yx); %像素点坐标对数
%数据筛选出上下边界线以供拟合
p=1;q=1;
for k=1:yx_size(1,1)
if(yx(k,1)>=600)
yx1(p,:) = yx(k,:);
p = p+1;
else
yx2(q,:) = yx(k,:);
q = q+1;
end
end
yx1_c1 = yx1(:,1);yx1_c2 = yx1(:,2);
yx2_c1 = yx2(:,1);
yx2_c2 = yx2(:,2);
%绘制分离边界的像素点
plot(w,h,'r.')
axis([0 b 0 a]);
hold on
%绘制拟合的直线
xy1=polyfit(yx1_c2,yx1_c1,1);
plot(1:b,polyval(xy1,1:b),'b-')
axis([0 b 0 a]);
hold on
xy2=polyfit(yx2_c2,yx2_c1,1);
plot(1:b,polyval(xy2,1:b),'y-')
axis([0 b 0 a]);
hold on
%计算两直线的夹角
angle_xy = 180*atan( abs((xy2(1,1)-xy1(1,1)))/(1+xy1(1,1) *xy2(1,1)) )/pi %角度
%计算最左端的距离,以像素点为单位
dist_xy = polyval(xy1,0)-polyval(xy2,0)。