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

📄 func.c

📁 这是今年ADI大赛我参与的另一个获奖的项目列缝检测仪的源文件
💻 C
📖 第 1 页 / 共 4 页
字号:
						{
							pImage[i*nWidth+j]=pImage[(i+1)*nWidth+j-1];//对此点加与左上相同的标识
						}

						else
							if(pImage[i*nWidth+j-1]>0)//如果与左前为已标识的目标点
							{
								pImage[i*nWidth+j]=pImage[i*nWidth+j-1];//对此点加与左前相同的标识
							}

							else//如果都不相同,则建立新标识N=N-1
							{
								N=N-1;
								pImage[i*nWidth+j]=N;//新区域的像素灰度为N-1
								count++;
							}
			}
		}
	}
	/////////////////////////////////////////////////////////////////////

	for(i=m;i>=nHeight/2-nNum;i--)
	{
		for(j=LEFTSIDE;j<RIGHTSIDE;j++)
		{
			if((pImage[i*nWidth+j]>0)&&   //如果有符合条件的像素点
				(pImage[(i+1)*nWidth+j+1]>0)&&
				(pImage[i*nWidth+j-1]>0)&&
				(pImage[(i+1)*nWidth+j+1]!=pImage[i*nWidth+j-1]))
			{
				U=pImage[i*nWidth+j-1];
				V=pImage[(i+1)*nWidth+j+1];
				for(x=m;x>=nHeight/2-nNum;x--)
					for(y=LEFTSIDE;y<RIGHTSIDE;y++)
					{
						if(pImage[x*nWidth+y]==U)
							pImage[x*nWidth+y]=V;  //合并区域
					}
				count--;           //区域数目减一
			}
		}
	} 
	/////////////////////////////////////////////////////////////////////

	return count; //返回标记区域数目
}

/*****************************************************************************/
//函数名称:SmallArea()
//功能:小面积区域消去
//参数:
//		unsigned char *pImage 图像数据指针
//		int nWidth, int nHeight 图象宽度、高度
//		int TArea 消去门限
//		int nNum 标记时,垂直方向图像中线上下截取的图像高度
//返回值:int 剩余区域数目
/*****************************************************************************/
int SmallArea(unsigned char *pImage, int nWidth, int nHeight, int TArea, int nNum)
{
	int i,j;
	int count;           
	int num;             //记录区域数目
	int N;
	int mark[255]={0};   	//mark[]为区域统计的结果
	int T;               //T为小区域消去的门限
	T = TArea;

	//////////////////////////////////////////////////////
	for(i=nHeight/2-nNum;i<nHeight/2+nNum;i++) 	//遍历图像,进行区域统计,mark[i]的值
	{					  					//代表灰度为i的区域的面积			
		for(j=LEFTSIDE;j<RIGHTSIDE;j++)
		{
			if(pImage[i*nWidth+j]>0)
			{
				N=pImage[i*nWidth+j];
				mark[N]++;
			}
		}
	}
	///////////////////////////////////////////////////////////////
	num=0;                //统计大于门限的区域数目
	for(N=0;N<255;N++)
	{
		if(mark[N]>T)
			num++;
	}
	///////////////////////////////////////////////////////////////
	count=0;              //遍历统计结果,将低于门限T的区域置为背景色             
	for(N=0;N<255;N++)
	{
		if(mark[N]<T)  
		{
			for(i=nHeight/2-nNum;i<nHeight/2+nNum;i++)
			{
				for(j=LEFTSIDE;j<RIGHTSIDE;j++)
				{
					if(pImage[i*nWidth+j]==N)
						pImage[i*nWidth+j]=0;
				}
			}
		}
		if(mark[N]>count)
			count=mark[N]; //记录最大区域的面积数
	}
	////////////////////////////////////////////////////////////////
	for(i=nHeight/2-nNum;i<nHeight/2+nNum;i++)  //将大于门限的区域灰度置为255
		for(j=LEFTSIDE;j<RIGHTSIDE;j++)
			if(pImage[i*nWidth+j]>0)
				pImage[i*nWidth+j]=255;
	////////////////////////////////////////////////////////////////

	return num;	//返回剩余区域数
}

