www.pudn.com > roadextr.rar > imgp.cpp


#include	"stdafx.h" 
#include	"valdef.h" 
#include	"DefValue.h" 
#include	"imgp.h" 
#include	 
#include	 
 
/*//////////////////////////////////////// 
	经典图象处理算法集,标准c 
1999.4 
/////////////////////////////////////////*/ 
/* 
	线条图形短缺处理:缝隙连接 
*/ 
 
void	ConnectGap(unsigned char *pucImg,int	nRow,int nCol,int	nLen) 
{	int	ix,iy,gx,gy,leng,crn,k,gray,x1,y1,x2,y2,s,t,xd,yd,xx,yy; 
	int	naname,ddmin,dd,n[10],xmin,ymin,m1,m2; 
	unsigned char	*oi; 
 
	oi=(unsigned char	*)malloc(nRow*nCol*sizeof(unsigned char)); 
	if(!oi) 
		return; 
	for(iy=0;iy0) 
			{	*(oi+iy*nCol+ix)=10;	continue;	} 
			if(*(oi+(iy+1)*nCol+ix)>0) 
			{	*(oi+iy*nCol+ix)=20;	continue;	} 
			if(*(oi+(iy+1)*nCol+ix+1)>0) 
			{	*(oi+iy*nCol+ix)=30;	continue;	} 
			if(*(oi+(iy)*nCol+ix+1)>0) 
			{	*(oi+iy*nCol+ix)=40;	continue;	} 
			if(*(oi+(iy-1)*nCol+ix+1)>0) 
			{	*(oi+iy*nCol+ix)=50;	continue;	} 
			if(*(oi+(iy-1)*nCol+ix)>0) 
			{	*(oi+iy*nCol+ix)=60;	continue;	} 
			if(*(oi+(iy-1)*nCol+ix-1)>0) 
			{	*(oi+iy*nCol+ix)=70;	continue;	} 
			if(*(oi+(iy)*nCol+ix-1)>0) 
			{	*(oi+iy*nCol+ix)=80;	continue;	} 
		} 
	/*	fill the gap	*/ 
	do 
	{	t=0; 
		for(iy=0;iy=10) 
				{	m1=*(oi+iy*nCol+ix); 
					y1=iy;	x1=ix; 
					iy=nRow+1;	ix=nCol+1; 
					t=1; 
					continue; 
				} 
			} 
		if(t==0) 
			break; 
		if(t==1) 
		{	s=0; 
			for(iy=y1;iy<=y1+nLen;y1++) 
			{	if(iy<0||iy>=nRow) 
					continue; 
				for(ix=x1-nLen;ix<=x1+nLen;ix++) 
				{	if(ix<0||ix>=nCol) 
						continue; 
					if(*(oi+iy*nCol+ix)<10) 
						continue; 
					m2=*(oi+iy*nCol+ix); 
					y2=iy;	x2=ix; 
 
					if(y1<=y2&&x1<=x2) 
						naname=1; 
					else 
						naname=2; 
					if(naname==2) 
					{	if((m1==40||m1==50||m1==60) 
						&&(m2==80||m2==10||m2==20)) 
						{	s=1; 
							iy=y1+nLen+1;	ix=x1+nLen+1; 
							continue; 
						} 
						if((m1==60||m1==70||m1==80) 
						&&(m2==20||m2==30||m2==40)) 
						{	s=1; 
							iy=y1+nLen+1;	ix=x1+nLen+1; 
							continue; 
						} 
						if((m1==40||m1==50||m1==60) 
						&&(m2==80||m2==10||m2==20)) 
						{	s=1; 
							iy=y1+nLen+1;	ix=x1+nLen+1; 
							continue; 
						} 
 
					} 
					if(s==1) 
					{	*(oi+y1*nCol+x2)=2;	*(oi+y2*nCol+x2)=2; 
						do 
						{	ddmin=(y1-y2)*(y1-y2)+(x1-x2)*(x1-x2); 
							ymin=y1;	xmin=x1; 
							for(yd=-1;yd<=1;yd++) 
								for(xd=-1;xd<=1;xd++) 
								{	if(yd==0&&xd==0) 
										continue; 
									yy=y1+yd;	xx=x1+xd; 
									dd=(yy-y2)*(yy-y2)+(xx-x2)*(xx-x2); 
									if(dd2); 
					} 
				} 
			} 
		} 
	 
	}while(1); 
 
	for(iy=0;iy0) 
				*(pucImg+iy*nCol+ix)=0; 
			else if(*(oi+iy*nCol+ix)==0) 
				*(pucImg+iy*nCol+ix)=255; 
		} 
 
	free(oi); 
} 
/* 
Hough transformation for circle detection 
*/ 
//int		HoughElipse(unsigned char *pucImg,int	nRow,int nCol) 
/* 
*/ 
int		HoughCircle(unsigned char *pucImg,int	nRow,int nCol, 
					int	nX0Max,int	nX0Min,int	nY0Max,int	nY0Min, 
					int	nMaxR,int	nMinR,int	*pOutput,float	fE) 
{	long	x,y,nRCMax,nXYMax,x0,y0,r; 
	long	XCMax,YCMax; 
	int		*pnX0Y0R,VV; 
	long	v; 
	 
	XCMax=nX0Max-nX0Min; 
	YCMax=nY0Max-nY0Min; 
	nRCMax=nMaxR-nMinR; 
	pnX0Y0R=(int	*)malloc(XCMax*YCMax*nRCMax*sizeof(int)); 
	if(!pnX0Y0R) 
		return	-1; 
	for(v=0;v=-fE) 
							*(pnX0Y0R+y0*(XCMax*nRCMax)+x0*nRCMax+r)+=1; 
					} 
				} 
			} 
		} 
	VV=0; 
	for(y0=0;y0VV) 
				{	VV=*(pnX0Y0R+y0*(XCMax*nRCMax)+x0*nRCMax+r); 
					*(pOutput+0)=y0+nY0Min; 
					*(pOutput+1)=x0+nX0Min; 
					*(pOutput+2)=r+nMinR; 
				} 
			} 
		} 
	} 
 
	free(pnX0Y0R); 
	return	1; 
} 
/* 
	简单阈值二值化 
*/ 
void	BinByThresh(unsigned char *pucImg,int	nRow,int nCol,int nThresh)  
{	int	r,c; 
 
	for(r=0;rnThresh) 
				 
		//	if(*(pucImg+r*nCol+c)>nThresh/*-10&& 
		//		*(pucImg+r*nCol+c)0 && nTh < nMaxGray-1  
	//		&& ( plHist[nTh] >= plHist[nTh-1] && plHist[nTh] >= plHist[nTh+1])) 
		{ 
			lNoudo1 = 0,lNoudo2 = 0; 
			lGasosu1 = 0,lGasosu2 = 0; 
			for(r=0;r=nTh) 
					{	lGasosu2++;	 
						lNoudo2+=*(pucImg+r*nCol+c); 
					} 
				} 
			if(lGasosu1>0) 
				dfMean1 = (double)lNoudo1/lGasosu1; 
			else 
				dfMean1 = 0.0; 
			if(lGasosu2>0) 
				dfMean2 = (double)lNoudo2/lGasosu2; 
			else 
				dfMean2 = 0.0; 
			pdfBunsan[nTh] = (double)lGasosu1*lGasosu2*(dfMean1-dfMean2)*(dfMean1-dfMean2); 
		} 
	} 
	/*	求方差最大阈值 
	*/ 
	dfBMax = pdfBunsan[0]; 
	nThresh = 0; 
	for(nTh=1;nTh<=nMaxGray;nTh++) 
	{	if(dfBMaxnThresh) 
				*(pucImg+r*nCol+c) = 255; 
			else 
				*(pucImg+r*nCol+c) = 0; 
		}		 
	TRACE("T = %d\n",nThresh); 
	return	nThresh; 
} 
 
