Log和Canny边缘检测能力对比(附Matlab程序)

一、 实验目的

(1) 通过实验分析不同尺度下LOG和Canny边缘提取算子的性能。

(2) 研究这两种边缘提取方法在不同参数下的边缘提取能力。

(3) 使用不同的滤波尺度和添加噪声能量(噪声水平),通过与无噪声图像对比,选择最能说明自己结论的滤波尺度和噪声水平,并做出分析说明。

二、 实验原理

边缘的含义:在数字图像中,边缘是指图像局部变化最显著的部分,边缘主要存在于目标与目标,目标与背景之间,是图像局部特性的不连续性,如灰度的突变、纹理结构的突变、颜色的突变等。尽管图像的边缘点产生的原因各不相同,但他们都是图形上灰度不连续或灰度急剧变化的点,图像边缘分为阶跃状、斜坡状和屋顶状。

一般图像边缘检测方法主要有如下四个步骤:

(1)图像滤波传统边缘检测算法主要是基于图像强度的一阶和二阶导数,但导数的计算对噪声很敏感,因此必须使用滤波器来改善与噪声有关的边缘检测器的性能。需要指出的是,大多数滤波器在降低噪声的同时也造成了边缘强度的损失,因此,在增强边缘和降低噪声之间需要一个折衷的选择。

(2)图像增强:增强边缘的基础是确定图像各点邻域强度的变化值。增强算法可以将邻域(或局部)强度值有显著变化的点突显出来。边缘增强一般是通过计算梯度的幅值来完成的。

(3)图像检测在图像中有许多点的梯度幅值比较大,而这些点在特定的应用领域中并不都是边缘,所以应该用某种方法来确定哪些点是边缘点。最简单的边缘检测判断依据是梯度幅值。

(4)图像定位:如果某一应用场合要求确定边缘位置,则边缘的位置可在子像素分辨率上来估计,边缘的方位也可以被估计出来。

LOG检测算子

(1)LOG边缘检测算子

在20世纪70年代,Marr理论根据神经生理学实验得出了以下结论:物体的边界是将亮度图像与其解释连接起来的最重要线索。边缘检测技术在当时是基于很小邻域的卷积,只对特殊图像效果好。这些边缘检测子的主要缺点是它们依赖物体的大小且对噪声敏感。

基于二阶导数过零点的边缘检测技术探究了阶跃边缘对应于图像函数陡峭的变化这一事实。图像函数的一阶导数在对应于图像边缘的位置上应该取得极值,因此二阶导数在同一位置应该为0;而寻找过零点位置比起极值来得更容易和更准确。关键的问题是如何稳定地计算二阶导数,一种可能性是首先平滑图像(减小噪声),再计算二阶导数。在选择平滑滤波器时,需要满足两个标准:

(1) 滤波器应该是平滑的且在邻域中大致上是有限带宽的,以便减少会导致函数变化的可能频率数。

(2)空间定位的约束要求滤波器的响应应来自于图像中邻近的点。这两个标准矛盾的,但是可以通过使用高斯分布同时得到优化。在实践中,需要准确地考虑优化的含义。

2D高斯平滑算子(也称为高斯滤波器或简单地称为高斯)由下式给出:

clip_image002

其中clip_image004是图像坐标,σ是关联的概率分布的标准差。标准差是高斯滤波器的唯一参数,它与滤波器操作邻域的大小成正比。离算子中心越远的像素影响越小,离中心超过3的像素影响可以忽略不计。我们的目标是得到平滑后2D函数的二阶导数。我们知道Laplacian算子给出了二阶导数且是各向同性的。那么高斯平滑后的图像的Laplacian可以表示为:

clip_image006

由于所涉及算子的线性性,微分和卷积运算顺序可以交换:

clip_image008

由于高斯滤波器的导数与所考虑的图像无关,故它可以事先解析地计算出来。这样复合运算的复杂度降低了。选择算子clip_image010的基础有两个基本概念。第一,算子的高斯部分会模糊图像,从而在尺寸上将结构的灰度(包括噪声)降低到远小于σ的程度,而且高斯函数能在空间和频率两个域平滑图像,因而在原图像中引入不存在的人为干扰(如振铃)的可能性很小。第二,拉普拉斯有各向同性(旋转不变)的重要优点,符合人的视觉系统特性,而且对任何模板方向的灰度变化有相等的响应,从而避免了使用多个模板去计算图像中任何点处的最强响应。

