Matlab实现区域生长算法

合集下载

admm算法matlab代码

admm算法matlab代码

admm算法matlab代码ADMM算法(Alternating Direction Method of Multipliers)是一种用于解决凸优化问题的迭代算法。

它通过将原问题转化为一系列子问题,并通过交替更新变量的方式逐步逼近最优解。

本文将介绍ADMM算法的基本原理,并给出其在MATLAB中的代码实现。

ADMM算法的基本原理是通过引入拉格朗日乘子,将原问题转化为一系列子问题。

假设我们要求解的原问题为:minimize f(x) + g(z)subject to Ax + Bz = c其中,f(x)和g(z)是凸函数,A和B是已知矩阵,c是已知向量。

ADMM算法的目标是找到x和z的最优解。

首先,我们将原问题转化为增广拉格朗日函数:L(x, z, y) = f(x) + g(z) + y^T(Ax + Bz - c) + (ρ/2) ||Ax + Bz - c||^2其中,y是拉格朗日乘子,ρ是正则化参数。

然后,ADMM算法通过交替更新x、z和y来逐步逼近最优解。

具体的更新步骤如下:1. 更新x:固定z和y,求解以下最小化问题:x^(k+1) = argmin f(x) + (ρ/2) ||Ax + Bz^k - c + (1/ρ)y^k||^22. 更新z:固定x和y,求解以下最小化问题:z^(k+1) = argmin g(z) + (ρ/2) ||Ax^(k+1) + Bz - c + (1/ρ)y^k||^23. 更新y:根据拉格朗日乘子更新规则,更新y:y^(k+1) = y^k + ρ(Ax^(k+1) + Bz^(k+1) - c)4. 判断终止条件:如果满足终止条件,则停止迭代;否则,返回步骤1。

下面是ADMM算法在MATLAB中的代码实现:```matlabfunction [x, z] = admm_algorithm(A, B, c, f, g, rho, max_iter, tol)% 初始化变量[m, n] = size(A);x = zeros(n, 1);z = zeros(n, 1);y = zeros(m, 1);% 迭代更新for iter = 1:max_iter% 更新xx = argmin(@(x) f(x) + (rho/2) * norm(A*x + B*z - c +(1/rho)*y)^2, x);% 更新zz = argmin(@(z) g(z) + (rho/2) * norm(A*x + B*z - c +(1/rho)*y)^2, z);% 更新yy = y + rho * (A*x + B*z - c);% 判断终止条件if norm(A*x + B*z - c) < tolbreak;endendendfunction argmin_val = argmin(func, x0)options = optimoptions('fminunc', 'Display', 'off');argmin_val = fminunc(func, x0, options);end```在使用该代码时,需要提供A、B、c、f、g等参数,并设置最大迭代次数和终止条件的容差。

区域生长算法

区域生长算法

区域生长算法
区域生长算法是一种基于像素邻域信息的图像分割算法,其主要
思想是从一些像素点的种子点出发,逐渐地将与其相邻的像素点合并
成一个区域,在合并过程中保持一定的相似性和连通性。

这种算法在
图像分割领域中有着广泛的应用,例如医学图像分析、自然图像分割
和计算机视觉等。

区域生长算法的实现过程包括以下几个步骤:首先设置像素种子点,然后从这些种子点出发进行区域生长。

在生长的过程中,使用一
定的相似性准则来判断当前像素是否属于当前区域,这些准则包括灰
度相似度、颜色相似度、纹理相似度等。

如果当前像素属于当前区域,那么将其合并到当前区域;如果不属于当前区域,则继续向周围的像
素进行探索。

直到所有与种子像素相邻的像素都被合并到当前区域中
为止,这个区域的生长过程就结束了,同时,这个区域成为了一个独
立的像素集合。

区域生长算法的优势在于其快速、准确和可靠等特点,能够对图
像中的目标进行精确的分割和识别。

尽管这种算法存在一些缺陷,例
如对于噪声和纹理差异较大的图像存在一定的局限性,但是区域生长
算法已经成为了目前图像分割领域中最具潜力的算法之一,并且得到
了广泛的研究和应用。

