pet图像肿瘤的检测科研训练结果.docx
《pet图像肿瘤的检测科研训练结果.docx》由会员分享,可在线阅读,更多相关《pet图像肿瘤的检测科研训练结果.docx(15页珍藏版)》请在冰豆网上搜索。
pet图像肿瘤的检测科研训练结果
第四章用MATLAB进行PET图象肿瘤的检测
4.1图像的读取与显示
1、读取图像
函数imread可以从任何Matlab支持的图像文件格式中,以任意位深度读取一幅图像。
格式为:
MAP=imread(FILENAME,'FMT'),其中:
FILENAME-为需要读入的图像文件名称,FMT-为图像格式。
2、读取图像信息
可以通过调用imfinfo函数获得与图像文件有关的信息,格式如下:
INFO=imfinfo(FILENAME,'FMT')其中:
返回的INFO是Matlab的一个结构体。
3、显示图像
Matlab的图像显示函数主要使用imshow。
imshow(I,n):
显示灰度级为n的图像,n缺省为256。
imshow(I,[low,high]):
以灰度范围[low,high]显示图像,如果不知道灰度范围,可以用imshow(I,[])显示。
imshow(BW):
显示二值图像。
4.2阈值分割(整个科研实验的重点)
(1)调入并显示图像rice.png。
(2)用迭代式阈值选择方法分割图像:
(3)用Otsu法阈值选择法分割图像;
(4)用分水岭算法分割图像。
(5)将上述几种处理方法的结果作比较。
在一幅图像中,人们常常只对其中的部分目标感兴趣,这些目标通常占据一定的区域,并且在某些特性(如灰度、轮廓、颜色和纹理等)上和临近的图像有差别。
这些特性差别可能非常明显,也可能很细微,以至肉眼察觉不出来。
随着计算机图像处理技术的发展,使得人们可以通过计算机来获取和处理图像信息。
图像识别的基础是图像分割,其作用是把反映物体真实情况的、占据不同区域的、具有不同特性的目标区分开来,并形成数字特征。
图像分割是图像理解的基础,而在理论上图像分割又依赖图像理解,它们彼此是紧密关联的。
图像分割在一般意义下是十分困难的问题,目前的图像分割一般作为图像的前期处理阶段,是针对分割对象的技术,最常用到的是利用阈值化处理进行的图像分割。
所谓阈值的方法实质是利用图像的灰度直方图信息得到用于分割的阈值。
基于阈值的分割方法可以分为全局阈值的方法好局部阈值的方法,全局阈值的方法是利用整幅图像的灰度信息,从整个图像中得到用于分割的阈值,并且根据该阈值对图像进行分割;而局部阈值的方法是根据图像中不同区域获得对应不同区域的几个阈值,利用这些得到的阈值对图像进行分割,也就是一个阈值对应图像中的一个子区域。
该方法的关键是如何合理地选择阈值,人工选择法是通过人眼的观察,应用人们对图像的知识,在分析图像直方图的基础上人工选出合适的阈值,也可以在人工选出阈值后,根据分割效果不断地交换操作,从而选择出较佳的阈值;自动阈值法通常使用灰度直方图来分析图像中灰度值的分布,结合特定的应用区域知识来选取合适的阈值。
(1)迭代式阈值选择
迭代式阈值选择方法的基本思想是:
开始时候选择一个阈值作为初始计值,然后按某种策略不断地改进这一估计值,直到满意给定的准则为止。
在迭代过程中,关键之处在于选择什么样的阈值改进策略。
好的与之改进侧率应该具备两个特征:
一是能够快速收敛;二是在每一个迭代过程中,新产生阈值优于上一次的阈值。
如下是具体操作步骤:
a选择图像灰度的中值作为初始阈值
;
b利用此阈值
把图像分割成两个区域——
和
,用下式计算区域
和
的灰度均值
和
c计算出
和
后,计算新的阈值
d重复步骤2和3,直到
和
的差小于某个给定值。
下面为实现迭代式阈值选择的MATLAB代码:
f=imread('rice.png');
subplot(121);
imshow(f);
title('原始图像')
f=double(f);
T=(min(f(:
))+max(f(:
)))/2;
done=false;
i=0;
while~done
r1=find(f<=T);
r2=find(f>T);
Tnew=(mean(f(r1))+mean(f(r2)))/2;
done=abs(Tnew-T)<1;
T=Tnew;
i=i+1;
end
f(r1)=0;
f(r2)=1;
subplot(122);
imshow(f);
title('迭代阈值二值化图像')
用迭代式阈值选择法二值化图像
(2)Otsu法阈值选择
Otsu法是一种使类间方差最大的自动确定阈值的方法,该方法具有简单、处理速度快的特点,是一种常用的阈值选取方法。
MATLAB工具箱提供的graythresh函数求取阈值采用的就是这种方法。
其基本思想是:
设图像像素数为N,灰度范围为[0,L-1],对应灰度级i的像素数为
,概率为
i=0,1,2,…,L-1
把图像中的像素按灰度值用阈值T分成两类
和
,
由灰度值在[0,T]之间的像素组成,
由灰度值在[T+1,L-1]之间的像素组成,对于灰度分布概率,整幅图像的均值为
则
和
的均值为
,
其中
,
由上面三式可得
,类间方差定义为
让T在[0,L-1]范围依次取值,使得方差最大的T值即为Otsu法的最佳阈值。
下面为用Otsu方法进行阈值选择的MATLAB代码:
f=imread('rice.png');
subplot(121);
imshow(f);
title('原始图像')
T=graythresh(f);
g=im2bw(f,T);
subplot(122);
imshow(g);
title('Otsu方法二值化图像')
用Otsu方法二值化图像
(3)分水岭算法
分水岭算法(watershed)是一种借鉴了形态学理论的分割方法,在该方法中,将一幅图像看成一个拓扑地形图,其中灰度值对应地形高度值,高灰度值对应着山峰,低灰度值对应着山谷。
水总是朝着地势低的地方流动,直到某一局部低洼处才停下来,这个低洼处被称为吸水盆地。
最终所有的水会分聚在不同的吸水盆地,吸水盆地之间的山脊被称为分水岭。
水从分水岭流下时,它朝着不同的吸水盆地流去的可能性是相等的。
将这种想法应用于图像分割,就是要在灰度图像中找到不同的吸水盆地和分水岭,由这些不同的吸水盆地和分水岭组成的区域即为我们要分割的目标。
阈值T0阈值T1阈值T2
分水岭形成示意图
I=imread('eight.tif');
subplot(221);
imshow(I);
title('原始图像')
subplot(222);
I=double(I);
hv=fspecial('prewitt');
hh=hv.';
gv=abs(imfilter(I,hv,'replicate'));
gh=abs(imfilter(I,hh,'replicate'));
g=sqrt(gv.^2+gh.^2);
subplot(222);
L=watershed(g);
wr=L==0;
imshow(wr);
title('分水岭')
I(wr)=255;
subplot(223);
imshow(uint8(I));
title('分割结果')
rm=imregionalmin(g);
subplot(224);
imshow(rm);
title('局部极小值')
不准确标记分水岭算法导致的过分割
从上图可以看到对应于目标的边缘,出现了比较严重的过分割现象,原因在于分水岭算法是以梯度图的局部极小点作为吸水盆地的标记点。
从第四幅图中可以看到有过多的局部极小点。
下面的改进程序克服了这个缺点。
I=imread('eight.tif');
subplot(231);
imshow(I);
I=double(I);
hv=fspecial('prewitt');
hh=hv.';
gv=abs(imfilter(I,hv,'replicate'));
gh=abs(imfilter(I,hh,'replicate'));
g=sqrt(gv.^2+gh.^2);
subplot(232);
df=bwdist(I);
imshow(uint8(df*8));
L=watershed(df);
em=L==0;
subplot(233);
imshow(em);
im=imextendedmax(I,20);
subplot(234);
imshow(im);
g2=imimposemin(g,im|em);
subplot(235);
imshow(g2);
L2=watershed(g2);
wr2=L2==0;
subplot(236);
I(wr2)=255;
imshow(uint8(I));
准确标记的分水岭算法分割过程
4.3图像分割
1、图像分割概述
图像分割一般采用的方法有边缘检测(edgedetection)、边界跟踪(edgetracing)、区域生长(regiongrowing)、区域分离和聚合等。
图像分割算法一般基于图像灰度值的不连续性或其相似性。
不连续性是基于图像灰度的不连续变化分割图像,如针对图像的边缘有边缘检测、边界跟踪等算法。
相似性是依据事先制定的准则将图像分割为相似的区域,如阈值分割、区域生长等。
2、边缘检测
图像的边缘点是指图像中周围像素灰度有阶跃变化或屋顶变化的那些像素点,即灰度值导数较大或极大的地方。
边缘检测可以大幅度的减少数据量,并且剔除不相关信息,保留图像重要的结构属性。
边缘检测基本步骤:
平滑滤波、锐化滤波、边缘判定、边缘连接。
边缘检测算法:
•基于一阶导数:
Roberts算子、Sobel算子、Prewitt算子
•基于二阶导数:
高斯-拉普拉斯边缘检测算子
•Canny边缘检测算法
Matlab实现
1)、基于梯度算子的边缘检测
BW=edge(I,type,thresh,direction,’nothinning’)
type合法取值
梯度算子
‘sobel’
sobel算子
‘prewitt’
prewitt算子
‘reberts’
robert算子
thresh是敏感度阈值参数,任何灰度值低于此阈值的边缘将不会被检测到。
默认值为空矩阵[],此时算法自动计算阈值。
direction指定了我们感兴趣的边缘方向,edge函数将只检测direction中指定方向的边缘,其合法值如下:
direction合法值
边缘方向
‘horizontal’
水平方向
‘vertical’
竖直方向
‘both’
所有方向
可选参数’nothinning’,指定时可以通过跳过边缘细化算法来加快算法运行的速度。
默认是’thinning’,即进行边缘细化。
2)、基于高斯-拉普拉斯算子的边缘检测
BW=edge(I,’log’,thresh,sigma)
sigma指定生成高斯滤波器所使用的标准差。
默认时,标准差为2。
滤镜大小n*n,n的计算方法为:
n=ceil(sigma*3)*2+1。
3)、基于Canny算子的边缘检测
BW=edge(I,’canny’,thresh,sigma)
thresh是敏感度阈值参数,默认值为空矩阵[]。
此处为一列向量,为算法指定阈值的上下限。
第一个元素为阈值下限,第二个元素为阈值上限。
如果只指定一个阈值元素,则默认此元素为阈值上限,其0.4倍的值作为阈值下限。
如阈值参数没有指定,则算法自行确定敏感度阈值上下限。
b1=imread('nir.bmp');
h58=fspecial('gaussian',5,0.8);
b=imfilter(b1,h58);
bw1=edge(b,‘sobel’);%sobel算子
bw2=edge(b,‘prewitt’);%prewitt算子
bw3=edge(b,‘roberts’);%roberts算子
bw4=edge(b,‘log’);%log算子
bw5=edge(b,‘canny’);%canny算子
figure;imshow(bw1);imwrite(bw1,'nirbwsobel.bmp');
figure;imshow(bw2);imwrite(bw2,'nirbwprewitt.bmp');
figure;imshow(bw3);imwrite(bw3,'nirbwroberts.bmp');
figure;imshow(bw4);imwrite(bw4,'nirbwlog.bmp');
figure;imshow(bw5);imwrite(bw5,'nirbwcanny.bmp');
分析:
1、边缘定位精度方面:
Roberts算子和Log算子定位精度较高。
Roberts算子简单直观,Log算子利用二阶导数零交叉特性检测边缘。
但Log算子只能获得边缘位置信息,不能得到边缘方向信息。
2、边缘方向的敏感性:
Sobel算子、Prewitt算子检测斜向阶跃边缘效果较好,Roberts算子检测水平和垂直边缘效果较好。
Log算子不具有边缘方向检测功能。
Sobel算子能提供最精确的边缘方向估计。
3、去噪能力:
Roberts算子和Log算子虽然定位精度高,但受噪声影响大。
Sobel算子和Prewitt算子模板相对较大因而去噪能力较强,具有平滑作用,能滤除一些噪声,去掉一部分伪边缘,但同时也平滑了真正的边缘,降低了其边缘定位精度。
总体来讲,Canny算子边缘定位精确性和抗噪声能力效果较好,是一个折中方案。
4.4图像特征提取
1.特征提取的一般原则:
选择在同类图像之间差异较小(较小的类内距),在不同类别的图像之间差异较大(较大的类间距)的图像特征。
2.简单区域描绘子
•周长:
区域边界上的像素数目。
•面积:
区域中像素数目。
•致密性:
(周长)^2/面积。
•区域的质心。
•灰度均值:
区域中所有像素的平均值。
•灰度中值:
区域中所有像素的排序中值。
•包含区域的最小矩形。
•最小或最大灰度级。
•大于或小于均值的像素数。
•欧拉数:
区域中的对象数减去这些对象的孔洞数。
D=regionprops(L,properties);
L为一个标记矩阵,通过连通1区域标注函数bwlabel得到。
Properties合法值
含义
‘Area’
区域内像素总数
‘BoundingBox’
包含区域的最小矩形
‘Centroid’
区域的质心
‘ConvexHull’
包含区域的最小凸多边形
‘EquivDiameter’
和区域有着相同面积的圆的直径
‘EulerNumber’
区域中的对象数减去这些对象的孔洞数
3、主成分分析(PrincipalComponentAnalysis,PCA)
[COEFF,SCORE,latent]=pincomp(X);
•X为原始样本组成n*d的矩阵,其每一行是一个样本特征向量,每一列表示样本特征向量的一维。
•COEFF:
主成分分量,也是样本协方差矩阵的本征向量。
•SCORE:
主成分,X的低维表示。
•latent:
一个包含着样本协方差矩阵本征值的向量。