LOG算法步骤如下:

1、 取样得到的clip_image012高斯低通滤波器对输入图像滤波。

2、 计算第一步得到图像的拉普拉斯。

3、 找到步骤2所得图像的零交叉。

Canny边缘检测算子介绍

1986年,JOHN CANNY 提出一个很好的边缘检测算法,被称为Canny边缘检测器,它是迄今为止讨论过的最优秀的边缘检测器。

Canny方法基于三个基本的目标:

1、低错误率。所有的边缘都应该被找到,并且没有假边缘,所有检测的边缘尽可能真实。

2、边缘点应被很好的定位。由检测器检测到的边缘点与真实边缘的中心之间的巨鹿应该最小。

3、单一的边缘点效应。对于真实的边缘点,检测器应该仅仅返回一个点。也就是真实边缘的局部最大数应该是最小的。意味着仅存在单一边缘点的位置,检测器不应指出多个边缘像素。

Canny边缘检测算法由一下基本步骤组成:

1、用一个高斯滤波器平滑输入图像。

2、计算梯度幅值图像和角度图像。

3、对梯度幅值图像应用非最大抑制。

4、用双阈值处理和连接分析来检测并连接边缘。

算法详解

1、高斯滤波

对任何一幅图像clip_image014进行边缘检测,都不能直接在原始数据上进行操作,必须有平滑滤波的过程。Canny算子的第一步就是对原始图像进行高斯平滑滤波,高斯模板如下:

clip_image002[1]

用该模板对原始图像进行高斯卷积,可以得到平滑后的图像:

clip_image006[1]

高斯模糊后的图像与原始图像相比,有轻微的模糊,高斯卷积的目的主要是为了抑制图像噪声对边缘检测的干扰,它能够在频域和时域两个域平滑图像。

2、梯度幅值图像和角度图像

clip_image018

幅值图像clip_image020和角度图像clip_image022是与平滑后的图像尺寸相同的阵列。因为它是使用梯度得到的,clip_image020[1]在局部最大值范围通常包含更宽的范围。下一步是细化那些边缘,也就是下一步需要采用的操作,使用非最大抑制。

3、非最大抑制

非最大抑制的目的是细化梯度幅值图像产生的宽边缘问题,该方法的本质是指定边缘法线的许多离散方向(梯度向量)。例如,在一个3×3区域内,对于通过该区域中心点的边缘,我们可以定义四个方向:水平、垂直、+45°和-45°。图1显示了水平边缘的两个可能方向。

clip_image023clip_image024

图1  在一个3×3区域中,水平边缘的两个可能方向。

因为我们需要把所有的边缘方向量化为四个方向,故需要定义一个方向范围,在该范围内,我们考虑一个水平方向的边缘。我们由法线的方向来确定边缘的方向。如图2所示,如果边缘法线方向的范围为-25°和+25°,或者是-157.5°和+157.5°,我们称该边缘为水平边缘。图3则显示了对应于所考虑的四个方向的角度范围。

clip_image026 clip_image028 图2 图3

图2表示一个水平边缘的边缘法线的方向角的值的范围(灰色)        

图3表示在3×3区域中,4种类型的边缘方向的边缘法线角度范围

令d1,d2,d3和d4表示四个基本边缘方向:水平、-45°、垂直、+45°。对于clip_image022[1]中以没一点clip_image004[1]为中心的3×3区域,我们可以给出如下非最大抑制方案:

(1) 寻找最接近clip_image022[2]的方向clip_image032.

(2) 如果clip_image020[2]的值至少小于沿clip_image032[1]的两个邻居之一,则令clip_image035(抑制);

否则,令clip_image037clip_image039是非最大抑制后的图像。

3、阈值处理

为了减少伪边缘点,对clip_image039[1]进行阈值处理。Canny算子采用双阈值的处理方法,一个低阈值clip_image042,一个高阈值clip_image044,Canny算子clip_image044[1]clip_image042[1]比率2:1或3:1。将阈值操作认为两幅附加的图像

clip_image046

clip_image048

开始时,clip_image050clip_image052被设置为零。阈值处理后,clip_image050[1]的非零像素通常比clip_image052[1]少,但是clip_image050[2]中所有的非零像素都包含在clip_image052[2]中。通过令clip_image054