使用MATLAB进行图像分割的步骤

使用MATLAB进行图像分割的步骤

使用MATLAB进行图像分割的步骤图像分割是一种将图像划分为具有独立意义的不同区域的技术。

它在计算机视觉、模式识别、医学影像等领域具有广泛的应用。

MATLAB作为一种强大的编程语言和开发环境,为图像处理提供了丰富的功能和工具。

本文将介绍使用MATLAB进行图像分割的步骤。

一、图像预处理在进行图像分割之前,通常需要对图像进行预处理。

预处理的目的是消除图像中的噪声和无关信息,以提高分割的准确性和效果。

常见的图像预处理步骤包括:1. 图像灰度化:将彩色图像转换为灰度图像,简化处理过程。

2. 图像滤波:使用滤波器去除图像中的噪声,如中值滤波器、高斯滤波器等。

3. 图像增强:增强图像的对比度和清晰度,以便更好地分割图像。

二、阈值分割阈值分割是最常用和简单的图像分割方法之一。

它基于图像中像素灰度值与阈值之间的关系,将像素分为前景和背景。

使用MATLAB进行阈值分割的步骤如下:1. 选择合适的阈值:通过观察图像直方图和图像特性,选择一个适合的阈值。

2. 阈值分割:将图像中的像素根据阈值进行分类,得到分割后的图像。

三、基于边缘的分割边缘是图像中物体和背景之间的边界,通过检测边缘可以达到图像分割的目的。

使用MATLAB进行基于边缘的分割的步骤如下:1. 图像梯度计算:通过计算图像中每个像素的梯度值,得到图像中每个点的边缘强度。

2. 边缘检测:使用一些经典算法(如Sobel算子、Canny算子)进行边缘检测,得到图像中的边缘。

3. 边缘连接:根据边缘的连接关系,将分散的边缘点连接成连续的边缘线。

四、区域生长分割区域生长分割是一种基于相似性的分割方法,它将相似的像素点合并成具有相同属性的区域。

使用MATLAB进行区域生长分割的步骤如下:1. 种子点选择:选择适当的种子点,作为区域生长的起始点。

2. 区域生长:从种子点开始,逐渐将相邻像素合并到同一区域中,直到满足预设的停止条件。

五、基于聚类的分割聚类是一种将数据划分为不同组别的方法,也可以用于图像分割。

9.5.2 区域分裂与合并及其Matlab实现[共5页]

9.5.2 区域分裂与合并及其Matlab实现[共5页]

第9章 图 像 分 割– 373 – { return; } // 返回bThre = dlgPara->m_bThre; // 获取用户设定的阈值delete dlgPara; // 删除对话框imgInput.RegionGrow(&imgOutput, point.x, point.y, bThre); //执行区域生长 break;default:AfxMessageBox((LPCTSTR)"错误的参数设置,检查设定的服务参数");}pDoc->m_Image = imgOutput;读者可以通过光盘中示例程序DIPDemo 中的菜单命令“图像分割→区域生长”来观察处理效果。

执行此命令时,需要双击图像中的某点以给定生长起始点,并给出阈值参数。

9.5.2 区域分裂与合并及其Matlab 实现区域生长是从一组生长点开始的,另一种方法是在开始时将图像分割为一系列任意不相交的区域,然后将它们合并或者拆分以满足限制条件,这就是区域分裂与合并。

通过分裂,可以将不同特征的区域分离开,而通过合并,可以将相同特征的区域合并起来。

1.区域分裂与合并算法(1)分裂令R 表示整个图像区域,P 代表某种相似性准则。

一种区域分裂方法是首先将图像等分为4个区域,然后反复将分割得到的子图像再次分为4个区域,直到对任意R i ,P (R i )=TRUE ,表示区域R i 已经满足相似性准则(譬如说该区域内的灰度值相等或相近),此时不再进行分裂操作。

如果P (R i )=FALSE ,则将R i 分割为4个区域。

如此继续下去,直到P (R i )=TRUE 或者已经到单个像素。