/* 
	灰度级变换:(gray value( [Za,Zb] )extend to [Z1,Z2]) 
*/ 
void	GrayTrans(unsigned char *pucImg,int	nRow,int nCol,int	nZa,int	nZb,int	nZ1,int	nZ2) 
{	float	fZba; 
	int		r,c; 
	 
	/*	get the scale coefficient 
	*/ 
	fZba = (float)(nZ2-nZ1)/(nZa-nZb); 
	for(r=0;rnZb) 
					*(pucImg+r*nCol+c) = nZ2; 
				else 
					*(pucImg+r*nCol+c) = (unsigned char)(fZba*(*(pucImg+r*nCol+c)-nZa)+nZ1); 
			} 
		} 
} 
 
/* 
	灰度分布的规范化:指定灰度图的均值与标准差(fE,fSigma) 
*/ 
void	Gray(unsigned char *pucImg,int	nRow,int nCol,float	fE,float fSigma) 
{	float	fE0,fBusan,fSbs,fGij,fSigma0; 
	fE0 = fBusan = 0.0; 
	int r,c; 
 
	for(r=0;rnE) 
		{	free(pucI); 
			return	-1; 
		} 
	} 
	while(nLv0<=nLevelC-1) 
	{	nSa0 = 9999;	nSum = 0; 
		for(nLv1=nLvls;nLv1<256;nLv1++) 
		{	nSum+=nHist[nLv1]; 
			nSa1 = abs(nE-nSum); 
			if(nSa1>nSa0) 
			{	nUpper[nLv0] = nLv1-1; 
				nLv0++; 
				nLvls = nLv1; 
				break; 
			} 
			if(nLv1==255) 
			{	nUpper[nLv0] = nLv1; 
				nLv0++; 
				break; 
			} 
			nSa0 = nSa1; 
		} 
	} 
	for(r=0;r0)|| 
				(*(pnII+r*nCol+c+1)<0&&*(pnII+r*nCol+c-1)>0)|| 
				(*(pnII+(r-1)*nCol+c)<0&&*(pnII+(r+1)*nCol+c)>0)|| 
				(*(pnII+(r+1)*nCol+c+1)<0&&*(pnII+(r-1)*nCol+c-1)>0))/*&& 
				abs(*(pnII+r*nCol+c))>100*/) 
				 
				*(pucImg+r*nCol+c) =0; 
			else 
				*(pucImg+r*nCol+c) = 255; 
			 
		} 