三、 实验结果及分析

在实验中,选取三幅图像作为边缘检测的输入图像,分别是棋盘格(Tessella.bmp)、Lena (Lena.bmp)和自己选择的一幅自然场景图像(转换成8bit灰度,256×256大小的Bmp格式图像)。实验过程中,为了比较噪声的影响,分别对图像加入了不同参数下的高斯噪声。具体参数如下:

对于LOG算子,采用了均值为0,标准差σ=0.005的高斯白噪声。高斯模板采用的是滤波尺度为5×5,标准差σ=1,设置的阈值有thr=0.06、0.10、0.15三种情况。同时为了比较加入噪声对边缘检测的影响,同时参考了无噪声不同参数下的边缘检测效果。

对于Canny算子,设置的参数主要有高斯模糊尺度的不同,添加的噪声的程度以及双阈值参数的设置。具体为在无添加噪声情况下,有滤波尺度5×5

σ=1,thr_min=12,thr_max=24;滤波尺度5×5 ,σ=0.5 ,thr_min=12, thr_max=24;滤波尺度5×5 ,σ=1,thr_min=24 ,thr_max=48;滤波尺度5×5 ,σ=1 ,thr_min=6 thr_max=12;添加高斯噪声图片均值为0,方差为0.005 滤波尺度5×5 ,σ=1 thr_min=6 ,thr_max=12;添加高斯噪声图片均值为0,方差为0.0005滤波尺度5×5 ,σ=1 ,thr_min=6 ,thr_max=12。

(一)LOG边缘检测结果

1、Lena(256×256,bmp格式的灰度图)为测试图片进行边缘检测

(1)噪声水平为=0.0005

clip_image056clip_image058

图1-1-1 LOG 边缘检测及局部放大 clip_image060=1 thr=0.06

clip_image062clip_image064

图1-1-2 LOG 边缘检测及局部放大 clip_image060[1]=1 thr=0.10

clip_image066clip_image068

图1-1-3 LOG 边缘检测及局部放大 clip_image060[2]=1 thr=0.15

clip_image070clip_image072

图1-1- 4 LOG 边缘检测及局部放大 clip_image060[3]=0.5 thr=0.15

(2)噪声水平为=0.005

clip_image074clip_image076

图1-1-5 LOG 边缘检测及局部放大 clip_image060[4]=1 thr=0.06

2、以棋盘格Tessella为测试图片进行边缘检测

(1)噪声水平为=0.0005

clip_image078clip_image080

图1-2-1 LOG 原图及加噪图像

clip_image082clip_image084

图1-2-2 LOG 高斯平滑及边缘检测图像 clip_image060[5]=1 thr=0.06

(二)Canny边缘检测结果

该部分对Canny边缘检测的四个步骤的各阶段图像都进行了显示,以便检验每一步操作的功能。在本实验中,阈值采用了thr_max/thr_min=2的默认比例。

1、以Lena(256×256,bmp格式的灰度图)为测试图片进行边缘检测

(1)噪声水平为=0,无噪声边缘检测

clip_image094clip_image096

clip_image098clip_image100

图2-1-1滤波尺度clip_image102 clip_image060[7]=1 thr_min=12 thr_max=24

clip_image104vclip_image106

clip_image108clip_image110

图2-1-2滤波尺度clip_image102[1] clip_image060[8]=0.5 thr_min=12 thr_max=24

clip_image094[1]clip_image096[1]

clip_image098[1]clip_image115

图2-1-3滤波尺度clip_image102[2] clip_image060[9]=1 thr_min=24 thr_max=48

clip_image094[2] clip_image096[2] clip_image098[2] clip_image120

图2-1-4滤波尺度clip_image102[3] clip_image060[10]=1 thr_min=6 thr_max=12

(2)噪声水平为=0.005

clip_image122 clip_image124 clip_image126 clip_image128

图2-1-5滤波尺度clip_image102[4] clip_image060[11]=1 thr_min=6 thr_max=12

(3)噪声水平为=0.005

clip_image130clip_image132clip_image134clip_image136

图2-1-6滤波尺度clip_image102[5] clip_image060[12]=1 thr_min=6 thr_max=12

2、以棋盘格Tessella为测试图片进行边缘检测

clip_image138clip_image140clip_image142 clip_image144

图2-2-1添加高斯噪声图片均值为0,方差为0.0005