这个过程可以用四叉树形式表示,如图9.21所示。

(a )被分割的图像 (b )对应的四叉树图9.21 四叉树算法示意图 其中图(a )中未标出的4个区域分别为R 411、R 412 、R 413和R 414。

Matlab程序遗传算法大津法区域生长法迭代法分割图像

Matlab程序遗传算法大津法区域生长法迭代法分割图像

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在医学信号处理中的应用示例

Matlab在医学信号处理中的应用示例

Matlab在医学信号处理中的应用示例引言:医学信号处理是指将医学上获得的各种生理信号通过数字信号处理技术进行分析、提取和处理,以获取有关患者生理状态的信息。

随着计算机技术的快速发展,Matlab作为一种功能强大的数学软件,被广泛应用于医学信号处理领域。

本文将介绍几个Matlab在医学信号处理中的应用示例,以展示其在该领域具有的潜力和优势。

一、脑电图(EEG)信号处理脑电图是记录脑电活动的一种生理信号。

通过分析和处理脑电图信号,可以了解脑功能、疾病和药物对脑的影响等。

Matlab提供了丰富的信号处理工具箱,可以对脑电图信号进行不同的处理和分析。

1.1 频率分析频率分析是脑电图信号处理中常用的方法之一。

通过使用Matlab的快速傅里叶变换(FFT)函数,可以将时域的脑电图信号转换为频域的频谱图,以便观察信号中不同频率成分的分布情况。

这种分析可以用于检测脑电信号中的异常频率成分,如癫痫发作。

1.2 时频分析时频分析是将频谱分析应用于时变信号的一种方法。

在脑电图信号处理中,时频分析可以用于研究不同频率成分在不同时间上的变化情况,以揭示潜在的脑电活动。

Matlab提供了多种时频分析工具,如连续小波变换(CWT),可以帮助研究人员进一步了解脑电信号的特性。

二、心电图(ECG)信号处理心电图是记录心脏电活动的一种生理信号。

通过对心电图信号进行处理和分析,可以帮助医生判断心脏功能和诊断心脏疾病。

Matlab在心电图信号处理中具有广泛的应用。

2.1 心率变异性(HRV)分析心率变异性是描述心率时间间隔变化的一项重要指标。

通过使用Matlab的HRV工具箱,可以计算出心电图信号的各种HRV参数,如标准差、频域参数等。

这些参数可以用于评估心脏自律性、心脏功能异常以及对心脏疾病的治疗效果等。

2.2 心电图滤波心电图信号通常存在噪声,并且与心脏电活动重叠,因此需要对信号进行滤波处理。

Matlab中提供了多种滤波器设计方法和滤波函数,可以帮助去除心电图信号中的噪声,并提取出心脏电活动的有效信息。

区域生长算法(附MATLAB代码实现)

区域生长算法(附MATLAB代码实现)

区域⽣长算法(附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函数分

matlab区域增长利用regiongrow1函数分MATLAB的regiongrow1函数可以用于进行区域增长操作,它的基本原理是通过将一个或多个种子点的像素值与其周围像素值进行比较,并根据一定的条件判断是否将该像素点加入到当前正在生长的区域中。

具体的使用方法如下:
1. 首先,需要指定用于进行区域增长的种子点。

可以通过手动指定或自动选择种子点的方式来完成这一步骤。

2. 然后,需要设置区域增长的条件。

通常情况下,可以使用像素值的差异或灰度相似度作为判断标准。

比如,可以设置只有像素值与种子点像素值的差异小于某一阈值时才将其加入到当前正在生长的区域中。

3. 最后,需要选择区域增长的方式。

可以选择基于连通性的区域增长或基于阈值的区域增长。

基于连通性的区域增长可以保证生成的区域是封闭的,并且不会包含有连接不上的孤立点。

而基于阈值的区域增长可以生成比较规则的形状,并且可以设置更多的参数来控制增长过程。

总之,MATLAB的regiongrow1函数是一个非常实用的图像处理工具,可以广泛应用于各种领域,比如医学、生物、计算机视觉等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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)。

相关文档
最新文档