【图像边缘检测】基于matlab GUI神经网络算法边缘检测(带面板)【含Matlab源码 1346期】

举报
海神之光 发表于 2022/05/29 02:55:52 2022/05/29
【摘要】 一、简介 0 引言 边缘提取是模式识别中物体特征抽取的重要环节之一, 基于梯度的传统边缘检测方法对图像的边缘检测研究已经取得了一些成果, 但目前在实际检测中得到的边缘结果并不令人满意;并且随着计算机速度...

一、简介

0 引言
边缘提取是模式识别中物体特征抽取的重要环节之一, 基于梯度的传统边缘检测方法对图像的边缘检测研究已经取得了一些成果, 但目前在实际检测中得到的边缘结果并不令人满意;并且随着计算机速度和存储的飞速发展, 图像量化像素点宽度将越来越小, 即使在边缘处, 相邻像素灰度值的差异将越来越小, 从而制约了建立在以梯度为原则的边缘检测算子的发展, 并且由于通常要作分析及处理的原始图像往往含有噪声, 而边缘和噪声在空间域表现为灰度有比较大的起落, 在频率域则反映为同是高频分量;同时, 为了避免给图像带来新的误差或掩盖真实信息, 不能对其作滤波、增强等处理。因此, 寻找新的边缘检测方法是必要的。

1 基于神经网络的边缘检测算法
大家知道, 如果一个过程的描述和理解都十分清楚, 该过程的处理能用最佳方法设计, 那就不必要考虑用神经网络去做;要做, 其结果未必更好。然而, 神经网络却适合于难于模型化的问题。神经网络是从样本中学习, 从而从网络本身形成所求解问题的模型。对于数字图像的边缘检测来说, 图像中局部变化与场景的对应关系可以通过样本集对网络的训练来求解。神经网络能够很好地完成N维空间 (输入结点个数N) 到M维空间 (输出结点个数M) 的复杂的非线性映射。故它具备进行图像边缘检测的能力, 所以我们可以用神经网络进行数字图像的边缘检测。

1.1 训练集的选取
在BP神经网络的学习训练过程中, 训练集样本的选取是一件非常重要的事情。训练集的选取
在这里插入图片描述
图1 训练图
将直接影响网络学习训练的时间、权值矩阵与学习训练效果等。目前, 国内外有很多的学者采用神经网络的方法进行数字图像边缘检测的研究, 但是尚处在试验阶段, 尤其对样本的选择问题还没有很好的解决方法。我认为:在样本的选择过程中, 要选择有代表性的图像作为训练图像。图1这副图像边缘比较明显, 且边缘分布在图像的大部分区域。我把这副原始的图像作为训练即集的初始样本。

图1是一副256×256的8位的灰度BMP图像。这副图像边缘比较清晰, 颗粒边缘分布在整副图像中, 而且其纹理特征比较丰富, 使神经网络得到很好训练, 网络权值等网络信息会记住更多的边缘信息, 可以比较好的检测图像。

把这副图像分别经过Roberts算子、Sobel算子、Prewitt算子三个传统算子的边缘检测, 得到三副边缘检测的边缘图像, 用三副检测出来边缘图像经过比例加权, 得到学习训练图像;亦即, 对于图像的每一个像素, 把三副图像相同像素的灰度按照预定的比例进行计算, 得到的新像素的灰度值, 当所有的像素计算完之后, 就会得到一副新的图像, 然后把这个新得到图像的灰度值输入到BP神经网络模型进行学习训练。

1.2 BP神经网络结构的确定
在确定神经网络的结构时, 除了输入层和输出层之外, 关键就是要确定有几个中间层。由于所采用的神经网络模型是BP神经网络且结点函数是S型函数, 在实际中只采用了一个中间层。最后, 证明了一个中间层能较好的完成数字图像的边缘检测。