滤波尺度clip_image102[6] clip_image060[13]=1 thr_min=6 thr_max=12

实验结果分析

(1)以Lena图像分析LOG和Canny

通过观察图1-1-1、图1-1-2及图1-1-3,可以发现LOG边缘检测随着阈值thr的增大,虽然噪点越来越少,但同时检测到的图像边缘信息丢失严重,图像局部精细部分检测几乎趋向于零。

通过观察图1-1-1和图1-1-5,两幅图主要是加的噪声水平不一样,前者是0.0005,后者则是0.005,可以看到图1-1-5边缘检测的效果非常差,几乎只能隐约看到轮廓信息,大量的噪点充斥着整幅图像。从而我们可以知道LOG算子对噪声比较敏感,图1-3-2同样证实了该结论。

比较高斯滤波模板标准差为1的图1-1-1和标准差为0.5图1-1-4,可以发现在尺度较小的情况下,对图像中的纹理丰富的头发,帽子上的装饰刻画的比较细致,但同时丢失了背景中左侧的垂直边缘和右侧中部的对比度很弱的横向边缘;在大尺度上,这些背景边缘得到了体现,但同时对于那些丰富的纹理区,检测结果出现了丢失和偏移。

从Canny算子的检测结果来看,它对于图像中的纹理丰富的地方和背景处的边缘,以及对比度弱的边缘都能得到很好的检出率;从图2-1-1和图2-1-2可以发现在大尺度上同样也丢失了很多细节,只表现出一些轮廓特征。

比较图2-1-1、图2-1-3及图2-1-4,同样可以发现,随着阈值的增大,Canny边缘检测同样丢失信息越来越多,只表现出一些轮廓。比较图2-1-4和图2-1-5,在噪声水平扩大10倍的情况下,可以观察到左侧垂直边缘信息丢失严重,同时边缘像素变宽,出现了横向的细小条纹。右侧黑色背景部分出现了一定的伪边缘现象。但相对于LOG算子,Canny边缘检测总体效果较好,对噪声的抑制较强。

(2)以Tessella图像分析LOG和Canny

Tessella图像是边缘信息丰富的棋盘格,灰度信息分布规律,只能取有限的几个值。观察比较图1-2-2和图2-2-1,可以发现,对于LOG算子,垂直信息丢失严重,垂直边缘普遍断开,水平边缘信息也比较宽,对噪声比较敏感,检测效果较差。对于Canny算子,可以发现边缘检测效果非常好,对于噪声点的抑制也表现的非常优异,只出现了一些零散的孤立噪声点。Canny算子虽然对各种边缘都有较好的检出率,但是检测出的边缘点与原始图像的位置有一定范围的误差。

四、 实验结论

从以上的检测结果中可以看出,相同尺度下的LOG算子总是能比Canny算子检测出更多的细节,而相对于此,Canny算子却总是能对真正比较显著地边缘给出检测。LOG边缘检测子是采用二阶导数过零点的检测方法,故对噪声更敏感一些,因此从抑制噪声方面来讲,Canny边缘检测子不容易受到噪声的干扰,而相同尺度下LOG算子却容易受到噪声的干扰,抑制噪声的能力要弱一些。另外,由于Canny边缘检测子采用两种不同的阈值分别检测强边缘和弱边缘,并且当弱边缘和强边缘相连时,才将弱边缘包含在输出图像中,故而Canny算子更能检测出真正的弱边缘,但是Canny边缘检测子检测出的边缘的位置会有一定范围的误差,LOG边缘检测子相对比较容易受到噪声干扰,会检测出更多的细节,也容易检测出一些由于噪声引起的假边缘,但是LOG边缘检测子对边缘位置的检测还是很准确的。在大尺度上的算法都比较好的检测出树干的边缘,而对周围的纹理区域的刻画都失去了组织结构上的特征。

LOG算子容易受尺度的影响,不同尺度下的边缘点要用不同尺度的LOG算子检测,Canny 算子受尺度的影响不太明显,不同尺度下,边缘点的位置都有偏差,但几乎相同; LOG算子对噪声的抑制能力随着尺度的增加而增加,相同尺度下的Canny算子比LOG算子的抗噪声能力强,而LOG算子比Canny算子的边缘点准确;在尺度选择合适的情况下,LOG算子对图像边缘点检测的位置非常准确,能够保留边缘点比较细致的组织结构,而Canny算子对图像边缘检出率比较高,包括纹理区域,以及对比度很弱的边缘点,但是对这些边缘点的组织结构刻画得不是特别细致,边缘点的位置有小范围的偏差。

  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
