用MATLAB实现图像边缘检测

1.介绍灰度处理及三种边缘检测算法

1.1  灰度处理算法

灰度化处理就是将一幅彩色图像转化为灰度图像的过程。
当我们在电脑、电视、或手机等显示器上显示彩色时,RGB模型是为达到目的而较为常用的一种彩色信息表达方式。RGB模型也称为加色混色模型,是以R(红)G(绿)B(蓝)三色光互相叠加来实现混色的方法,尤其适用于显示器等发光物体。
而灰度化就是使彩色图像的R、G、B分量相等的过程,即令R=G=B,此时的彩色表示的就是灰度颜色。
图像灰度化的目的是为了简化矩阵,提高运算速度。
h=rgb2gray(f);
彩色图像中的每个像素颜色由R、G、B三个分量来决定,而每个分量的取值范围都在0-255之间,这样对计算机来说,彩色图像的一个像素点就会有256*256*256=16777216种颜色的变化范围! 而灰度图像是R、G、B分量相同的一种特殊彩色图像,对计算机来说,一个像素点的变化范围只有0-255这256种。 彩色图片的信息含量过大,而进行图片识别时,其实只需要使用灰度图像里的信息就足够了,所以图像灰度化的目的就是为了提高运算速度。

1.2  Sobel算法

 Sobel主要用于获得数字图像的一阶梯度,是一种离散性差分算子。     图像处理中认为,灰度值变化剧烈的地方就是边缘。那么如何判断灰度值变化?如何度量“剧烈”?Sobel算子就对这些问题做了自己的规范,Sobel算子认为,邻域的像素对当前像素产生的影响不是等价的,所以距离不同的像素具有不同的权值,对算子结果产生的影响也不同。一般来说,距离越远,产生的影响越小。      Sobel算子的原理,对传进来的图像像素做卷积,卷积的实质是在求梯度值,或者说给了一个加权平均,其中权值就是所谓的卷积核;然后对生成的新像素灰度值做阈值运算,以此来确定边缘信息。
卷积核和算法实现原理:

  该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。如果以A代表原始图像,Gx及Gy分别代表经横向及纵向边缘检测的图像灰度值,其公式如下:

具体计算如下: 图像的每一个像素的横向及纵向灰度值通过以下公式结合,来计算该点灰度的大小:

通常,为了提高效率使用不开平方的近似值:

然后可用以下公式计算梯度方向:

1.3  Prewitt算法

Prewitt算子与Sobel算子相同,Prewitt算子适合用来识别噪声较多、灰度渐变的图像,靠近中心像素的点给予的权重比Sobel要小

1.4 Canny算法

从表面效果上来讲,Canny算法是对Sobel、Prewitt等算子效果的进一步细化和更加准确的定位,同时先进行高斯滤波(噪声平滑)再进行图像梯度计算的思想。 Canny算法的步骤如下:
1、对输入图像进行高斯平滑,降低错误率。 实现方法就是采用高斯平滑算子进行卷积运算。假设原图像为img0 gauss = [1 2 1; 2 4 2;1 2 1] / 16; % Gauss平滑模板 img = conv2(img0, gauss, ‘same’); % 平滑
2、计算梯度幅度和方向来估计每一点处的边缘强度与方向。 一般采用Sobel算子的水平方向和竖直方向的模板分别进行卷积,分别得到水平方向的检测结果DX和垂直方向的检测结果DY,进一步可得到梯度的幅度:
sobelx = [-1 0 1; -2 0 2; -1 0 1]; % Sobel水平边缘模板 sobely = sobelx’; % Sobel垂直边缘模板 gradx = conv2(img, sobelx, ‘same’); % 水平边缘卷积 grady = conv2(img, sobely, ‘same’); % 垂直边缘卷积
M = 根号下DX的平方+DY的平方 为了简化计算,通常也可以近似写作: M=|DX|+|DY| 边缘方向为: θ=arctan⁡(DY/DX)
  原来梯度方向与边缘方向满足左手定则(掌心对图像,大拇指指向边缘方向,四指则是梯度方向),也就是说通过计算出的某个像素点的梯度方向我们可以得到该位置的边缘方向。    在图像区域内,边缘可以划分为垂直、水平、45°、135°,4个方向,据此将360等分4份(不论正负,区域关于中心方向对称),同样的梯度方向也为四个方向,可划分为4份