/* 
	for(r=0;rabs((double)nDD2))? 
												abs((double)nDD1) : abs((double)nDD2)); 
							break; 
			} 
		} 
	 
	for(r=0;rabs((double)nDD2))? 
												abs((double)nDD1) : abs((double)nDD2)); 
							break; 
			} 
		} 
	 
	for(r=0;rabs((double)nDD2))? 
												abs((double)nDD1) : abs((double)nDD2)); 
							break; 
			} 
		} 
	 
	for(r=0;rnRow) 
		{	do 
			{	dy-=nRow; 
			}while(dy>nRow); 
		} 
	 
		for(ix=0;ixnCol) 
			{	do 
				{	dx-=nCol; 
				}while(dx>nCol);			 
			} 
			gray1=*(pucI+iy*nCol+ix); 
			gray2=*(pucT+dy*nCol+dx); 
			cv+=(float)gray1*gray2; 
		} 
	} 
	return	cv; 
} 
/* 
	计算非周期卷积 
*/ 
float	Convol2(unsigned char *pucI,double *pucT,int	nRow,int nCol,int	xz,int	yz) 
{	int		ix,iy,dx,dy,gray1,gray2,gx,gy; 
	float	cv; 
	 
	cv=0.0; 
	for(iy=0;iy=nRow) 
			continue; 
		for(ix=0;ix=nCol) 
				continue; 
			gray1=*(pucI+iy*nCol+ix); 
			gray2=(int)*(pucT+dy*nCol+dx); 
			cv+=(float)gray1*gray2; 
		} 
	} 
	return	cv; 
} 
 
void	GetCubeImg(unsigned char *pucI,int	nRow,int nCol,unsigned char	*pucBlk, 
				   int	nW,int	nH,int	nX0,int	nY0) 
{	int	r,c; 
	 
	for(r=0;r=nCol||(nY0+r)<0||(nY0+r)>=nRow) 
				*(pucBlk+r*nW+c)=0; 
			else 
				*(pucBlk+r*nW+c)=*(pucI+(nY0+r)*nCol+(nX0+c));  
		} 
} 
 
