matlab区域生长代码.docx

上传人:牧羊曲112 文档编号:3061600 上传时间:2023-03-10 格式:DOCX 页数:7 大小:37.88KB
返回 下载 相关 举报
matlab区域生长代码.docx_第1页
第1页 / 共7页
matlab区域生长代码.docx_第2页
第2页 / 共7页
matlab区域生长代码.docx_第3页
第3页 / 共7页
matlab区域生长代码.docx_第4页
第4页 / 共7页
matlab区域生长代码.docx_第5页
第5页 / 共7页
亲,该文档总共7页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《matlab区域生长代码.docx》由会员分享,可在线阅读,更多相关《matlab区域生长代码.docx(7页珍藏版)》请在三一办公上搜索。

1、matlab区域生长代码本文使用matlab编了一个程序,实现区域生长。 具体思路是这样的: 从灰度图像中取一点作为种子,记为P。然后,按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(

2、i,j)=0.11*map1(i,j,1)+0.59*map1(i,j,2)+0.3*map1(i,j,3); end end %灰度化完成,输出灰度图 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(请输入生长阈值Tn) a=1; b=1; c=1; d=1; %四个方向的计

3、数器 h=0; while ai|b=n-j|c=m-i|dj %有一侧没到边界,继续生长 %以下为上侧生长程序 while ai %ai,只执行一次 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

4、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; e

5、nd 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,

6、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

7、 end end end b=b+1; break; end %右侧完成一次生长,以下为下侧生长程序 while c=m-i %ai,只执行一次 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

8、 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

9、; 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,

10、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 %上、右上、右或右下存在种子,则进行下面的判断 if abs(A(k,j-d)-seed)T B(k,j-d)=255; else B(k,j-d)=0; end end end end end d=d+1; break; end h=h+1; end figure(2) imshow(B,) title(区域生长分割后图像)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号