遗传算法matlab程序(2009-04-14 18:25:19)转载标签: 遗传算法二进制编码if杂谈 遗传算法程序: 说明: fga.m 为遗传算法的主程序; 采用二进制Gray编码,采用基于轮盘赌法的非线性排名选择, 均匀交叉,变异操作,而且还引入了倒位操作! function [BestPop,Trace]=fga(FUN,LB,UB,eranum,popsize,pCross,pMutation,pInversion,options) % [BestPop,Trace]=fmaxga(FUN,LB,UB,eranum,popsize,pcross,pmutation) % Finds a maximum of a function of several variables. % fmaxga solves problems of the form: % max F(X) subject to: LB <= X <= UB % BestPop - 最优的群体即为最优的染色体群 % Trace - 最佳染色体所对应的目标函数值 % FUN - 目标函数 % LB - 自变量下限 % UB - 自变量上限 % eranum - 种群的代数,取100--1000(默认200) % popsize - 每一代种群的规模;此可取50--200(默认100) % pcross - 交叉概率,一般取0.5--0.85之间较好(默认0.8) % pmutation - 初始变异概率,一般取0.05-0.2之间较好(默认0.1) % pInversion - 倒位概率,一般取0.05-0.3之间较好(默认0.2) % options - 1*2矩阵,options(1)=0二进制编码(默认0),option(1)~=0十进制编 %码,option(2)设定求解精度(默认1e-4) % % ------------------------------------------------------------------------ T1=clock; if nargin<3, error('FMAXGA requires at least three input arguments'); end if nargin==3, eranum=200;popsize=100;pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0 1e-4];end if nargin==4, popsize=100;pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0 1e-4];end if nargin==5, pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0 1e-4];end if nargin==6, pMutation=0.1;pInversion=0.15;options=[0 1e-4];end if nargin==7, pInversion=0.15;options=[0 1e-4];end if find((LB-UB)>0) error('数据输入错误,请重新输入(LB<UB):'); end s=sprintf('程序运行需要约%.4f 秒钟时间,请稍等......',(eranum*popsize/1000)); disp(s); global m n NewPop children1 children2 VarNum bounds=[LB;UB]';bits=[];VarNum=size(bounds,1); precision=options(2);%由求解精度确定二进制编码长度 bits=ceil(log2((bounds(:,2)-bounds(:,1))' ./ precision));%由设定精度划分区间 [Pop]=InitPopGray(popsize,bits);%初始化种群 [m,n]=size(Pop); NewPop=zeros(m,n); children1=zeros(1,n); children2=zeros(1,n); pm0=pMutation; BestPop=zeros(eranum,n);%分配初始解空间BestPop,Trace Trace=zeros(eranum,length(bits)+1); i=1; while i<=eranum for j=1:m value(j)=feval_r(FUN(1,:),(b2f(Pop(j,:),bounds,bits)));%计算适应度 end [MaxValue,Index]=max(value); BestPop(i,:)=Pop(Index,:); Trace(i,1)=MaxValue; Trace(i,(2:length(bits)+1))=b2f(BestPop(i,:),bounds,bits); [selectpop]=NonlinearRankSelect(FUN,Pop,bounds,bits);%非线性排名选择 [CrossOverPop]=CrossOver(selectpop,pCross,round(unidrnd(eranum-i)/eranum)); %采用多点交叉和均匀交叉,且逐步增大均匀交叉的概率 %round(unidrnd(eranum-i)/eranum) [MutationPop]=Mutation(CrossOverPop,pMutation,VarNum);%变异 [InversionPop]=Inversion(MutationPop,pInversion);%倒位 Pop=InversionPop;%更新 pMutation=pm0+(i^4)*(pCross/3-pm0)/(eranum^4); %随着种群向前进化,逐步增大变异率至1/2交叉率 p(i)=pMutation; i=i+1; end t=1:eranum; plot(t,Trace(:,1)'); title('函数优化的遗传算法');xlabel('进化世代数(eranum)');ylabel('每一代最优适应度(maxfitness)'); [MaxFval,I]=max(Trace(:,1)); X=Trace(I,(2:length(bits)+1)); hold on; plot(I,MaxFval,'*'); text(I+5,MaxFval,['FMAX=' num2str(MaxFval)]); str1=sprintf('进化到 %d 代 ,自变量为 %s 时,得本次求解的最优值 %f\n对应染色体是:%s',I,num2str(X),MaxFval,num2str(BestPop(I,:))); disp(str1); %figure(2);plot(t,p);%绘制变异值增大过程 T2=clock; elapsed_time=T2-T1; if elapsed_time(6)<0 elapsed_time(6)=elapsed_time(6)+60; elapsed_time(5)=elapsed_time(5)-1; end if elapsed_time(5)<0 elapsed_time(5)=elapsed_time(5)+60;elapsed_time(4)=elapsed_time(4)-1; end %像这种程序当然不考虑运行上小时啦 str2=sprintf('程序运行耗时 %d 小时 %d 分钟 %.4f 秒',elapsed_time(4),elapsed_time(5),elapsed_time(6)); disp(str2); %初始化种群 %采用二进制Gray编码,其目的是为了克服二进制编码的Hamming悬崖缺点 function [initpop]=InitPopGray(popsize,bits) len=sum(bits); initpop=zeros(popsize,len);%The whole zero encoding individual for i=2:popsize-1 pop=round(rand(1,len)); pop=mod(([0 pop]+[pop 0]),2); %i=1时,b(1)=a(1);i>1时,b(i)=mod(a(i-1)+a(i),2) %其中原二进制串:a(1)a(2)...a(n),Gray串:b(1)b(2)...b(n) initpop(i,:)=pop(1:end-1); end initpop(popsize,:)=ones(1,len);%The whole one encoding individual %解码 function [fval] = b2f(bval,bounds,bits) % fval - 表征各变量的十进制数 % bval - 表征各变量的二进制编码串 % bounds - 各变量的取值范围 % bits - 各变量的二进制编码长度 scale=(bounds(:,2)-bounds(:,1))'./(2.^bits-1); %The range of the variables numV=size(bounds,1); cs=[0 cumsum(bits)]; for i=1:numV a=bval((cs(i)+1):cs(i+1)); fval(i)=sum(2.^(size(a,2)-1:-1:0).*a)*scale(i)+bounds(i,1); end %选择操作 %采用基于轮盘赌法的非线性排名选择 %各个体成员按适应值从大到小分配选择概率: %P(i)=(q/1-(1-q)^n)*(1-q)^i, 其中 P(0)>P(1)>...>P(n), sum(P(i))=1 function [selectpop]=NonlinearRankSelect(FUN,pop,bounds,bits) global m n selectpop=zeros(m,n); fit=zeros(m,1); for i=1:m fit(i)=feval_r(FUN(1,:),(b2f(pop(i,:),bounds,bits)));%以函数值为适应值做排名依据 end selectprob=fit/sum(fit);%计算各个体相对适应度(0,1) q=max(selectprob);%选择最优的概率 x=zeros(m,2); x(:,1)=[m:-1:1]'; [y x(:,2)]=sort(selectprob); r=q/(1-(1-q)^m);%标准分布基值 newfit(x(:,2))=r*(1-q).^(x(:,1)-1);%生成选择概率 newfit=cumsum(newfit);%计算各选择概率之和 rNums=sort(rand(m,1)); fitIn=1;newIn=1; while newIn<=m if rNums(newIn)<newfit(fitIn) selectpop(newIn,:)=pop(fitIn,:); newIn=newIn+1; else fitIn=fitIn+1; end end %交叉操作 function [NewPop]=CrossOver(OldPop,pCross,opts) %OldPop为父代种群,pcross为交叉概率 global m n NewPop r=rand(1,m); y1=find(r<pCross); y2=find(r>=pCross); len=length(y1); if len>2&mod(len,2)==1%如果用来进行交叉的染色体的条数为奇数,将其调整为偶数 y2(length(y2)+1)=y1(len); y1(len)=[]; end if length(y1)>=2 for i=0:2:length(y1)-2 if opts==0 [NewPop(y1(i+1),:),NewPop(y1(i+2),:)]=EqualCrossOver(OldPop(y1(i+1),:),OldPop(y1(i+2),:)); else [NewPop(y1(i+1),:),NewPop(y1(i+2),:)]=MultiPointCross(OldPop(y1(i+1),:),OldPop(y1(i+2),:)); end end end NewPop(y2,:)=OldPop(y2,:); %采用均匀交叉 function [children1,children2]=EqualCrossOver(parent1,parent2) global n children1 children2 hidecode=round(rand(1,n));%随机生成掩码 crossposition=find(hidecode==1); holdposition=find(hidecode==0); children1(crossposition)=parent1(crossposition);%掩码为1,父1为子1提供基因 children1(holdposition)=parent2(holdposition);%掩码为0,父2为子1提供基因 children2(crossposition)=parent2(crossposition);%掩码为1,父2为子2提供基因 children2(holdposition)=parent1(holdposition);%掩码为0,父1为子2提供基因 %采用多点交叉,交叉点数由变量数决定 function [Children1,Children2]=MultiPointCross(Parent1,Parent2) global n Children1 Children2 VarNum Children1=Parent1; Children2=Parent2; Points=sort(unidrnd(n,1,2*VarNum)); for i=1:VarNum Children1(Points(2*i-1):Points(2*i))=Parent2(Points(2*i-1):Points(2*i)); Children2(Points(2*i-1):Points(2*i))=Parent1(Points(2*i-1):Points(2*i)); end %变异操作 function [NewPop]=Mutation(OldPop,pMutation,VarNum) global m n NewPop r=rand(1,m); position=find(r<=pMutation); len=length(position); if len>=1 for i=1:len k=unidrnd(n,1,VarNum); %设置变异点数,一般设置1点 for j=1:length(k) if OldPop(position(i),k(j))==1 OldPop(position(i),k(j))=0; else OldPop(position(i),k(j))=1; end end end end NewPop=OldPop; %倒位操作 function [NewPop]=Inversion(OldPop,pInversion) global m n NewPop NewPop=OldPop; r=rand(1,m); PopIn=find(r<=pInversion); len=length(PopIn); if len>=1 for i=1:len d=sort(unidrnd(n,1,2)); if d(1)~=1&d(2)~=n NewPop(PopIn(i),1:d(1)-1)=OldPop(PopIn(i),1:d(1)-1); NewPop(PopIn(i),d(1):d(2))=OldPop(PopIn(i),d(2):-1:d(1)); NewPop(PopIn(i),d(2)+1:n)=OldPop(PopIn(i),d(2)+1:n); end end end
好的,关于matlab使用Sobel、LoGCanny边缘检测的方法,我可以给你一些简单的介绍。 1. Sobel边缘检测 Sobel边缘检测是一种基于梯度计算的边缘检测算法。在matlab中,可以使用imgradient函数计算图像的梯度,然后使用imgradientmagnitude函数计算梯度的幅值,最后使用imbinarize函数将幅值进行二值化,得到边缘图像。具体代码如下: ``` % 读取图像 img = imread('image.jpg'); % 计算梯度 [Gx, Gy] = imgradientxy(img); [Gmag, Gdir] = imgradient(Gx, Gy); % 二值化 threshold = 0.2 * max(Gmag(:)); edgeImg = imbinarize(Gmag, threshold); % 显示图像 imshow(edgeImg); ``` 2. LoG边缘检测 LoG边缘检测是一种基于高斯滤波的边缘检测算法。在matlab中,可以使用fspecial函数生成高斯滤波器,然后使用imfilter函数对图像进行滤波,得到LoG卷积结果,最后使用imregionalmax函数对卷积结果进行局部极大值检测,得到边缘图像。具体代码如下: ``` % 读取图像 img = imread('image.jpg'); % 生成高斯滤波器 h = fspecial('log', [5 5], 1); % 滤波 imgFiltered = imfilter(img, h); % 局部极大值检测 edgeImg = imregionalmax(imgFiltered); % 显示图像 imshow(edgeImg); ``` 3. Canny边缘检测 Canny边缘检测是一种基于多阈值的边缘检测算法。在matlab中,可以使用edge函数进行Canny边缘检测,其中可以设置阈值参数,得到不同强度的边缘图像。具体代码如下: ``` % 读取图像 img = imread('image.jpg'); % 边缘检测 edgeImg = edge(img, 'Canny', [0.1 0.3]); % 显示图像 imshow(edgeImg); ``` 以上就是matlab使用Sobel、LoGCanny边缘检测的简单介绍,希望能对你有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值