边缘检测.docx
- 文档编号:30463759
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:16
- 大小:23.45KB
边缘检测.docx
《边缘检测.docx》由会员分享,可在线阅读,更多相关《边缘检测.docx(16页珍藏版)》请在冰豆网上搜索。
边缘检测
边缘检测算子
图像配准的方法
7.4.1基于特征的图像配准
基于特征的图像配准首先提取图像信息的特征,然后以这些特征为模型进行配准。
特征提取的结果是一含有特征的表和对图像的描述,每个特征由一组属性表示,对属性的进一步描述包括边缘的定向和弧度、区域的大小等。
局部特征之间存在着相互关系,如几何关系、辐射度量关系、拓扑关系等。
可以用这些局部特征之间的关系描述全局特征。
通常基于局部特征配准大多都是基于点、线或边缘的,而全局特征的配准则是利用局部特征之间的关系进行配准的方法。
由于图像的特征点比图像的像素点要少很多,因此大大减少了配准过程的计算量,但特征提取方法的计算代价通常较大,不便于实时应用。
特征点的配准度量值对位置的变化比较敏感,可以大大提高配准的精确程度。
对于纹理较少的图像区域提取的特征的密度通常比较稀少,局部特征的提取就比较困难。
特征点的提取过程可以减少噪声的影响,对灰度变化、图像形变和遮挡等都有较好的适应能力。
因此,在图像配准领域得到了广泛应用。
基于特征的图像配准方法有两个重要环节:
特征提取和特征配准。
7.4.2基于互信息的图像配准
医学图像配准技术从基于特征的配准方法发展到基于统计的配准方法有其突破性的意义。
与基于特征的配准方法相比,基于统计的配准方法的突出优点为鲁棒性好、配准精度高、人工干预少。
基于统计的配准方法通常是指最大互信息的图像配准方法。
基于互信息的图像配准是用两幅图像的联合概率分布与完全独立时的概率分布的广义距离来估计互信息,并作为多模态医学图像配准的测度。
当两幅基于共同的解剖结构的图像达到最佳配准时,它们的对应像素的灰度互信息应为最大。
由于基于互信息的配准对噪声比较敏感,首先,通过滤波和分割等方法对图像进行预处理。
然后进行采样、变换、插值、优化从而达到配准的目的。
基于互信息的配准技术属于基于像素相似性的方法。
它基于图像中所有的像素进行配准,基于互信息的图像配准引入了信息论中的概念,如熵、边缘熵、联合熵和互信息等,可使配准精度达到亚像素级的高精度。
基于互信息只依赖于图像本身的信息,不需要对图像进行特征点提取和组织分类等预处理,是一种自动而有效的配准算法。
该算法可靠,对图像中的几何失真、灰度不均匀和数据的缺失等不敏感。
不依赖于任何成像设备,可应用于多模态医学图像配准。
基于互信息的图像配准也有其缺点,它运算量大,对噪声敏感,要求待配准图像间联合概率分布函数必须是严格正性的。
【例7-1】计算两幅图像的互信息。
functionmi=MI(a,b)
%CaculateMIofaandbintheregionoftheoverlappart
%计算重叠部分
[Ma,Na]=size(a);
[Mb,Nb]=size(b);
M=min(Ma,Mb);
N=min(Na,Nb);
%初始化直方图数组
hab=zeros(256,256);
ha=zeros(1,256);
hb=zeros(1,256);
%归一化
ifmax(max(a))~=min(min(a))
a=(a-min(min(a)))/(max(max(a))-min(min(a)));
else
a=zeros(M,N);
end
ifmax(max(b))-min(min(b))
b=(b-min(min(b)))/(max(max(b))-min(min(b)));
else
b=zeros(M,N);
end
a=double(int16(a*255))+1;
b=double(int16(b*255))+1;
%统计直方图
fori=1:
M
forj=1:
N
indexx=a(i,j);
indexy=b(i,j);
hab(indexx,indexy)=hab(indexx,indexy)+1;%联合直方图
ha(indexx)=ha(indexx)+1;%a图直方图
hb(indexy)=hb(indexy)+1;%b图直方图
end
end
%计算联合信息熵
hsum=sum(sum(hab));
index=find(hab~=0);
p=hab/hsum;
Hab=sum(sum(-p(index).*log(p(index))));
%计算a图信息熵
hsum=sum(sum(ha));
index=find(ha~=0);
p=ha/hsum;
Ha=sum(sum(-p(index).*log(p(index))));
%计算b图信息熵
hsum=sum(sum(hb));
index=find(hb~=0);
p=hb/hsum;
Hb=sum(sum(-p(index).*log(p(index))));
%计算a和b的互信息
mi=Ha+Hb-Hab;
%计算a和b的归一化互信息
%mi=hab/(Ha+Hb);
7.5医学图像配准
目前,图像配准技术在医学领域应用得相当广泛。
医学图像配准具有很重要的临床应用价值。
对各种使用相同或者不同的成像手段所获得的医学图像进行配准不仅可以应用于医疗诊断,也可以应用于手术计划的制定、治疗计划的制定、病理情况的跟踪和治疗效果的评价等各个方面。
下面给出一个具体的图像配准的例子来形象说明配准的应用。
【例7-2】医学图像配准。
(1)读取图像数据。
因为源图像以矩阵形式存在一个二进制的文件里,用fread可将其读取到变量矩阵中。
将读取文件编制成一个子函数(RTIread.m)。
源代码如下:
functionimMatrix=RTIread(FILENAME,SIZE)
%RTIreadReadtheimagematrixfrombinary"RegistrationTestImage"file.
%imMatrix=RTIread(FILENAME,SIZE)opensthefileFILENAME,andreadsthe
%numberofelementsspecifiedbySIZE.
%
%FILENAMEisastringcontainingthenameofthefiletobeopened.
%ValidentriesforSIZEare:
%NreadNelementsintoacolumnvector.
%infreadtotheendofthefile.
%[M,N]readelementstofillanM-by-Nmatrix,incolumnorder.
%Ncanbeinf,butMcan't.
%
%Itreturnstheimagematrix.
fid=fopen(FILENAME,'r');
imMatrix=fread(fid,SIZE,'uint8=>uint8');
fclose(fid);
这里选取了两张256×256的图片,文件名为sag1.tif和sag2.tif。
其原图像如图7-3所示。
图7-3sag1.tif和sag2.tif
运行以下代码读取图像矩阵:
base=RTIread('sag1.tif',[256,256]);
input=RTIread(sag2.tif,[256,256]);
(2)选取匹配点。
根据预定的配准方法,选定足够的匹配点对。
运行下列代码:
cpselect(input,base);%pleaseselect15pointsfortest.
出现如图7-4所示的GUI界面。
图7-4GVI界面
注意:
这里允许选择15个点进行测试。
操作很简单,只需注意选点要均匀布开,以增加其代表性。
选定完毕,再选择File→SavePointstoWorkspace命令将数据保存到工作区中。
Workspace立刻多出两个N×2的数组(其中N为选定的匹配点对数),分别为input_points和base_points。
(3)利用十字相关法调整选定了的匹配点。
如果对上面一个步骤的选点工作不满意,可以进行这一步。
如果感觉尚可,则跳过这一步,以减小运算量。
运行代码:
input_points_corr=cpcorr(input_points,base_points,input,base);
%优化选择点的作用
input_points_corr为优化后在输入图片的对应匹配点。
(4)计算变换公式的参数。
利用cp2tform选定变换类型(配准方法),计算变换参数。
以下只需选定一种即可。
%
(1)notFine-tunepoints
Tlinear=cp2tform(input_points,base_points,'linearconformal');
Taffine=cp2tform(input_points,base_points,'affine');
Tprojective=cp2tform(input_points,base_points,'projective');
Tpolynomial2=cp2tform(input_points,base_points,'polynomial',2);
Tpolynomial3=cp2tform(input_points,base_points,'polynomial',3);
Tpolynomial4=cp2tform(input_points,base_points,'polynomial',4);
Tpiecewise=cp2tform(input_points,base_points,'piecewiselinear');
Tlwm=cp2tform(input_points,base_points,'lwm');
%
(2)Fine-tunepoints
fTlinear=cp2tform(input_points_corr,base_points,'linearconformal');
fTaffine=cp2tform(input_points_corr,base_points,'affine');
fTprojective=cp2tform(input_points_corr,base_points,'projective');
fTpolynomial2=cp2tform(input_points_corr,base_points,'polynomial',2);
fTpolynomial3=cp2tform(input_points_corr,base_points,'polynomial',3);
fTpolynomial4=cp2tform(input_points_corr,base_points,'polynomial',4);
fTpiecewise=cp2tform(input_points_corr,base_points,'piecewiselinear');
fTlwm=cp2tform(input_points_corr,base_points,'lwm');
(5)变换图像。
%Transformtheunregisteredimagetobringitintoalignment.
title('imageregistrationpolynomialmethod');
subplot(2,2,1);
imshow(base);
title('Baseimage');
subplot(2,2,2);
imshow(input);
title('Inputimage');
subplot(2,2,3);
imshow(imtransform(input,Tpolynomial2));
title('registeredimage');
subplot(2,2,4);
imshow(imtransform(input,fTpolynomial2));
title('registeredimage(fine-tunepoints)');
图像变换效果如图7-5所示。
图7-5图像变换效果
小结:
(1)选择适当的方法来建立转换参数,并非算法越复杂越好,应参考成像因素(退化因素)。
(2)利用cpselect选择匹配点,cpselect可以返回一个GUI句柄。
在使用中,应当尽量选择恰当的匹配区域,这样能够得到较好的效果。
上面的这个例子典型地说明了图像配准的步骤:
提取图像特征,根据特征对进行几何变换,执行整个变换。
10.2边缘检测
图像的边缘是指图像局部区域亮度变化显著的部分。
该区域的灰度剖面一般可以看做一个阶跃,即从一个灰度值在很小的缓冲区域内急剧变化到另一个灰度相差较大的灰度值。
图像的边缘部分集中了图像的大部分信息,图像边缘的确定与提取对于整个图像场景的识别与理解是非常重要的,同时也是图像分割所依赖的重要特征。
边缘检测主要是图像的灰度变化的度量、检测和定位,自从1959提出边缘检测以来,经过五十多年的发展,已有许多种不同的边缘检测方法。
边缘检测的基本思想是先利用边缘增强算子,突出图像中的局部边缘,然后定义像素的“边缘强度”,通过设置阈值的方法提取边缘点集。
但是由于噪声和图像模糊,检测到的边界可能会有间断的情况发生。
所以边缘检测包含以下两项内容:
(1)用边缘算子提取边缘点集。
(2)在边缘点集合中去除某些边缘点,填充一些边缘点,将得到的边缘点集连接为线。
图像边缘检测的基本步骤如图10-4所示。
(1)滤波。
边缘检测算法主要是基于图像强度的一阶和二阶导数,但导数的计算对噪声很敏感,因此必须使用滤波器来改善与噪声有关的边缘检测器的性能。
需要指出的是,大多数滤波器在降低噪声的同时也导致了边缘强度的损失。
因此,增强边缘和降低噪声之间需要折中。
边缘检测主要基于导数计算,但受噪声影响。
而滤波器在降低噪声的同时也导致边缘强度的损失。
(2)增强。
增强边缘的基础是确定图像各点邻域强度的变化值。
增强算法可以将邻域(或局部)强度值有显著变化的点突显出来。
边缘增强一般是通过计算梯度幅值来完成的。
增强算法将邻域中灰度有显著变化的点突出显示。
一般通过计算梯度幅值完成。
(3)检测。
在图像中有许多点的梯度幅值比较大,而这些点在特定的应用领域中并不都是边缘,所以应该用某种方法来确定哪些点是边缘点。
最简单的边缘检测判据是梯度幅值阈值判据。
但在有些图像中梯度幅值较大的并不是边缘点。
最简单的边缘检测是梯度幅值阈值判定。
(4)定位。
如果某一应用场合要求确定边缘位置,则边缘的位置可在子像素分辨率上来估计,边缘的方位也可以被估计出来。
图10-4边缘检测算法的基本步骤
常见的边缘检测算子有Roberts算子、Sobel算子、Prewitt算子、LOG算子和Canny算子,以及Susan算子。
10.2.1简单的边缘检测算子
1.Roberts算子
1963年,Roberts提出了边缘检测算子。
Roberts交叉算子为梯度幅值计算提供了一种简单的近似方法:
用卷积模板,上式变成:
其中和由下面的模板计算:
差分值将在内插点处计算。
Roberts算子是该点连续梯度的近似值,而不是所预期的在点处的近似值。
在MATLAB中可以由edge函数实现。
其语法格式如下:
BW=edge(I,'roberts')
BW=edge(I,'roberts',thresh)
[BW,thresh]=edge(I,'roberts',…)
BW=edge(I,'roberts')自动选择阈值用Robert算子进行边缘检测。
BW=edge(I,'roberts',thresh)根据所指定的敏感度阈值thresh用Roberts算子进行边缘检测,它忽略了所有小于阈值的边缘。
当thresh为空时,自动选择阈值。
[BW,thresh]=edge(I,'roberts',…)返回阈值。
edge函数对灰度图像I进行边缘检测,返回与I同样大小的二值图像BW,其中1表示I的边缘,0表示非边缘。
I是uint8型、uint16型或double型的,BW是uint8型的。
2.Sobel算子
Sobel算子是边缘检测器中最常用的算子之一。
采用3×3邻域可以避免在像素之间内插点上计算梯度。
考虑如图10-5所示的点周围点的排列。
Sobel算子也是一种梯度幅值:
其中的偏导数用下式计算:
其中常数c=2。
和其他的梯度算子一样,和可用卷积模板来实现:
图10-5用于说明Sobel算子和Prewitt算子的邻域像素点标记
edge函数实现的语法格式如下:
BW=edge(I,'sobel')
BW=edge(I,'sobel',thresh)
BW=edge(I,'sobel',thresh,direction)
[BW,thresh]=edge(I,'sobel'…)
BW=edge(I,'sobel')自动选择阈值用Sobel算子进行边缘检测。
BW=edge(I,'sobel',thresh)根据所指定的敏感度阈值thresh,用Sobel算子进行边缘检测,它忽略了所有小于阈值的边缘。
当thresh为空时,自动选择阈值。
BW=edge(I,'sobel',thresh,direction)根据所指定的敏感度阈值thresh,在所指定的方向direction上,用Sobel算子进行边缘检测。
Direction可取的字符串值为horizontal(水平方向)、vertical(垂直方向)或both(两个方向)。
[BW,thresh]=edge(I,'sobel'…)返回阈值。
3.Prewitt算子
Prewitt于1970年左右提出了Prewitt算子。
由上面对Sobel算子的推导,同时也得出了Prewitt算子。
Prewitt算子和Sobel算子的方程完全一样,不同的是只是a和b的系数不同。
以下是Prewitt的两个算子:
edge函数实现的语法格式如下:
BW=edge(I,'prewitt')
BW=edge(I,'prewitt',thresh)
BW=edge(I,'prewitt',thresh,direction)
[BW,thresh]=edge(I,'prewitt'…)
BW=edge(I,'prewitt')自动选择阈值用Prewitt算子进行边缘检测。
BW=edge(I,'prewitt',thresh)根据所指定的敏感度阈值thresh,用Prewitt算子进行边缘检测,它忽略了所有小于阈值的边缘。
当thresh为空时,自动选择阈值。
BW=edge(I,'prewitt',thresh,direction)根据所指定的敏感度阈值thresh,在所指定的方向direction上,用Prewitt算子进行边缘检测。
Direction可取的字符串值为horizontal(水平方向)、vertical(垂直方向)或both(两个方向)。
[BW,thresh]=edge(I,'prewitt'…)返回阈值。
4.LOG算子
拉普拉斯算子的卷积核如图10-6所示,它是一个二阶算子,将在边缘处产生一个陡峭的零交叉。
拉普拉斯算子是一个线性的、移不变的算子,它的传递函数在频域空间的圆点是零,因此经拉普拉斯滤波过的图像具有零平均灰度。
LOG算子先用高斯低通滤波器将图像进行预先平滑,然后用拉普拉斯算子找出图像中的陡峭边缘,最后用零灰度值进行二值化产生闭合的、连通的轮廓,消除了所有内部点。
图10-6拉普拉斯算子
edge函数实现的语法格式如下:
BW=edge(I,'log')
BW=edge(I,'log',thresh)
BW=edge(I,'log',thresh,sigma)
[BW,thresh]=edge(I,'log'…)
BW=edge(I,'log')自动选择阈值用LOG算子进行边缘检测。
BW=edge(I,'log',thresh)根据所指定的敏感度阈值thresh,用LOG算子进行边缘检测,它忽略了所有小于阈值的边缘。
当thresh为空时,自动选择阈值。
当指定thresh为0时,输出图像具有闭合的轮廓,因为其中包含了输入图像中的所有零交叉点。
BW=edge(I,'log',thresh,sigma)根据所指定的敏感度阈值thresh和标准偏差sigma,用LOG算子进行边缘检测,默认时sigma等于2,滤波器是n×n维的。
其中
n=ceil(sigma×3)×2+1
[BW,thresh]=edge(I,'log'…)返回阈值。
各种边缘检测算子实验效果如图10-7所示。
(a)原始图像(b)LOG
(c)Prewitt(d)Roberts
(e)Sobel(f)Canny
图10-7各种边缘检测算子实验效果图
10.2.2Canny边缘检测
1.Canny边缘检测基本原理
(1)图像边缘检测必须满足两个条件:
一是能有效地抑制噪声;二是必须尽量精确确定边缘的位置。
(2)根据对信噪比与定位乘积进行测度,得到最优化逼近算子。
这就是Canny边缘检测算子。
(3)类似于Marr(LOG)边缘检测方法,也属于先平滑后求导数的方法。
2.Canny边缘检测算法
(1)用高斯滤波器平滑图像。
(2)用一阶偏导的有限差分来计算梯度的幅值和方向。
(3)对梯度幅值进行非极大值抑制。
(4)用双阈值算法检测和连接边缘。
Canny算子检测边缘的方法是寻找图像梯度的局部极大值,梯度是用高斯滤波器的导数计算的。
Canny方法使用两个阈值来分别检测强边缘和弱边缘,而且仅当弱边缘与强边缘相连时,弱边缘才会包含在输出中。
因此,此方法不容易受噪声的干扰,能够检测到真正的弱边缘。
BW=edge(I,'canny')
BW=edge(I,'canny',thresh)
BW=edge(I,'canny',thresh,sigma)
[BW,thresh]=edge(I,'canny'…)
BW=edge(I,'canny')自动选择阈值用Canny算子进行边缘检测。
BW=edge(I,'canny',thresh)根据所指定的敏感度阈值thresh,用Canny算子进行边缘检测,thresh是一个含两个元素的矢量,第一个元素是低阈值,第二个元素是高阈值;如果只给thresh指定一个值,则此值作为高阈值,而0.4×thresh作为低阈值;当thresh为空时,自动选择低阈值和高阈值。
BW=edge(I,'canny',thresh,sigma)根据所指定的敏感度阈值thresh和标准偏差sigma,用Canny算子进行边缘检测,默认时sigma等于1,滤波器的尺寸sigma自动选择。
[BW,thresh]=edge(I,'canny'…)返回含两个元素的阈值矢量。
10.2.3Susan边缘检测
Susan准则的原理如图10-8所示。
用一个圆形模板扫描图像,若模板内其他任意像素
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 边缘 检测