⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 binlabel.txt

📁 医学图象处理系统
💻 TXT
字号:
	//区域标记的程序,对大块区域有效  18:53 99/11/19
	int i, j, k, l;  // 常用循环变量 
	int Nowx, Nowy;  // 当前的图像坐标位置
	int PixelNum;    // 记录递归的次数
	int Neighbor;    // 邻域点的个数
	int AreaLabel= 1;// 标记的值
	
    BYTE **S_RowAddress = new BYTE*[imgH]; //定义指向图像数据每行行首的地址,用来加快运算速度
	BYTE GLabel;    // 记录邻域中像素点的标记值
	
	//给指向图像数据每行行首的地址赋值
	S_RowAddress[0] = image;
	for(i=1 ; i<imgH ;i++)
	{
		S_RowAddress[i] = S_RowAddress[i-1] + imgW;
	}

    BOOL GrassOk     = false; //定义递归调用是否成功的标志位

	for(i=0; i<imgW; i++)
	{
		for(j=0; j<imgH; j++)
		{
			// 如果是目标点,则继续,否则进行下一次循环
			if(S_RowAddress[j][i] != TargetGray) continue;

			//判断当前点邻域内是否有标记过的点
			Neighbor = PixelNum = 0;
			for(k=-1; k<=1; k++)
			{
				for(l=-1; l<=1;  l++)
				{
					Nowx = i + k;
					Nowy = j + l;
					//防止指针越界
					if( Nowx >= 0 && Nowx < imgW && 
						Nowy >= 0 && Nowy < imgH && 
						S_RowAddress[Nowy][Nowx] > 0 && 
						S_RowAddress[Nowy][Nowx] < 255 )
					{
						// 如果该点的邻域有标记过的点,
						// 则Neighbor加1,并将该标记值
						// 记录在变量GLabel
 						GLabel = S_RowAddress[Nowy][Nowx];
						Neighbor++;
					}
				}
			}//*/
			
			// 如果该点的邻域有标记过的点, 
			// 则仍然用该标记值从当前点开始进行标记
			// 否则使用新的标记值
			if(Neighbor)
			{
				GrassOk = Image_Binary_grass( S_RowAddress, imgW, imgH, 
					      TargetGray, i, j, GLabel, PixelNum);
			}
			else//*/
			{	
				px = i, py = j;
				do 
				{
					Neighbor = PixelNum = 0;
					for(k=-1; k<=1; k++)
					{
						for(l=-1; l<=1;  l++)
						{
							Nowx = px + k;
							Nowy = py + l;
							//防止指针越界
							if( Nowx >= 0 && Nowx < imgW && 
								Nowy >= 0 && Nowy < imgH && 
								S_RowAddress[Nowy][Nowx] > 0 && 
								S_RowAddress[Nowy][Nowx] < 255 )
							{
								// 如果该点的邻域有标记过的点,
								// 则Neighbor加1,并将该标记值
								// 记录在变量GLabel
 								GLabel = S_RowAddress[Nowy][Nowx];
								Neighbor++;
							}
						}
					}//*/
					if( Neighbor )
						GrassOk = Image_Binary_grass( S_RowAddress, imgW, imgH, 
								  TargetGray, px, py, GLabel, PixelNum);
					else
						GrassOk = Image_Binary_grass( S_RowAddress, imgW, imgH, 
								  TargetGray, px, py, AreaLabel, PixelNum);

					//如果标记成功,则标记值加1
				} while( !GrassOk );
				//if(GrassOk) 
				if( GrassOk )  AreaLabel++;
			}

			// 如果标记的区域大于253个,返回
			if(AreaLabel >= 255) 
			{
				if(S_RowAddress!=NULL) delete []S_RowAddress;
				return 254;
			}
		}
	}    
	// 收回分配的内存
	if(S_RowAddress!=NULL)  delete []S_RowAddress;
	// 返回标记的区域的数目
	return AreaLabel == 1  ?  GrassOk : AreaLabel - 1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -