www.pudn.com > shouxiehanzishibie.zip > 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; 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