void	GetExtRim(unsigned char *pucImg,int	nRow,int nCol) 
{ 
	int	ix,iy,gx,gy; 
	int	yup,ydown,xleft,xright,grey; 
	 
	yup = nRow;	ydown = 0; 
	xleft = nCol;	xright = 0; 
 
	for(iy=0;iyydown) 
				ydown = iy; 
			if(ixxright) 
				xright = ix; 
		} 
	for(iy=0;iy=xleft-1&&ix<=xright+1)|| 
				(iy==ydown+1&&ix>=xleft-1&&ix<=xright+1)|| 
				(iy>=yup-1&&ix==xleft-1&&iy<=ydown+1)|| 
				(iy>=yup-1&&iy<=ydown+1&&ix==xright+1)) 
				*(pucImg+iy*nCol+ix) = 0; 
			else 
				*(pucImg+iy*nCol+ix) = 255; 
		} 
 
} 
void	SetWhiteBorder(unsigned char *pucImg,int	nRow,int nCol,int	nBdW) 
{ 
	int	i,j; 
	for(i=0;inRow-nBdW-1||jnCol-nBdW-1) 
				*(pucImg+i*nCol+j) = 255; 
		} 
	} 
} 
 
/*	extract straight line by y = k*x + b 
input: 
	pucI,nRow,nCol ---- binary image in which there is single width curve 
	fAngleUnit,fBUnit ----- interval of K (angle with degree unit!!!!) and B 
	pfAngleRg,pfBRg ------- value range of angle and b 
output: 
	*pfK,*pfB ------------- output of K and B 
	return	(maxium unit value in the accumulator) 
*/ 
float	HoughT_Str_kb(BYTE	*pucI,int	nRow,int nCol, 
					 float	*pfK,float	*pfB,float	fAngleUnit, 
					float	fBUnit,float	*pfAngleRg,float	*pfBRg) 
{	 
	int		*pnAcc,nAccK,nAccB,kk,bb,n,k,b,i,j; 
	float	x,y; 
	nAccK = (int)((pfAngleRg[1] - pfAngleRg[0])/fAngleUnit)+2; 
	nAccB = (int)((pfBRg[1] - pfBRg[0])/fBUnit)+2; 
	pnAcc = new int[nAccK*nAccB]; 
	for(n=0;n=nAccB-1||b<=0) 
					continue; 
				*(pnAcc+b*nAccK+kk) = *(pnAcc+b*nAccK+kk) + 1; ////  
			} 
		} 
	} 
	int	maxB,maxK,max; 
	//// find maxium unit 
	for(bb=0;bb=nRow) 
			continue; 
		for(j=0;j=nCol) 
				continue; 
			*(pucImg+r*nCol+c) = 0; 
		} 
	} 
} 
/* 
*/ 
void	K_MeanClassify(BYTE	*pucImg,int	nRow,int	nCol,int	*pnPeaks,int	nC, 
					   int	nMin,int	nMax,int	*pnMeans) 
{	 
	int	pnNewMeans[100],i,g,d,pnN[100],n,min,N,Fg; 
	double	pdfSum[100]; 
 
	for(i=0;i1) 
				Fg = 0; 
		} 
		for(n=0;n60?120-d:d; 
		//		vs = (double)(int)(*(pucS+i))/45.0; 
		//		vs = vs?1?1:vs; 
				if(n==0||d1) 
				Fg = 0; 
		} 
		for(n=0;n=0;i--) 
		{	for(j=nCol-2;j>=0;j--) 
			{ 
				if(*(psnRegions+i*nCol+j+1)==l || *(psnRegions+(i+1)*nCol+j-1)==l 
					|| *(psnRegions+(i+1)*nCol+j)==l || *(psnRegions+(i+1)*nCol+j+1)==l) 
				{ 
					*(psnRegions+i*nCol+j) = l; 
					chg2 = 1; 
					continue; 
				} 
				 
			} 
		} 
		if(chg1==0) 
			continue; 
		goto	propa; 
 
	} 
		 
	return	lmax; 
}