www.pudn.com > chepaishibiexitong.rar > Thinner.cpp


//************************************************************************** 
//Thinner.cpp 
//细化算法实现文件 
//************************************************************************** 
#include "StdAfx.h" 
#include  
#include  
#include "Thinner.h" 
 
void beforethin(unsigned char *ip, unsigned char *jp,  
				unsigned long lx, unsigned long ly) 
{ 
	unsigned long i,j; 
	for(i=0; i0) 
				jp[i*lx+j]=1; 
			else 
				jp[i*lx+j]=0; 
		} 
	} 
} 
 
///////////////////////////////////////////////////////////////////////// 
//Hilditch细化算法 
//功能:对图象进行细化 
//参数:image:代表图象的一维数组 
//      lx:图象宽度 
//      ly:图象高度 
//      无返回值 
void ThinnerHilditch(void *image, unsigned long lx, unsigned long ly) 
{ 
	char *f, *g; 
	char n[10]; 
	unsigned int counter; 
	short k, shori, xx, nrn; 
	unsigned long i, j; 
	long kk, kk11, kk12, kk13, kk21, kk22, kk23, kk31, kk32, kk33, size; 
	size = (long)lx * (long)ly; 
	g = (char *)malloc(size); 
 
	if(g == NULL) 
	{ 
		printf("error in allocating memory!\n"); 
		return; 
	} 
 
	f = (char *)image; 
	for(i=0; ig 
		{ 
			for(j=0; jf[kk22] 
					continue; 
				} 
 
				n[4] = f[kk11]; //对应图6-15 
				n[3] = f[kk12]; 
				n[2] = f[kk13]; 
				n[5] = f[kk21]; 
				n[1] = f[kk23]; 
				n[6] = f[kk31]; 
				n[7] = f[kk32]; 
				n[8] = f[kk33]; 
				n[9] = n[1];    //9为0 
				xx = 0; 
 
				for(k=1; k<8; k=k+2) //为条件5判断作统计 
				{ 
					if((!n[k])&&(n[k+1]||n[k+2])) 
						xx++; 
				} 
 
				if(xx!=1)//判断条件(5) 
				{ 
					f[kk22] = 2; 
					continue; 
				} 
 
				if(f[kk12] == -1)//?判断f(n3)是否∈R 
				{ 
					f[kk12] = 0; //f[kk12]已经被删,故为0 
					n[3] = 0;    //n[3]=f[kk12]已经被删,故为0 
					xx = 0; 
 
					for(k=1; k<8; k=k+2) 
					{ 
						if((!n[k])&&(n[k+1]||n[k+2])) 
							xx++; 
					} 
 
					if(xx != 1)  //判断条件(6) 
					{ 
						f[kk12] = -1;//恢复f[kk12]为被删 
						continue; 
					} 
 
					f[kk12] = -1;//恢复f[kk12]为被删 
					n[3] = -1;//恢复f[kk12]为被删 
				} 
 
				if(f[kk21]!=-1)//判断条件(6) 
				{ 
					f[kk22] = -1;//全部条件满足,减薄 
					shori = 1;//最后将-1---》0的条件 
					continue; 
				} 
 
				f[kk21] = 0; //f(n5)∈R,f[kk21]已经被删,故为0 
				n[5] = 0; //f(n5)∈R,f[kk21]已经被删,故为0 
				xx = 0; 
 
				for(k=1; k<8; k=k+2) //判断条件(6) 
				{ 
					if((!n[k])&&(n[k+1]||n[k+2])) 
					{ 
						xx++; 
					} 
				} 
 
				if(xx == 1)//全部条件满足,减薄 
				{ 
					f[kk21] = -1;//恢复f[kk21]为被删 
					f[kk22] = -1;//减薄 
					shori =1;//最后将-1---》0的条件 
				} 
				else 
					f[kk21] = -1;//恢复f[kk21]为被删 
			} 
		} 
	}while(shori); 
 
	free(g); 
} 
 