对于输入层结点, 输入层结点数应等于输入向量的分量数目。在图像情况下, 像素的数目基本决定了输入结点的数目。本文选用的是7×7的模板, 有49个向量分量, 即输入层结点的数目是49。所选的模板不能太大也不能太小, 如果所选的邻域模板太大的化, 那么网络的规模就比较大, 网络的计算量比较大, 增加网络的训练以及检测时间, 同时边缘的信息也可能会丢失;同时也不能太小, 如果模板太小, 就不能很充分地对某个像素的周围邻域很好的学习。对于中间层的结点, 其结点数目的选择非常重要。中间层数目较少, 网络将不能建立复杂的判决界, 将会降低网络的分类能力, 网络可能训练不出来;一旦数目太多, 那么判决界只包封了训练点而失去了概括推断的能力, 而且计算量很大, 并增加网络的负荷, 使训练时间加长, 降低系统效率, 训练效果不好。

开始的时候, 我把中间层结点的个数定为6, 但是发现在训练的过程中, 网络训练的速度非常慢。为了提高训练的速度, 改变了结点的数目, 根据经验公式, 增加了中间层结点的数目。目前中间层单元的数目取值没有一定的规则, 要根据具体的问题和训练情况来决定。根据专家和学者的经验得知], 其中间层单元的数目为n
在这里插入图片描述
式中 m为输出单元个数;n为输入单元数, α为1到10之间的常数;其中n=49;m=1;于是α=8。在实验过程中, 训练出来的神经网络进行边缘检测效果不是很理想, 认为网络缺少分化数据的能力, 此时中间层单元的数目比较少;所以又增加了中间层单元的数目, 即n1=10, 当中间层单元的数目为10时, 效果较好。这个时候我没有在增加中间层单元的数目, 因为在增加中间层数目将会使运算量有很大的增加, 增加训练的时间和检测的时间。
综合以上考虑, 确定了如下网络拓扑结构:
49 (输入结点单元个数) ——10 (中间层结点单元个数) ——1 (输出结点单元个数)

1.3 BP神经网络的学习训练
学习训练是任何一个神经网络模型在应用过程中比较关键的环节。所以, 在学习训练过程中, 一些参数的确定对神经网络的学习训练至关重要。网络初始参数的设置, 包括网络初始结构、连接的权值、阈值、学习率等参数的不同选取, 都会对网络的收敛速度产生影响, 而初始参数的选择, 除了可以进行一些技术处理之外, 主要还要依赖于神经网络建模者的观察与经验。

1.3.1 初始值的确定
对于网络的初始权值、阈值, 通常的做法是从[-1, 1]或[0, 1]区间上随即选取一组数作为初始权值进行训练, 不同的改进算法对区间的选取会有不同。

1.3.2 向量的归一化处理
在学习训练过程中, 不能使结点输入太大, 否则的话, 权值的调节过小使网络不能很好的学习训练。由于特征向量维数较大, 且大部分的值都是基于灰度的都大于1, 为了加快训练速度, 对特征向量进行了归一化处理。
如果把特征向量看成行向量, 可表示为X= (x0, x1, Λ, x48)在8位的图像中, 最大的灰度值是255, 所以实际处理过程中, 归一化结果为
在这里插入图片描述
由于归一化的原因, 输出层计算出的结果也是在[0, 1]之间的, 显然, 这个不是作为输出图像的像素的灰度值。在计算出输出层的结果后, 再乘以255, 就是输出图像像素的实际灰度值。

1.3.3 网络误差的确定
对于BP反向传播训练算法, 通常使用网络误差是是我们熟知的均方差。均方差定义如下
在这里插入图片描述
由于其输出节点数为一个, 那么一个单元的绝对误差的平方作为神经网络的误差函数。