3、根据梯度方向,对梯度幅值进行非极大值抑制。 本质上是对Sobel、Prewitt等算子结果的进一步细化。 非极大值抑制是Canny算法最重要的思想,它不像其他的算子仅仅利用了梯度值的大小,还利用了梯度值的方向,这也是Canny算法求出的边缘具有无方向性,任意方向的边缘检测效果都很好的原因。
      在每一点上,领域中心 x 与沿着其对应的梯度方向(由θ的值确定)的两个像素相比,若中心像素为最大值,则保留,否则中心置0,这样可以抑制非极大值,保留局部梯度最大的点,以得到细化的边缘。
4、用双阈值处理和连接边缘。
   阈值一般为图像非极大值抑制的图像最大像素值max和系数TH(高阈值系数),TL(低阈值系数)确定:Hedge=THmax,Ledge=TLmax,系数TH和TL,比率为2:1或3:1。(一般取TH=0.3或0.2,TL=0.1)然后将小于低阈值的点抛弃,赋0;将大于高阈值的点立即标记(这些点为确定边缘点),赋1或255;将小于高阈值,大于低阈值的点使用8连通区域确定。 这个步骤完成了孤立边缘的舍去和不完整边缘的一个连接,去除了假边缘,优化了真边缘。

2.代码

function varargout = bianyuanjiance(varargin)
% BIANYUANJIANCE MATLAB code for bianyuanjiance.fig
%      BIANYUANJIANCE, by itself, creates a new BIANYUANJIANCE or raises the existing
%      singleton*.
%
%      H = BIANYUANJIANCE returns the handle to a new BIANYUANJIANCE or the handle to
%      the existing singleton*.
%
%      BIANYUANJIANCE('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in BIANYUANJIANCE.M with the given input arguments.
%
%      BIANYUANJIANCE('Property','Value',...) creates a new BIANYUANJIANCE or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before bianyuanjiance_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to bianyuanjiance_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help bianyuanjiance

% Last Modified by GUIDE v2.5 04-Dec-2023 00:51:18

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @bianyuanjiance_OpeningFcn, ...
                   'gui_OutputFcn',  @bianyuanjiance_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before bianyuanjiance is made visible.
function bianyuanjiance_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to bianyuanjiance (see VARARGIN)

% Choose default command line output for bianyuanjiance
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes bianyuanjiance wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = bianyuanjiance_OutputFcn(hObject, eventdata, handles) 
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;


% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

warning off  %取消警告
feature  jit off %加速通道
global I   %全局变量
global I1   %全局变量

[filename,pathname]=uigetfile({'*.jpg';'*.bmp';'*.tif'},'选择图片');

%选择图像
str = [pathname,filename];
I = imread(str);
I1=rgb2gray(I); 
imshow(I);    %显示原图de
%  image(handles.axes1, I1);
% cla(handles.axes1,'reset');
% axes(handles.axesl);
% inshow(I)

% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
warning off
feature jit off
clc,clear,close all

% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global I   %全局变量
imshow(I);
% image(handles.axes1, I);

% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton4 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global I   %全局变量
global I1   %全局变量
% I1=rgb2gray(I);  
imshow(I1);
% image(handles.axes1, I1);
% --- Executes on button press in pushbutton5.
function pushbutton5_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton5 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA

global I2
global I1   %全局变量
I2=edge(I1, 'sobel');%应用sobel算子对图像进行边缘检测
% image(handles.axes1, I2);
imshow(I2);

% --- Executes on button press in pushbutton6.
function pushbutton6_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton6 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global I3
global I1   %全局变量
I3=edge(I1, 'prewitt');%应用prewitt算子对图像进行边缘检测
imshow(I3);
% --- Executes on button press in pushbutton7.
function pushbutton7_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton7 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global I4
global I1   %全局变量
I4=edge(I1, 'canny');%应用canny算子对图像进行边缘检测
imshow(I4);
  • 35
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学知识的小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值