新闻动态

Matlab实现图像边缘检测

发布日期:2021-12-19 09:46 | 文章来源:站长之家

为了在一幅图像 f 的(x,y)位置寻找边缘的强度和方向,所选择的工具就是梯度,梯度使用向量来表示:

该向量指出了图像 f 在位置(x,y)处的最大变化率的方向,梯度向量的大小表示为:

它是梯度向量方向变化率的值。
梯度向量的方向表示为:

梯度算子

roberts算子:

sobel算子:

prewitt算子:

Matlab实现

function output = my_edge(input_img,method)
if size(input_img,3)==3
 input_img=rgb2gray(input_img);
end
input_img=im2double(input_img);
sobel_x=[-1,-2,-1;0,0,0;1,2,1];
sobel_y=[-1,0,1;-2,0,2;-1,0,1];
prewitt_x=[-1,-1,-1;0,0,0;1,1,1];
prewitt_y=[-1,0,1;-1,0,1;-1,0,1];
psf=fspecial('gaussian',[5,5],1);
input_img=imfilter(input_img,psf);%高斯低通滤波,平滑图像,但可能会使图像丢失细节
input_img=medfilt2(input_img); %中值滤波消除孤立点
[m,n]=size(input_img);
output=zeros(m,n);
if nargin==2
 if strcmp(method,'sobel')
  for i=2:m-1
for j=2:n-1
 local_img=input_img(i-1:i+1, j-1:j+1);
%近似边缘检测,加快速度 %output(i,j)=abs(sum(sum(sobel_x.*local_img)))+abs(sum(sum(sobel_x.*local_img)));
 output(i,j)=sqrt(sum(sum(sobel_x.*local_img))^2+sum(sum(sobel_y.*local_img))^2);
end
  end
 elseif strcmp(method,'prewitt')
 for i=2:m-1
for j=2:n-1
 local_img=input_img(i-1:i+1, j-1:j+1);
 output(i,j)=sqrt(sum(sum(prewitt_x.*local_img))^2+sum(sum(prewitt_y.*local_img))^2);
end
 end
 else
  errordlg('maybe you should input sobel or prewitt');
 end
else  %如果不输入算子的名称,默认使用roberts算子进行边缘检测
 for i=1:m-1
  for j=1:n-1
output(i,j)=abs(input_img(i,j)-input_img(i+1,j+1))+ ...
 abs(input_img(i+1,j)-input_img(i,j+1));
  end
 end
end
output=imadjust(output);%使边缘图像更明显
thresh=graythresh(output);%确定二值化阈值
output=bwmorph(im2bw(output,thresh),'thin',inf);%强化细节
end

代码效果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

版权声明:本站文章来源标注为YINGSOO的内容版权均为本站所有,欢迎引用、转载,请保持原文完整并注明来源及原文链接。禁止复制或仿造本网站,禁止在非www.yingsoo.com所属的服务器上建立镜像,否则将依法追究法律责任。本站部分内容来源于网友推荐、互联网收集整理而来,仅供学习参考,不代表本站立场,如有内容涉嫌侵权,请联系alex-e#qq.com处理。

相关文章

实时开通

自选配置、实时开通

免备案

全球线路精选!

全天候客户服务

7x24全年不间断在线

专属顾问服务

1对1客户咨询顾问

在线
客服

在线客服:7*24小时在线

客服
热线

400-630-3752
7*24小时客服服务热线

关注
微信

关注官方微信
顶部