1.3.4 神经网络的训练
整个的学习训练过程见图2所示。从这个图中就可以看出网络的学习训练是如何进行的, 可以看出其权值、阈值的改变是在误差反馈的过程中, 根据反馈的情况发生改变的。由于处理的对象是图像, 每输入一个样本即以每个像素周围的模板像素进行神经元网络训练一次, 也就是把以某一个像素为中心的周围的49个像素的灰度值以从下向上、从左向右的顺序依次把各个像素的灰度送入输入层, 进行神经网络的学习训练。在输出层, 根据“导师”提供的期望输出像素的灰度值和输出层的实际输出像素灰度值计算出网络的误差, 误差沿反向传播进一步改变每个神经元的阈值和神经元之间的连接权值, 使网络能够记住更多的边缘信息。根据训练的要求, 可以停止网络的训练, 训练出来的权值、阈值全部保留在后端的数据库中, 以便在利用神经网络进行检测时, 从后端的数据库提取出权值、阈值进行检测。在训练的过程中, 其输出层的输出像素灰度值为输入模板中心像素经神经网络计算出的像素灰度值。那么在网络训练的过程中, 由于每次训练的图像是按照Roberts、Sobel和Prewitt经典算子得出得传统边缘检测图像的不同比例作为目标图像, 那么每次在训练的时候, 要对网络重新进行训练。
在这里插入图片描述
图2 训练过程

二、部分源代码

