Matlab医学图像分割区域生长.docx
《Matlab医学图像分割区域生长.docx》由会员分享,可在线阅读,更多相关《Matlab医学图像分割区域生长.docx(27页珍藏版)》请在冰豆网上搜索。
Matlab医学图像分割区域生长
实验十医学图像分割
(二)
实验目的:
1.了解图像分割的基本理论和方法;
2.掌握阈值分割的方法和阈值的选择;
3.掌握基于分水岭分割的原理和应用;
实验内容:
1.区域生长法利用图像像素间的相似性进行分割,调用regiongrow函数对图像weld.tif进行处理,注意参数中S(种子值),T(阈值)的选择对分割效果的影响。
S=255,T=65和S=255T=150和S=150,T=65三组值进行处理,理解在区域生长法的原理。
同时对liver.bmp,自己选择合适的S和T,以较好得分割出肝脏。
代码1:
closeall;
f=imread('weld.tif');
figure
(1),imshow(f),title('原图');
[g1,NR]=regiongrow(f,255,65);
[g2,NR]=regiongrow(f,255,150);
[g3,NR]=regiongrow(f,150,65);
figure
(2),imshow(g1),title('S=255,T=65');
figure(3),imshow(g2),title('S=255,T=150');
figure(4),imshow(g3),title('S=150,T=65');
[y,x]=ginput();
x=floor(x);
y=floor(y);
G=zeros(size(g));
G(g3==g3(x,y))=255;
结果:
代码2:
closeall;
f=imread('liver1.bmp');
figure
(1),imshow(f),title('原图');
g=regiongrow(f,255,135);%肝脏分离
figure
(2),imshow(g),title('S=255,T=135');
[y,x]=ginput();
x=floor(x);
y=floor(y);
G=zeros(size(g));
G(g==g(x,y))=255;
figure(3),imshow(G);
结果:
2.编写m文件,实现单一型或质心型区域生长算法。
由用户通过ginput函数选择种子点,然后根据用户输入的阈值T进行区域生长。
输入为:
待分割的图片f和阈值T,输出为分割后的二值图片g。
代码1:
(单一型)
function[a]=regiongrow2(f,T)
imshow(f);
se=[0,1,0;1,1,1;0,1,0];
[y,x]=ginput();
x=floor(x);
y=floor(y);
a=im2bw(zeros(size(f)));
a(x,y)=1;
while1
b=imdilate(a,se);
P=b-a;
find(P);
index=find(P);
n=size(index);
fori=1:
n
t=abs(f(x,y)-f(index(i)));
ift>=T
b(index(i))=0;
P(index(i))=0;
end
end
a=b;
ifsum(sum(P))==0
break;
end
end
应用:
f=imread('weld.tif');
figure
(1),imshow(f)
g=regiongrow3(f,30);
figure
(2),imshow(g)
代码2:
(质心型)
function[a]=regiongrow4(f,T)
imshow(f);
se=[0,1,0;1,1,1;0,1,0];
[y,x]=ginput();
x=floor(x);
y=floor(y);
a=im2bw(zeros(size(f)));
a(x,y)=1;
average=f(x,y);
while1
b=imdilate(a,se);
P=b-a;
index=find(P);
n=size(index);
fori=1:
n
t=abs(average-double(f(index(i))));
ift>=T
b(index(i))=0;
P(index(i))=0;
end
end
a=b;
indexb=find(b);
N=length(indexb);
All=0;
fori=1:
N
All=All+double(f(indexb(i)));
end
average=All/N;
ifsum(sum(P))==0
break;
end
end
结果:
3.用课本中分水岭的距离变换分水岭分割、梯度分水岭分割和控制标记符分水岭分割对liver1和liver2图像进行分割,分析上述算法的特点和存在的问题,考虑如何进行改进?
代码1:
closeall;
f=imread('liver1.bmp');
figure
(1),imshow(f);
%g=im2bw(f,graythresh(f));
[g,NR]=regiongrow(f,255,135);%肝脏分离
figure
(2),imshow(g);
gc=~g;
D=bwdist(gc);
L=watershed(-D);
w=L==0;
figure(3),imshow(w);
g2=g&~w;
figure(5),imshow(g2);
代码2:
closeall;
f=imread('liver1.bmp');
F=regiongrow(f,255,135);
%F=im2bw(f,graythresh(f));
figure
(1),imshow(F);
h=fspecial('sobel');
fd=double(f);
g=sqrt(imfilter(fd,h,'replicate').^2+...
imfilter(fd,h','replicate').^2);
figure
(2),imshow(g);
L=watershed(g);
wr=L==0;
figure(3),imshow(wr);
g2=imclose(imopen(g,ones(3,3)),ones(3,3));
L2=watershed(g2);
wr2=L2==0;
f2=F;
f2(wr2)=255;
figure(4),imshow(f2);
代码3:
closeall;
f=imread('liver1.bmp');
F=regiongrow(f,255,135);
%F=im2bw(f,graythresh(f));
figure
(1),imshow(F);
h=fspecial('sobel');
fd=double(f);
g=sqrt(imfilter(fd,h,'replicate').^2+...
imfilter(fd,h','replicate').^2);
figure
(2),imshow(g);
L=watershed(g);
wr=L==0;
figure(3),imshow(wr);
rm=imregionalmin(g);
im=imextendedmin(f,2);
fim=f;
fim(im)=175;
Lim=watershed(bwdist(im));
em=Lim==0;
figure(4),imshow(em);
g2=imimposemin(g,im|em);
L2=watershed(g2);
f2=f;
f2(L2==0)=255;
figure(5),imshow(f2);
实验报告:
1.实验目的
2.实验内容(部分可略写)每题分开写,并标明题号
3.实验小结和体会
小结:
1、第一题重在理解S和T的涵义,若S是一个标量,则它定义一个亮度值,f中有着该值的所有点都变成种子;若T是标量,则它会定义一个全局阈值,阈值用来测试图像中的像素是否与该种子或8连接种子足够相似。