区域生长代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.2腐蚀
形态学中的腐蚀操作可以去除图像中小的部分和不相关的细节[5]。比如用边长10的矩形结构取腐蚀图像,则边长小于10的部分和细节都会被消除掉。
腐蚀是为了确定肝的位置。由于肝在腹部脏器中是最大的,因此选择较大的参数进行腐蚀时会将其它的部分(肌肉、其它的脏器)消除腐蚀掉。这样剩下的部分肯定是肝的实质部分。所以用腐蚀的方法可以选到区域生长的种子。而且这样选取种子的方式是完全自动的,选择的种子区域也较大,节省了下一步区域生长的时间。
//生长条件:判断象素(xx,yy)和当前象素(nCurrX,nCurrY)象素值差的绝对值
if ((xx < lmageWidth) && (xx>=0) && (yy<lmageHeight) && (yy>=0) && (*lpDst==255)
&& abs(*lpSrc-*lpSrc1)<nThreshold )
/*************************************************************************
* \函数名称:
* RegionGrow()
*参数:
* LPSTR lpDIBBits -指向源DIB图像指针
* LONG lmageWidth -源图像宽度(象素数,必须是4的倍数)
[导读]提出一种基于区域生长的肝区提取方法。该方法用形态学的方法提取区域生长的种子
摘要:提出一种基于区域生长的肝区提取方法。该方法用形态学的方法提取区域生长的种子,并对区域生长根据肝部形状特点作限制,防止过度生长到其它的器官。实验证明该方法能从和周围脏器灰度值相近的CT图中提取出完整的肝脏,对肝脏的进一步分析有实际意义。
1区域生长的原理
区域生长的基本思想是将具有相似性质的像素集合起来构成区域。具体先对每个需要分割的区域找一个种子像素作为生长起点,然后将种子像素和周围邻域中与种子像素有相同或相似性质的像素(根据某种事先确定的生长或相似准则来判定)合并到种子像素所在的区域中。将这些新像素当作新的种子继续上面的过程,直到没有满足条件的像素可被包括进来。这样一个区域就生长成了[3]。
static int Dy[]={0,1,0,-1};//y向
//临时存放图像数据的指针
LPBYTElpImage;
//指向源图像的指针
unsigned char*lpSrc;
unsigned char*lpSrc1;
//指向要复制区域的指针
unsigned char*lpDst;
//分配内存
lpImage = (LPBYTE) new char[lmageWidth*lmageHeight];
2应用于肝部的区域生长方法
在实际应用区域生长方法时需要解决3个问题:a.如何选择一组能够正确代表所需区域的种子像素;b.如何确定在生长过程中能将相邻像素包括进来的准则;c.如何确定生长终止的条件或规则。
针对这三个问题,我们提出如下的基于区域生长的分割算法(图2):a.阈值分割;b.对分割结果进行腐蚀;c.对腐蚀得到的结果进行生长。
2.3区域生长
从上面的阈值分割我们将待选区域缩小,通过腐蚀又得到了区域生长的种子上一步得到的结果生长可以得到肝区。
生长的规则是:
a.向上下左右四个方向分别生长。
b.当下一点所在区域的平均值小于阈值或者下一点已经属于生长得到的肝区,停止循环。
c.当下一个点所在区域的平均值大于阈值,则将该点加入。
int k ;
//图象的横纵坐标,用来对当前象素的4邻域进行遍历
int xx;
int yy;
while (Start<=End)
{
//当前种子点的坐标
Current.x = GrowX[Start];
Current.y = GrowY[Start];
//对当前点的4邻域进行遍历
for (k=0; k<4; k++)
}
//定义堆栈,分别存贮X Y坐标
int * GrowX ;
int * GrowY ;
//分配空间,最大为图像的像素数目
GrowX = new int [ lmageWidth * lmageHeight];
GrowY = new int [ lmageWidth * lmageHeight];
//定义堆栈的起点和终点
//释放内存
delete[] lpImage;
delete[] GrowX;
delete[] GrowY;
//返回
return TRUE;
}
基于区域生长的肝区提取算法
www.chinaqking.com 期刊门户-中国期刊网2009-2-16来源:《黑龙江科技信息》2008年9月上供稿文/刘维华 张晓峰
*本函数的处理结果是将生长后的区域表示为黑色像素,未生长区域表示为白色像素。
*区域生长一般包含三个比较重要的问题:
*1.种子点的选取
*2.生长准则
*3.终止条件
*可以认为,这三个问题需要具体分析,而且每个问题解决的好坏直接关系到
*区域生长的结果。
*************************************************************************/
//当Start=End,表示堆栈中只有一个点
int Start ;
int End ;
//初始化
Start = 0 ;
End = 0 ;
//把种子点的坐标压入栈
GrowX[End] = seed.x;
GrowY[End] = seed.y;
//当前正在处理的象素
CPoint Current;
//循环控制变量
BOOL RegionGrow(LPSTR lpDIBBits, LONG lmageWidth, LONG lmageHeight, int nThreshold,int seedx,int seedy,int mode)
{
//设置用于处理四临域的数组
static int Dx[]={-1,0,1,0};//X向
lpSrc1 = (unsigned char *)lpDIBBits + lmageWidth * (lmageHeight-Current.y) + Current.x;
//指向目标图像第j行,第i个象素的指针
lpDst = (unsigned char *Байду номын сангаасlpImage + lmageWidth * (lmageHeight-yy) + xx;
{
//堆栈的尾部指针后移一位
End++;
//象素(xx,yy)压入栈
GrowX[End] = xx;
GrowY[End] = yy;
//目标图像为黑点,同时也表明该象素处理过
*lpDst=0 ;
}
}
Start++;
}
//复制区域生长后的图像
memcpy(lpDIBBits, lpImage, lmageWidth * lmageHeight);
图1给出已知种子点进行区域生长的一个示例。图1(a)给出需要分割的图像,设已知两个种子像素(标为深浅不同的灰色方块),现要进行区域生长。设这里采用的判定准则是:如果考虑的像素与种子像素灰度值差的绝对值小于某个门限T,则将该像素包括进种子像素所在的区域。图1(b)给出了T=3时的区域生长结果,整幅图被较好地分成2个区域;图1(c)给出了T=1时的区域生长结果,有些像素无法判定;图1(c)给出了T=6时的区域生长的结果,整幅图都被分在一个区域中了。由此可见门限的选择是很重要的[3]。
//种子点
CPoint seed;
if(mode==0) //如果选择种子点为图像的中心
{
//设置种子点为图像的中心
seed.x=lmageWidth/2;
seed.y=lmageHeight/2;
}
else //自己设置种子点
{
//设置种子点为输入点
seed.x=seedx;
seed.y=seedy;
关键词:肝区提取;区域生长;形态学
Abstract:In this paper, an algorithm is proposed to extracting the liver region. The algorithm uses the morphologic method to extract the seed of the region growth algorithm. In order to prevent growing to other viscera, the algorithm restricts the region growth algorithm base on the shape of the liver. It is proved to be useful that extracting the liver from abdomen CT images. In these CT images, the CT values of most viscera are close to each other. So this algorithm is useful for father analyzing the liver.
//判断是否内存分配失败
if (lpImage == NULL)
{
//分配内存失败
return FALSE;
}
//将目标图像所有像素初始化为白点
lpDst = (unsigned char *)lpImage;
memset(lpDst, (BYTE)255, lmageWidth * lmageHeight);
Key words:Extracting liver; Region Growth; Morphologic Algorithm
引言
肝癌是我国常见的恶性肿瘤之一,是我国位居第二的癌症“杀手”,常见于中年男性。因其恶性度高、病情进展快,病人早期一般没有什么不适,一旦出现症状就诊,往往已属中晚期。故治疗难度大、疗效差,一般发病后生存时间仅为6个月,人称“癌中之王”。所以,及早发现是相当重要的。尤其是小肝癌的及早发现,可以说就是挽救了一条生命。所谓小肝癌是指单个癌结节最大直径不超过3厘米或两个癌结节直径相加不超过3厘米的肝癌。
{
// 4邻域象素的坐标
xx = Current.x+Dx[k];
yy = Current.y+Dy[k];
//判断象素(xx,yy)是否在图像内部
//判断象素(xx,yy)是否已经处理过
// *lpDst==255表示还没有处理
//指向源图像(xx,yy)象素的指针
lpSrc = (unsigned char *)lpDIBBits + lmageWidth * (lmageHeight-yy) + xx;
CT检查是发现小肝癌的重要影像学诊断手段,目前CT已经可以检测到1cm以下的肿瘤。然而一个病人的CT图像要有几十幅,这给影像师造成了很大的负担。为了检测这些图像,影像师常常精疲力竭,错检、漏检就在所难免。
文献[1]中Y Lee等人提出用模板匹配的方法检测肺部的结节,但是他们的匹配是基于像素的,因此需要消耗大量的时间。减少检测时间的方法有两类:一类是加快算法本身的速率,比如将算法从基于点改为基于块,一类是缩小检测区域,这里比较常用的就是提取出所要检测的区域,重点计算。文献[2]中Chan TF等人用动态曲线(Active Contours)的方法来提取肺部用阈值的方法来提取肺部,以达到快速检测肺部结节的目的。然而肝部和肺部的CT图像有很大的不同,肺部CT值区分较明显,肝部所在的腹部的脏器的CT值比较接近,因此很难用一种单一的方法来提取肝区。经过实验比较,本文提出一种基于区域生长的提取方法。
* LONG lmageHeight -源图像高度(象素数)
*int nThreshold-区域生长门限
*int seedx-区域生长种子的横坐标
*int seedy-区域生长种子的纵坐标
*int mode-区域生长种子的选取类型
*返回值:
* BOOL -运算成功返回TRUE,否则返回FALSE。
* \说明:
2.1阈值分割
阈值分割是有效减少检测区域的方法,该方法简单,在整个算法流程中用作提取肝区的第一步。
观察腹部CT图的直方图我们发现它是一个多峰的图形。肝部的CT值分布处于右边第二个峰(即CT值处于100到200间的峰,峰值出现点会因为设备、病人个体的不同而不同),如图3所示。肝是腹部最大的器官,它会在直方图中体现为一个峰值,即图3(b)中间的峰值点,所以我们取该峰的左右谷点作为阈值。
相关文档
最新文档