matlab区域生长代码.docx_第1页
matlab区域生长代码.docx_第2页
matlab区域生长代码.docx_第3页
matlab区域生长代码.docx_第4页
matlab区域生长代码.docx_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文使用matlab编了一个程序,实现区域生长。具体思路是这样的:从灰度图像中取一点作为种子(其实程序略微修改就可实现多个种子点生长,但个人觉得不是很必要),记为P(i,j)。然后,按P点的上-右-下-左-上的顺序一层一层地生长出去。没一层距离P的距离分别记为a,b,c,d,没生长一次,a,b,c,d的值加1,并在下一层生长前判断是否到达图像边界(注意是边界不是边缘),直到生长完成。话不多说,具体程序如下:%区域生长法分割图像。每轮生长都是由上到下,从左到右map1=imread(picturename.jpg);m,n,dep=size(map1); %行,列,深度值A=zeros(m,n);%灰度化for i=1:m for j=1:n A(i,j)=0.11*map1(i,j,1)+0.59*map1(i,j,2)+0.3*map1(i,j,3); endend%灰度化完成,输出灰度图figure(1)imshow(A,)title(原始灰度图像)B=zeros(m,n); %存储输出图像fprintf(请取一个目标点,结束后回车n)x1,y1=getpts; %获得区域生长起始点i=round(x1); %横坐标取整j=round(y1); %纵坐标取整seed=A(i,j)B(i,j)=255; %种子点提取T=input(请输入生长阈值T(0T255)n)a=1;b=1;c=1;d=1; %四个方向的计数器h=0;while ai|b=n-j|c=m-i|dj %有一侧没到边界,继续生长 %以下为上侧生长程序 while ai %ai,只执行一次(用break来保证) mina=max(j-a,1); maxa=min(j+a,n); %找出两侧端点,此时只需考虑列 for k=mina:maxa if k=mina %若为左端点 if B(i-a+1,k)=255|B(i-a+1,k+1)=255 %且下或右下存在种子,进行下面的判断 if abs(A(i-a,k)-seed)T B(i-a,k)=255; else B(i-a,k)=0; end end else if k=maxa %若为右端点 if B(i-a,k-1)=255|B(i-a+1,k-1)=255|B(i-a+1,k)=255 %且左或左下或下存在种子,进行下面的判断 if abs(A(i-a,k)-seed)T B(i-a,k)=255; else B(i-a,k)=0; end end else %k不为端点,则需检测左、左下、下和右下 if B(i-a,k-1)=255|B(i-a+1,k-1)=255|B(i-a+1,k)=255|B(i-a+1,k+1)=255 %左下、下或右下存在种子,则进行下面的判断 if abs(A(i-a,k)-seed)T B(i-a,k)=255; else B(i-a,k)=0; end end end end end a=a+1; break; end %上侧完成一次生长,以下为右侧生长程序 while b=n-j minb=max(i-b,1); maxb=min(i+b,m); %找出两侧端点,此时则只需考虑行 for k=minb:maxb if k=minb %若为上端点 if B(k,j+b-1)=255|B(k+1,j+b-1)=255 %且左或左下存在种子,进行下面的判断 if abs(A(k,j+b)-seed)T B(k,j+b)=255; else B(k,j+b)=0; end end else if k=maxb %若为下端点 if B(k-1,j+b)=255|B(k-1,j+b-1)=255|B(k,j+b-1)=255 %且左或左上或上存在种子,进行下面的判断 if abs(A(k,j+b)-seed)T B(k,j+b)=255; else B(k,j+b)=0; end end else %k不为端点,则需检测上、左上、左和左下 if B(k-1,j+b)=255|B(k-1,j+b-1)=255|B(k,j+b-1)=255|B(k+1,j+b-1)=255 %左下、下或右下存在种子,则进行下面的判断 if abs(A(k,j+b)-seed)T B(k,j+b)=255; else B(k,j+b)=0; end end end end end b=b+1; break; end %右侧完成一次生长,以下为下侧生长程序 while c=m-i %ai,只执行一次(用break来保证) minc=max(j-c,1); maxc=min(j+c,n); %找出两侧端点,此时只需考虑列 for k=minc:maxc if k=mina %若为左端点 if B(i+c-1,k)=255|B(i+c-1,k+1)=255 %且上或右上存在种子,进行下面的判断 if abs(A(i+c,k)-seed)T B(i+c-1,k)=255; else B(i+c-1,k)=0; end end else if k=maxc %若为右端点 if B(i+c,k-1)=255|B(i+c-1,k-1)=255|B(i+c-1,k)=255 %且左或左上或上存在种子,进行下面的判断 if abs(A(i+c,k)-seed)T B(i+c,k)=255; else B(i+c,k)=0; end end else %k不为端点,则需检测左、左上、上和右上 if B(i+c,k-1)=255|B(i+c-1,k-1)=255|B(i+c-1,k)=255|B(i+c-1,k+1)=255 %左、左上、上或右上存在种子,则进行下面的判断 if abs(A(i+c,k)-seed)T B(i+c,k)=255; else B(i+c,k)=0; end end end end end c=c+1; break; end %下侧完成一次生长,以下为左侧生长程序 while dj mind=max(i-d,1); maxd=min(i+d,m); %找出两侧端点,此时则只需考虑行 for k=mind:maxd if k=mind %若为上端点 if B(k,j-d+1)=255|B(k+1,j-d+1)=255 %且右或右下存在种子,进行下面的判断 if abs(A(k,j-d)-seed)T B(k,j-d)=255; else B(k,j-d)=0; end end else if k=maxd %若为下端点 if B(k-1,j-d)=255|B(k-1,j-d+1)=255|B(k,j-d+1)=255 %且上或右上或右存在种子,进行下面的判断 if abs(A(k,j-d)-seed)T B(k,j-d)=255; else B(k,j-d)=0; end end else %k不为端点,则需检测上、右上、右和右下 if B(k-1,j-d)=255|B(k-1,j-d+1)=255|B(k,j-d+1)=255|B(k+1,j-d+1)=255 %上、右上

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论