/*****************************************************************************/
//函数名称:Ruler()
//功能:在图像中间加上标尺显示
//参数:
//		unsigned char *pImage 图像数据指针
//		int nWidth, int nHeight 图象宽度、高度
//		int nY 标尺中心位置的Y坐标
//		int nNum 标尺中心位置上下所截取的行数
//返回值:无
/*****************************************************************************/
void Ruler(unsigned char *pImage, int nWidth, int nHeight, int nY, int nNum)
{
	int i,j;
	for(i=nY-nNum; i<=nY+nNum; i++)
	{
		for(j=LEFTSIDE/2; j<RIGHTSIDE/2; j++)
		{	
			
				pImage[i*nWidth*3+j*3]   = 255-pImage[i*nWidth*3+j*3];		
				pImage[i*nWidth*3+j*3+1] = 255-pImage[i*nWidth*3+j*3+1];				
				pImage[i*nWidth*3+j*3+2] = 255-pImage[i*nWidth*3+j*3+2];
		}
	}
/*	for(i=100; i<nHeight-100; i++)
	{
		if(pImage[i*nWidth+nWidth/2] > 50)
			pImage[i*nWidth+nWidth/2] = 0;
		else
			pImage[i*nWidth+nWidth/2] = 255;
	}
	*/
		
}

/*****************************************************************************/
//函数名称:tag(unsigned char *pImage, int nWidth, int nHeight,int nLeftX, int nUpY, int nRightX, int nDownY, unsigned char R,unsigned char G,unsigned char B)
//功能:在图像指定的矩形区域显示指定颜色标签
//参数:
//		unsigned char *pImage 图像数据指针
//		int nWidth, int nHeight 图象宽度、高度
//		int nLeftX, int nUpY:图像左上角
//`		int nRightX, int nDownY:图像右下角
//		unsigned char R,unsigned char G,unsigned char B :图像颜色
//返回值:无
/*****************************************************************************/
void Tag(unsigned char *pImage, int nWidth, int nHeight,int nLeftX, int nUpY, int nRightX, int nDownY, unsigned char R,unsigned char G,unsigned char B)
{
	int i,j;
	for(i=nUpY+22; i<=nDownY+22; i++)
	{
		for(j=nLeftX; j<nRightX; j++)
		{	
			
				pImage[i*nWidth*3+j*3]   = R;		
				pImage[i*nWidth*3+j*3+1] = G;				
				pImage[i*nWidth*3+j*3+2] = B;
		}
	}		
}

/*****************************************************************************/
//函数名称:WidthCal()
//功能:裂纹宽度计算
//参数:
//		unsigned char *pImage 图像数据指针
//		int nWidth, int nHeight 图象宽度、高度
//		int nY 统计宽度中心的Y坐标
//		int nNum 统计中心上下所截取的行数
//返回值:int 宽度计算结果
/*****************************************************************************/
int WidthCal(unsigned char *pImage, int nWidth, int nHeight, int nY, int nNum)
{
	int i,j;
	int nLineWidth[IMAGEHEIGHT];	//整形数组,用于存放每行宽度
	int nLeft, nRight;					//左边界点,右边界点
	
	int nPartCount;					//宽度总数  
	int nAvgPart;						//每段的平均宽度
	
	for(i=nY-nNum; i<=nY+nNum; i++)
	{
		int nTempWidth=0;
		for(j=LEFTSIDE; j<RIGHTSIDE; j++)
		{
			if(pImage[i*nWidth+j] == 255 &&
				pImage[i*nWidth+j+1] == 255 &&
				pImage[i*nWidth+j-1] != 255 )
			{
				nLeft = j;
			}
			
			if(pImage[i*nWidth+j] == 255 &&
				pImage[i*nWidth+j-1] == 255 &&
				pImage[i*nWidth+j+1] != 255 )
			{
				nRight = j;
				if(nTempWidth < (nRight - nLeft))
					nTempWidth = nRight - nLeft;
			}
		}
		nLineWidth[i-(nY-nNum)] = nTempWidth;
	}
	
	nPartCount = 0;
	for(i=0; i<=2*nNum; i++)
	{
		nPartCount += nLineWidth[i];
	}
	nAvgPart = nPartCount/(2*nNum+1);
	
	
	//将测量部分置成灰色
	for(i=nY-nNum; i<=nY+nNum; i++)
	{
		for(j=0; j<nWidth; j++)
		{	
			if(pImage[i*nWidth+j] == 255)
				pImage[i*nWidth+j] = 50;
		}
	}		
	

⌨️ 快捷键说明

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