Matlab实现区域生长算法学习资料
- 格式:doc
- 大小:179.51 KB
- 文档页数:5
实验十医学图像分割(二)
实验目的:
1.了解图像分割的基本理论和方法;
2.掌握阈值分割的方法和阈值的选择;
3.掌握基于分水岭分割的原理和应用;
实验内容:
1.区域生长法利用图像像素间的相似性进行分割,调用
regiongrow函数对图像weld.tif进行处理,注意参数中S(种
子值),T(阈值)的选择对分割效果的影响。
S=255,T=
65和S=255 T=150和S=150,T=65三组值进行处理,
理解在区域生长法的原理。
同时对liver.bmp,自己选择合
适的S和T,以较好得分割出肝脏。
代码1:
close all;
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;结果:。
本文使用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:mfor j=1:nA(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(0<T<255)\n')a=1;b=1;c=1;d=1; %四个方向的计数器h=0;while a<i||b<=n-j||c<=m-i||d<j %有一侧没到边界,继续生长%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%以下为上侧生长程序while a<i %a<i,只执行一次(用break来保证)mina=max(j-a,1);maxa=min(j+a,n); %找出两侧端点,此时只需考虑列for k=mina:maxaif k==mina %若为左端点if B(i-a+1,k)==255||B(i-a+1,k+1)==255 %且下或右下存在种子,进行下面的判断if abs(A(i-a,k)-seed)<TB(i-a,k)=255;elseB(i-a,k)=0;endendelse 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)<TB(i-a,k)=255;elseB(i-a,k)=0;endendelse %k不为端点,则需检测左、左下、下和右下ifB(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)<TB(i-a,k)=255;elseB(i-a,k)=0;endendendendenda=a+1;break;end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%上侧完成一次生长,以下为右侧生长程序while b<=n-jminb=max(i-b,1);maxb=min(i+b,m); %找出两侧端点,此时则只需考虑行for k=minb:maxbif k==minb %若为上端点if B(k,j+b-1)==255||B(k+1,j+b-1)==255 %且左或左下存在种子,进行下面的判断if abs(A(k,j+b)-seed)<TB(k,j+b)=255;elseB(k,j+b)=0;endendelse 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)<TB(k,j+b)=255;elseB(k,j+b)=0;endendelse %k不为端点,则需检测上、左上、左和左下ifB(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)<TB(k,j+b)=255;elseB(k,j+b)=0;endendendendendb=b+1;break;end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%右侧完成一次生长,以下为下侧生长程序while c<=m-i %a<i,只执行一次(用break来保证)minc=max(j-c,1);maxc=min(j+c,n); %找出两侧端点,此时只需考虑列for k=minc:maxcif k==mina %若为左端点if B(i+c-1,k)==255||B(i+c-1,k+1)==255 %且上或右上存在种子,进行下面的判断if abs(A(i+c,k)-seed)<TB(i+c-1,k)=255;elseB(i+c-1,k)=0;endendelse 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)<TB(i+c,k)=255;elseB(i+c,k)=0;endendelse %k不为端点,则需检测左、左上、上和右上ifB(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)<TB(i+c,k)=255;elseB(i+c,k)=0;endendendendendc=c+1;break;end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%下侧完成一次生长,以下为左侧生长程序while d<jmind=max(i-d,1);maxd=min(i+d,m); %找出两侧端点,此时则只需考虑行for k=mind:maxdif k==mind %若为上端点if B(k,j-d+1)==255||B(k+1,j-d+1)==255 %且右或右下存在种子,进行下面的判断if abs(A(k,j-d)-seed)<TB(k,j-d)=255;elseB(k,j-d)=0;endendelse 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)<TB(k,j-d)=255;elseB(k,j-d)=0;endendelse %k不为端点,则需检测上、右上、右和右下ifB(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)<TB(k,j-d)=255;elseB(k,j-d)=0;endendendendendd=d+1;break;endh=h+1;endfigure(2)imshow(B,[])title('区域生长分割后图像') 教你如何用WORD文档(2012-06-27 192246)转载▼标签:杂谈1. 问:WORD 里边怎样设置每页不同的页眉?如何使不同的章节显示的页眉不同?答:分节,每节可以设置不同的页眉。
大学matlab知识点总结在大学学习阶段,掌握MATLAB是非常重要的。
它可以帮助学生更好地理解课程知识,加深对数学、物理、工程等学科的理解,并且在毕业设计和科研项目中也非常有用。
本文将从MATLAB的基础知识、常用功能、高级技巧以及实际应用等方面进行总结,帮助大家更好地掌握这一强大的工具。
一、MATLAB基础知识1. MATLAB的基本操作MATLAB的基本操作包括变量的定义、函数的调用、矩阵的运算、图形的绘制等。
在MATLAB中,变量的定义和赋值非常简单,只需要使用等号就可以完成。
例如,定义一个变量a并赋值为1,只需要输入a=1即可。
函数的调用也非常方便,只需要输入函数名加上参数即可完成调用。
矩阵的运算也非常简单,可以使用+、-、*等运算符进行加减乘除等运算。
图形的绘制可以使用plot、scatter等函数进行绘制,也可以使用plot3函数进行三维图形的绘制。
2. MATLAB的数据类型MATLAB中的数据类型包括数值型、字符型和逻辑型等。
数值型包括整型和浮点型,可以表示整数和小数。
字符型可以表示字符串,可以用单引号或双引号括起来表示。
逻辑型包括true和false,可以表示逻辑真和逻辑假。
在MATLAB中,还可以使用矩阵、向量和数组等数据结构来表示数据。
3. MATLAB的控制流程MATLAB中的控制流程包括顺序结构、分支结构和循环结构。
顺序结构表示程序按照顺序执行,分支结构包括if语句和switch语句,可以根据条件选择不同的分支进行执行,循环结构包括for循环和while循环,可以重复执行一段代码。
二、MATLAB常用功能1. 数据可视化MATLAB提供了丰富的数据可视化函数,可以帮助用户将数据以图形的方式展现出来,包括直方图、散点图、曲线图、饼图等。
使用这些函数可以更直观地展示数据的分布、趋势和关系,并且可以进行自定义设置,使得图形更加美观。
2. 矩阵运算MATLAB是一种基于矩阵运算的语言,因此矩阵运算是其最重要的功能之一。
MATLAB中的regiongrowing函数用于图像分割。
以下是一个简单的regiongrowing函数实现:```matlabfunction [output] = regiongrowing(input, seed, threshold)输入参数:input - 输入图像(灰度图)seed - 种子点坐标(row, col)threshold - 阈值,用于确定像素是否属于同一区域输出参数:output - 分割后的图像(二值图)初始化输出图像output = zeros(size(input));获取图像尺寸[rows, cols] = size(input);将种子点标记为已访问output(seed(1), seed(2)) = 1;定义8个方向的偏移量directions = [-1, 0; 0, -1; -1, 1; 1, -1; 1, 0; 0, 1; -1, -1; 1, 1];循环直到所有像素都被访问while any(output == 0)遍历所有未访问的像素for i = 1:rowsfor j = 1:colsif output(i, j) == 0获取当前像素的值current_value = input(i, j);遍历当前像素的邻居for k = 1:size(directions, 1)计算邻居的坐标ni = i + directions(k, 1);nj = j + directions(k, 2);检查邻居是否在图像范围内且未被访问if ni >= 1 && ni <= rows && nj >= 1 && nj <= cols && output(ni, nj) == 0计算邻居与当前像素的差值diff = abs(current_value - input(ni, nj));如果差值小于阈值,则将邻居标记为已访问if diff < thresholdoutput(ni, nj) = 1;endendendendendendendend```这个函数接受一个灰度图像、一个种子点坐标和一个阈值作为输入,返回一个二值图像,表示分割后的区域。
Matlab程序:遗传算法/大津法/区域生长法/迭代法分割图像区域生长的图像分割程序image=imread('mri1.bmp');I=rgb2gray(image);figure,imshow(I),title('原始图像')I=double(I);[M,N]=size(I);[y,x]=getpts; %获得区域生长起始点x1=round(x); %横坐标取整y1=round(y); %纵坐标取整seed=I(x1,y1); %将生长起始点灰度值存入seed中Y=zeros(M,N); %作一个全零与原图像等大的图像矩阵Y,作为输出图像矩阵Y(x1,y1)=1; %将Y中与所取点相对应位置的点设置为白场sum=seed; %储存符合区域生长条件的点的灰度值的和suit=1; %储存符合区域生长条件的点的个数count=1; %记录每次判断一点周围八点符合条件的新点的数目threshold=15; %域值while count>0s=0; %记录判断一点周围八点时,符合条件的新点的灰度值之和count=0;for i=1:Mfor j=1:Nif Y(i,j)==1if (i-1)>0 && (i+1)<(M+1) && (j-1)>0 && (j+1)<(N+1) %判断此点是否为图像边界上的点for u= -1:1 %判断点周围八点是否符合域值条件for v= -1:1 %u,v为偏移量if Y(i+u,j+v)==0 & abs(I(i+u,j+v)-seed)<=threshold& 1/(1+1/15*abs(I(i+u,j+v)-seed))>0.8%判断是否未存在于输出矩阵Y,并且为符合域值条件的点Y(i+u,j+v)=1; %符合以上两条件即将其在Y中与之位置对应的点设置为白场count=count+1;s=s+I(i+u,j+v); %此点的灰度之加入s中endendendendendendendsuit=suit+count; %将n 加入符合点数计数器中sum=sum+s; %将s加入符合点的灰度值总合中seed=sum/suit; %计算新的灰度平均值endfigure,imshow(Y),title('分割后图像')。
区域⽣长算法(附MATLAB代码实现)⼀、理论概念 区域⽣长是按照事先定义的⽣长准则将⼀个像素或者⼦区域逐步聚合成⼀个完整独⽴的连通区域过程。
对于图像感兴趣⽬标区域R,z为区域R上事先发现的种⼦点,按照规定的⽣长准则逐步将与种⼦点z⼀定邻域内符合相似性判据的像素合并成⼀个种⼦群以备下⼀阶段的⽣长,这样不断的进⾏循环⽣长直到满⾜⽣长停⽌条件为⽌,从⽽完成了对感兴趣区域由⼀个种⼦点⽣长为⼀个独⽴连通区域的过程。
其中相似性判据可以是像素灰度值、颜⾊、纹理特征等图像信息。
因此区域⽣长算法⼀般分为三个步骤实现:(1) 确定⽣长种⼦点(2) 规定⽣长准则(3) 确定⽣长停⽌条件实际⼯程应⽤中区域⽣长算法常被⽤于对⼆值化图像指定连通区域的分割。
图1以图⽂⽅式对区域⽣长算法的三步骤进⾏解释:①原始⼆值化图像(a)中的红⾊标注的像素为指定⽣长点;②图像(b)和(c)是采⽤不同⽣长准则进⾏区域⽣长的结果,其中图(b)是在4邻域下,待测像素与⽣长点像素灰度值相等的像素集合。
正如图中所⽰第1次⽣长时,与⽣长点像素灰度相等的像素有上、下、左、右四个像素,接着第⼆次⽣长时,就由前⼀次已经⽣长的像素按照同样的准则进⾏下去,直到遇到图像边界或背景区域时⽣长停⽌。
图(c)是在8邻域下,待测像素与⽣长点像素灰度值相等的像素集合。
⼆、MATLAB⽰例代码实现2.1 主函数⽂件%主⽂件clc;clear all;close all;%申明全局变量 R:区域⽣长的结果图像;BW:⼆值化图像;counter:感兴趣连通区域的像素个数%row:图像的⾏数;col:图像的列数global R BW counter row colI = imread('E:\MATLAB仿真\fsr.bmp');I = I(:,:,1);[row,col] = size(I);figure,imshow(I);level = graythresh(I);BW = im2bw(I,level);figure,imshow(BW);[y0,x0] = getpts;x0 = uint32(x0);y0 = uint32(y0);counter = 0;R = zeros(row,col);R = uint8(R);fsrRegiongrow(x0,y0,4);% fsrRegiongrow1(x0,y0,4);figure,imshow(R);2.2 函数模块1function fsrRegiongrow(x0,y0,mode)%功能:通过函数递归⽅法对⼆值化图像指定连通区域实现区域⽣长%输⼊参数: x0,y0表⽰⽣长点像素坐标,mode表⽰以多⼤邻域进⾏区域⽣长,常取mode = 4;mode = 8;%输出参数: void%作者&时间:奔跑在湘边———2016年5⽉6⽇global R BW counter row colif 8 == modefor i = -1 : 1for j = -1 : 1x1 = x0 + i;y1 = y0 + j;%⽣长准则:判断⽣长点8邻域内像素的各⾃灰度值是否与⽣长点所在像素灰度值相等if x1 > 0 && x1 <= row && y1 > 0 && y1 <= col && BW(x1,y1) == BW(x0,y0) && 0 == R(x1,y1)R(x1,y1) = 255;counter = counter + 1;fsrRegiongrow(x1,y1,mode);endendendelseif 4 == modefor i = -1 : 1x1 = x0 + i;y1 = y0;if x1 > 0 && x1 <= row && y1 > 0 && y1 <= col && BW(x1,y1) == BW(x0,y0) && 0 == R(x1,y1)R(x1,y1) = 255;counter = counter + 1;fsrRegiongrow(x1,y1,mode);endendx1 = x0;y1 = y0 - 1;if x1 > 0 && x1 <= row && y1 > 0 && y1 <= col && BW(x1,y1) == BW(x0,y0) && 0 == R(x1,y1)R(x1,y1) = 255;counter = counter + 1;fsrRegiongrow(x1,y1,mode);endx1 = x0;y1 = y0 + 1;if x1 > 0 && x1 <= row && y1 > 0 && y1 <= col && BW(x1,y1) == BW(x0,y0) && 0 == R(x1,y1)R(x1,y1) = 255;counter = counter + 1;fsrRegiongrow(x1,y1,mode);endendend2.3 函数模块2function fsrRegiongrow1(x0,y0,mode)%功能:模拟栈的先进后出思路对⼆值化图像指定连通区域实现区域⽣长%输⼊参数: x0,y0表⽰⽣长点像素坐标,mode表⽰以多⼤邻域进⾏区域⽣长,常取mode = 4;mode = 8;%输出参数: void%作者&时间:奔跑在湘边———2016年5⽉6⽇global R BW counter row colzhan = zeros(row*col,2);%创建栈数组pzhan = 1; %栈计数zhan(pzhan,1) = x0;zhan(pzhan,2) = y0;R(x0,y0) = 255;counter = 1;if 8 == modewhile pzhan > 0x1 = zhan(pzhan,1);%出栈y1 = zhan(pzhan,2);pzhan = pzhan - 1; %栈计数减⼀for i = -1 : 1for j = -1 : 1%⽣长准则:判断⽣长点8邻域内像素的各⾃灰度值是否与⽣长点所在像素灰度值相等if x1+i > 0 && x1+i <= row && y1+j > 0 && y1+j <= col && BW(x1+i,y1+j) == BW(x1,y1) && R(x1+i,y1+j) ~= R(x1,y1) R(x1+i,y1+j) = R(x1,y1);counter = counter + 1;pzhan = pzhan + 1; %栈计数增⼀zhan(pzhan,1) = x1 + i;%⼊栈zhan(pzhan,2) = y1 + j;endendendendelseif 4 == modewhile pzhan > 0x1 = zhan(pzhan,1);y1 = zhan(pzhan,2);pzhan = pzhan - 1;for i = -1 : 2 : 1j = 0;if x1+i > 0 && x1+i <= row && y1+j > 0 && y1+j <= col && BW(x1+i,y1+j) == BW(x1,y1) && R(x1+i,y1+j) ~= R(x1,y1)R(x1+i,y1+j) = R(x1,y1);counter = counter + 1;pzhan = pzhan + 1;zhan(pzhan,1) = x1 + i;zhan(pzhan,2) = y1 + j;endendfor j = -1 : 2 : 1i = 0;if x1+i > 0 && x1+i <= row && y1+j > 0 && y1+j <= col && BW(x1+i,y1+j) == BW(x1,y1) && R(x1+i,y1+j) ~= R(x1,y1)R(x1+i,y1+j) = R(x1,y1);counter = counter + 1;pzhan = pzhan + 1;zhan(pzhan,1) = x1 + i;zhan(pzhan,2) = y1 + j;endendendendend三、说明在基于MATLAB7.11.0(R2010b)平台调⽤函数模块fsrRegiongrow时,MATLAB会弹出如下警告??? Maximum recursion limit of 500 reached. Use set(0,'RecursionLimit',N)to change the limit. Be aware that exceeding your available stack space can crash MATLAB and/or your computer.Error in ==> fsrRegiongrow上述警告表⽰递归次数超出了MATLAB默认值,也就是说待处理的感兴趣连通区域像素个数太多(⼤于500),此时⽤户可以尝试通过提⽰的set函数来修改函数递归次数,但是本⽂通过测试发现如果递归次数超出1591时(不同的平台该值可能不同),MATLAB软件会⾃动⽴即关闭。
matlab区域增长利用regiongrow1函数分MATLAB的regiongrow1函数可以用于进行区域增长操作,它的基本原理是通过将一个或多个种子点的像素值与其周围像素值进行比较,并根据一定的条件判断是否将该像素点加入到当前正在生长的区域中。
具体的使用方法如下:
1. 首先,需要指定用于进行区域增长的种子点。
可以通过手动指定或自动选择种子点的方式来完成这一步骤。
2. 然后,需要设置区域增长的条件。
通常情况下,可以使用像素值的差异或灰度相似度作为判断标准。
比如,可以设置只有像素值与种子点像素值的差异小于某一阈值时才将其加入到当前正在生长的区域中。
3. 最后,需要选择区域增长的方式。
可以选择基于连通性的区域增长或基于阈值的区域增长。
基于连通性的区域增长可以保证生成的区域是封闭的,并且不会包含有连接不上的孤立点。
而基于阈值的区域增长可以生成比较规则的形状,并且可以设置更多的参数来控制增长过程。
总之,MATLAB的regiongrow1函数是一个非常实用的图像处理工具,可以广泛应用于各种领域,比如医学、生物、计算机视觉等。
matlab区域生长函数
MATLAB中的区域生长函数通常用于图像处理,它可以根据预先
设定的条件在图像中自动识别和生长出具有相似特征的区域。
这种
函数可以帮助用户进行分割、特征提取和图像分析等操作。
在MATLAB中,常用的区域生长函数包括`regiongrowing`和
`imsegfmm`等。
`regiongrowing`函数可以根据像素之间的相似性来生长区域。
用户需要提供种子点和生长条件,例如灰度值的相似性或者梯度的
变化等。
该函数会从种子点开始,逐渐将相似的像素加入到区域中,直到满足设定的生长条件为止。
这个函数在处理一些简单的图像分
割任务时非常有用。
另一个常用的区域生长函数是`imsegfmm`,它基于基于快速行
进火焰算法(Fast Marching Method,FMM)进行区域生长。
这个函数可以根据用户提供的种子点和生长条件,利用FMM算法来快速、
高效地生长区域。
它在处理大规模图像和复杂区域分割时具有很好
的效果。
除了这两个函数之外,MATLAB还提供了其他一些用于区域生长
的函数和工具箱,用户可以根据具体的需求选择合适的方法。
在使用区域生长函数时,需要注意调节生长条件、种子点的选择以及对结果进行后处理等步骤,以获得满意的分割效果。
总的来说,MATLAB中的区域生长函数为图像处理提供了强大的工具,可以帮助用户实现自动化的区域分割和特征提取,为后续的图像分析和处理提供了便利。
希望这个回答能够满足你的需求,如果还有其他问题,欢迎继续提问。
Matlab实现区域生长算法
(南京航空航天大学机电学院机械工程系,南京2016年11月1日)摘要:
图像分割不仅是图像处理领域的一个经典的研究主题,也是图像处理技术的热点和焦点。
随着计算机处理技术的发展,图像分割算法引起研究人员越来越多的关注。
本文提出了基于传统的种子区域生长算法的基础上形成一种新的图像自动分割区域的方法。
算法的实现主要基于Matlab编程实现。
关键词:图像分割,种子区域生长算法,Matlab
一、引言
区域生长是一种古老的图像分割方法,最早的区域生长图像分割方法是由Levine等人提出的。
该方法一般有两种方式,一种是先给定图像中要分割的目标物体内的一个小块或者说种子区域(seed point),再在种子区域基础上不断将其周围的像素点以一定的规则加入其中,达到最终将代表该物体的所有像素点结合成一个区域的目的;另一种是先将图像分割成很多的一致性较强,如区域内像素灰度值相同的小区域,再按一定的规则将小区域融合成大区域,达到分割图像的目的,典型的区域生长法如T. C. Pong等人提出的基于小面(facet)模型的区域生长法,区域生长法固有的缺点是往往会造成过度分割,即将图像分割成过多的区域。
区域生长是一种串行区域分割的图像分割方法,其优点是基本思想相对简单,通常能将具有相同特征的联通区域分割出来,并能提供很好的边界信息和分割结果。
在没有先验知识可以利用时,可以取得最佳的性能,可以用来分割比较复杂的图像,如自然景物。
但是,区域生长法是一种迭代的方法,空间和时间开销都比较大,噪声和灰度不均匀可能会导致空洞和过分割,并在对图像中的阴影效果处理上往往不是很好。
区域生长的基本思想是将具有相似性质的像素集合起来构成区域。
具体先对每个需要分割的区域找一个种子像素作为生长的起点,然后将种子像素周围邻域中与种子像素具有相同或相似性质的像素(根据某种事先确定的生长或相似准则来判定)合并到种子像素所在的区域中。
将这些新像素当作新的种子像素继续进行上面的过程,直到再没有满足条件的像素可被包括进来,这样,一个区域就长成了。
区域生长是指从某个像素出发,按照一定的准则,逐步加入邻近像素,当满足一定的条件时,区域生长终止。
区域生长的好坏决定于1.初始点(种子点)的选取。
2.生长准则。
3.终止条件。
区域生长是从某个或者某些像素点出发,最后得到整个区域,进而实现目标的提取。
简单来说下三个法则,对出需要分割的图像:
1、选取图像中的一点为种子点(种子点的选取需要具体情况具体分析)。
2、在种子点处进行8邻域或4邻域扩展,判定准则是:如果考虑的像素与
种子像素灰度值相差的绝对值小于某个门限T,则将该像素包括进种子像素所在的区域。
3、当不再有像素满足加入这个区域的准则时,区域生长停止。
二、理论基础及算法
原理:首先确定每个区域中的某个已知点,加上与已知点相似的邻近点形成一个区域,在这里利用区域的均值。
当邻近点与区域均值的差值的绝对值小于阈值T时,即满足生长条件。
方法是从种子点开始,在8连通方向上生长区域,当其邻近点满足生长条件,则就并入小快区域,当新的点被合并后再用新的区域重复这一过程,直到没有可接受的邻近点时该区域生成过程终止。
设计思路:
1)通过具体观察某幅图像的直方图,估计其确定种子点范围[S1,S2],并确定其阈值T;
2)透过对整幅图像的扫描,找出某个区域的一个种子点:
3)开始利用8连通方向,以该种子点为中心进行生成区域;
4)继续用8连通方向,以该区域为中心,把邻近满足生长条件的点并入,生成新的区域;
5)重复4)步,直到不再存在邻近满足生长条件的点为止,该区域生成过程结束;
6)继续对图像进行扫描,寻找其他区域的一个种子点,按3)~5)的步骤进行4、程序设计
根据下面的流程图可分为
三、Matlab代码实现
其实现函数的内容主要为以下部分:
clc;
clear all;
close all;
image=imread('图片1.bmp');
I=rgb2gray(image);
figure,imshow(I);
I=double(I);
[M,N]=size(I);
[y,x]=getpts; %获得区域生长起始点
x1=round(x); %横坐标取整
y1=round(y); %纵坐标取整
seed=I(x1,y1); %将生长起始点灰度值存入seed中
Y=zeros(M,N); %作一个全零与原图像等大的图像矩阵Y,作为输出图像矩阵
Y(x1,y1)=1; %将Y中与所取点相对应位置的点设置为白场
sum=seed; %储存符合区域生长条件的点的灰度值的和
suit=1; %储存符合区域生长条件的点的个数
count=1; %记录每次判断一点周围八点符合条件的新点的数目
threshold=15; %域值
while count>0
s=0; %记录判断一点周围八点时,符合条件的新点的灰度值之和
count=0;
for i=1:M
for j=1:N
if Y(i,j)==1
if (i-1)>0 && (i+1)<(M+1) && (j-1)>0 && (j+1)<(N+1)
%判断此点是否为图像边界上的点
for u= -1:1
%判断点周围八点是否符合域值条件
for v= -1:1
%u,v为偏移量
if Y(i+u,j+v)==0 && abs(I(i+u,j+v)-seed)<=threshold && 1/(1+1/15*abs(I(i+u,j+v)-seed))>0.8
%判断是否未存在于输出矩阵Y,并且为符合域值条件的点
Y(i+u,j+v)=1;
%符合以上两条件即将其在Y中与之位置对应的点设置为白场
count=count+1;
s=s+I(i+u,j+v);
%此点的灰度之加入s中
end
end
end
end
end
end
end
suit=suit+count; %将n加入符合点数计数器中
sum=sum+s; %将s加入符合点的灰度值总合中seed=sum/suit; %计算新的灰度平均值
end
figure,imshow(Y);
四、实验结果与分析
将图片路径添加到程序中,点击运行获得figure1
注意,图片是要进行处理的,我们可以在Windows自带的画板中进行编辑,将图片改成bmp格式。
1、原图
2、点击figure1任意数字中的白色区域(获得种子)会获得figure2中的四种情况,分别展现出5、6、7、8。
这样一来,程序运行获得成功。
五、总结
此算法运行速度很快,但精确度不够高,因为设置的最小区域值决定了区域分割的准确性,所以会有锯齿状的边缘,这是一个缺点。
同时也可以在此基础上,增添一些其他的算法,例如对彩色图像阈值的分割,这是今后学习中需要进阶和
加强的。
之后在压缩包中将附上源程序以供参考。
六、参考文献
[1] 柯卫,王宏力,袁宇,崔祥祥,陆敬辉. 基于区域生长法的星图中星的提取方法[J]. 传感器与微系统. 2015(12)
2] 王章玉,杨翠微. 基于改进型区域生长法的心脏三维建模的实现[J]. 中国医疗器械杂志. 2014(05)
[3] 严深海,黄贤通,刘洋. 种子区域生长法的改进算法及其在钉螺图像提取中的应用[J]. 韶关学院学报. 2011(10)
[4] 黄谊,任毅. 基于阈值法和区域生长法的图像分割算法研究[J]. 电子测试. 2012(10)
[5] 何晖,余松林,娄亮. 一种基于区域生长法的背景图像斑点提取方法[J]. 光电技术应用. 2008(04)
[6] 周学成,罗锡文. 采用区域生长法分割根系CT图像的改进算法[J]. 农业机械学报. 2006(12)。