function varargout = fuzzyedge(varargin)
% FUZZYEDGE MATLAB code for fuzzyedge.fig
%      FUZZYEDGE, by itself, creates a new FUZZYEDGE or raises the existing
%      singleton*.
%
%      H = FUZZYEDGE returns the handle to a new FUZZYEDGE or the handle to
%      the existing singleton*.
%
%      FUZZYEDGE('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in FUZZYEDGE.M with the given input arguments.
%
%      FUZZYEDGE('Property','Value',...) creates a new FUZZYEDGE or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before fuzzyedge_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to fuzzyedge_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 fuzzyedge

% Last Modified by GUIDE v2.5 16-Jul-2011 14:54:47

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @fuzzyedge_OpeningFcn, ...
                   'gui_OutputFcn',  @fuzzyedge_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 fuzzyedge is made visible.
function fuzzyedge_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 fuzzyedge (see VARARGIN)

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

a = ones(256,256);
axes(handles.axes1);
imshow(a);
axes(handles.axes2);
imshow(a);
axes(handles.axes3);
imshow(a);

% Update handles structure
guidata(hObject, handles);

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


% --- Outputs from this function are returned to the command line.
function varargout = fuzzyedge_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 clear.
function clear_Callback(hObject, eventdata, handles)
% hObject    handle to clear (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
a = ones(256,256);
axes(handles.axes1);
imshow(a);
axes(handles.axes2);
imshow(a);
axes(handles.axes3);
imshow(a);


% --- Executes on button press in browse.
function browse_Callback(hObject, eventdata, handles)
% hObject    handle to browse (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
[file path] = uigetfile('*.bmp;*.jpg;*.png','选择一幅图片');
if file==0
    warndlg('用户必须选择一个输入的图片');
else
    a = imread(fullfile(path,file));
    axes(handles.axes1);
    imshow(a);
    handles.a = a;
end
% Update handles structure
guidata(hObject, handles);

% --- Executes on button press in direction.
function direction_Callback(hObject, eventdata, handles)
% hObject    handle to direction (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
a = handles.a;
I = double(a);
[R C P] = size(a);
%%%%%%%%%%%%% Direction Find Calculation........
for i = 2:R-1
    for j = 2:C-1
        D1(i-1,j-1) = abs(I(i-1,j-1) - I(i,j)) + abs(I(i+1,j+1) - I(i,j));
        D2(i-1,j-1) = abs(I(i-1,j) - I(i,j)) + abs(I(i+1,j) - I(i,j));
        D3(i-1,j-1) = abs(I(i-1,j+1) - I(i,j)) + abs(I(i+1,j-1) - I(i,j));
        D4(i-1,j-1) = abs(I(i,j-1) - I(i,j)) + abs(I(i,j+1) - I(i,j));
        
    end
end

handles.D1 = D1;
handles.D2 = D2;
handles.D3 = D3;
handles.D4 = D4;
handles.I = I;
% Update handles structure
guidata(hObject, handles);

warndlg('方向检测完成');


% --- Executes on button press in edgeclassfy.
function edgeclassfy_Callback(hObject, eventdata, handles)
% hObject    handle to edgeclassfy (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
D1 = handles.D1;
D2 = handles.D2;
D3 = handles.D3;
D4 = handles.D4;

I = handles.I;

[R C P] = size(D1);

for i = 1:R
    for j = 1:C
        if ((D1(i,j)<=35) && (D2(i,j)<=35) && (D3(i,j)<=35) && (D4(i,j)<=35))
            New_im(i,j) = 0;  % BACKGROUND CLASS
        elseif ((D1(i,j)<=35) && (D2(i,j)>35) && (D3(i,j)>35) && (D4(i,j)>35))
            New_im(i,j) = 1;
        elseif ((D1(i,j)>35) && (D2(i,j)<=35) && (D3(i,j)>35) && (D4(i,j)>35))
            New_im(i,j) = 2;
        elseif ((D1(i,j)>35) && (D2(i,j)>35) && (D3(i,j)<=35) && (D4(i,j)>35))
            New_im(i,j) = 3;
        elseif ((D1(i,j)>35) && (D2(i,j)>35) && (D3(i,j)>35) && (D4(i,j)<=35))
            New_im(i,j) = 4;
        elseif ((D1(i,j)>35) && (D2(i,j)>35) && (D3(i,j)>35) && (D4(i,j)>35))
            New_im(i,j) = 5;  % SPECKLE CLASS
        end
    end
end
handles.New_im = New_im;
% Update handles structure
guidata(hObject, handles);
warndlg('完成');


% --- Executes on button press in competitiverule.
function competitiverule_Callback(hObject, eventdata, handles)
% hObject    handle to competitiverule (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
New_im = handles.New_im;
D1 = handles.D1;
D2 = handles.D2;
D3 = handles.D3;
D4 = handles.D4;

[r c] = size(New_im);

%%%%%%%%%%%% Finding Stronger Edges.........

for i = 2:r-1
    for j = 2:c-1
        
        switch New_im(i,j)
            case 0           %%%%%%%%%%%%%% Change to Black
                New_edge(i-1,j-1) = 0;
            case 1           %%%%%%%%%%%%% Checking the Status
                if (D3(i,j)>=D3(i+1,j-1))&&(D3(i,j)>=D3(i-1,j+1))     %%%%%%%% change to White
                    New_edge(i-1,j-1) = 1;
                else
                    New_edge(i-1,j-1) = 0;
                end
            case 2
                if (D4(i,j)>=D4(i+1,j-1))&&(D4(i,j)>=D4(i-1,j+1))     %%%%%%%% change to White
                    New_edge(i-1,j-1) = 1;
                else
                    New_edge(i-1,j-1) = 0;
                end
            case 3
                if (D1(i,j)>=D1(i+1,j-1))&&(D1(i,j)>=D1(i-1,j+1))     %%%%%%%% change to White
                    New_edge(i-1,j-1) = 1;
                else
                    New_edge(i-1,j-1) = 0;
                end
            case 4
                if (D2(i,j)>=D2(i+1,j-1))&&(D2(i,j)>=D2(i-1,j+1))     %%%%%%%% change to White
                    New_edge(i-1,j-1) = 1;
                else
                    New_edge(i-1,j-1) = 0;
                end
            case 5
                
                  New_edge(i-1,j-1) = 1;
        end
    end
end
axes(handles.axes3);
imshow(New_edge);


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235

三、运行结果

在这里插入图片描述

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
[5]肖锋.基于BP神经网络的数字图像边缘检测算法的研究[J].西安科技大学学报. 2005,(03)

文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。

原文链接:qq912100926.blog.csdn.net/article/details/115799869

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。