///////////////////////////////////////////////////////////////////////// 
//Pavlidis细化算法 
//功能:对图象进行细化 
//参数:image:代表图象的一维数组 
//      lx:图象宽度 
//      ly:图象高度 
//      无返回值 
void ThinnerPavlidis(void *image, unsigned long lx, unsigned long ly) 
{ 
	char erase, n[8]; 
	char *f; 
	unsigned char bdr1,bdr2,bdr4,bdr5; 
	short c,k,b; 
	unsigned long i,j; 
	long kk,kk1,kk2,kk3; 
	f = (char*)image; 
 
	for(i=1; i=1) 
						bdr1|=0x80>>k; 
				} 
 
				if((bdr1&0252)== 0252) 
					continue; 
				f[kk] = 2; 
				b=0; 
 
				for(k=0; k<=7; k++) 
				{ 
					b+=bdr1&(0x80>>k); 
				} 
 
				if(b<=1) 
					f[kk]=3; 
 
				if((bdr1&0160)!=0&&(bdr1&07)!=0&&(bdr1&0210)==0) 
					f[kk]=3; 
				else if((bdr1&&0301)!=0&&(bdr1&034)!=0&&(bdr1&042)==0) 
					f[kk]=3; 
				else if((bdr1&0202)==0 && (bdr1&01)!=0) 
					f[kk]=3; 
				else if((bdr1&0240)==0 && (bdr1&0100)!=0) 
					f[kk]=3; 
				else if((bdr1&050)==0 && (bdr1&020)!=0) 
					f[kk]=3; 
				else if((bdr1&012)==0 && (bdr1&04)!=0) 
					f[kk]=3; 
			} 
		} 
 
		for(i=1; i=1) 
						bdr1|=0x80>>k; 
					if(n[k]>=2) 
						bdr2|=0x80>>k; 
				} 
 
				if(bdr1==bdr2) 
				{ 
					f[kk] = 4; 
					continue; 
				} 
 
				if(f[kk]!=2) 
					continue; 
 
				if((bdr2&0200)!=0 && (bdr1&010)==0 && 
					((bdr1&0100)!=0 &&(bdr1&001)!=0 || 
					((bdr1&0100)!=0 ||(bdr1 & 001)!=0) && 
					(bdr1&060)!=0 &&(bdr1&06)!=0)) 
				{ 
					f[kk] = 4; 
				} 
 
				else if((bdr2&040)!=0 && (bdr1&02)==0 && 
					((bdr1&020)!=0 && (bdr1&0100)!=0 || 
					((bdr1&020)!=0 || (bdr1&0100)!=0) && 
					(bdr1&014)!=0 && (bdr1&0201)!=0)) 
				{ 
					f[kk] = 4; 
				} 
 
				else if((bdr2&010)!=0 && (bdr1&0200)==0 && 
					((bdr1&04)!=0 && (bdr1&020)!=0 || 
					((bdr1&04)!=0 || (bdr1&020)!=0) && 
					(bdr1&03)!=0 && (bdr1&0140)!=0)) 
				{ 
					f[kk] = 4; 
				} 
 
				else if((bdr2&02)!=0 && (bdr1&040)==0 && 
					((bdr1&01)!=0 && (bdr1&04)!=0 || 
					((bdr1&01)!=0 || (bdr1&04)!=0) && 
					(bdr1&0300)!=0 && (bdr1&030)!=0)) 
				{ 
					f[kk] = 4; 
				} 
			} 
		} 
 
		for(i=1; i=4) 
						bdr4|=0x80>>k; 
					if(n[k]>=5) 
						bdr5|=0x80>>k; 
				} 
				if((bdr4&010) == 0) 
				{ 
					f[kk] = 5; 
					continue; 
				} 
				if((bdr4&040) == 0 && bdr5 ==0) 
				{ 
					f[kk] = 5; 
					continue; 
				} 
				if(f[kk]==3||f[kk]==4) 
					f[kk] = c; 
			} 
		} 
 
		erase = 0; 
		for(i=1; i0) 
					{ 
						if(!cond) 
							continue; 
						g[kk] = 0; 
						shori = 1; 
						continue; 
					} 
 
					if(n[6]==1 && n48==0 && n123>0) 
					{ 
						if(!cond) 
							continue; 
						g[kk] = 0; 
						shori = 1; 
						continue; 
					} 
 
					if(n[8]==1 && n26==0 && n345>0) 
					{ 
						if(!cond) 
							continue; 
						g[kk] = 0; 
						shori = 1; 
						continue; 
					} 
 
					if(n[4]==1 && n26==0 && n781>0) 
					{ 
						if(!cond) 
							continue; 
						g[kk] = 0; 
						shori = 1; 
						continue; 
					} 
 
					if(n[5]==1 && n46==0) 
					{ 
						if(!cond) 
							continue; 
						g[kk] = 0; 
						shori = 1; 
						continue; 
					} 
 
					if(n[7]==1 && n68==0) 
					{ 
						if(!cond) 
							continue; 
						g[kk] = 0; 
						shori = 1; 
						continue; 
					} 
 
					if(n[1]==1 && n82==0) 
					{ 
						if(!cond) 
							continue; 
						g[kk] = 0; 
						shori = 1; 
						continue; 
					} 
 
					if(n[3]==1 && n24==0) 
					{ 
						if(!cond) 
							continue; 
						g[kk] = 0; 
						shori = 1; 
						continue; 
					} 
 
					cond = 1; 
					if(!cond) 
						continue; 
					g[kk] = 0; 
					shori = 1; 
				} 
			} 
 
			for(i=0; i