//************************************************************************** //Thinner.cpp //细化算法实现文件 //************************************************************************** //#include "StdAfx.h" #pragma once #include #include #include "Thinner.h" #include void beforethin(unsigned char *ip, unsigned char *jp, unsigned long lx, unsigned long ly){ //void beforethin(char *ip, char *jp, unsigned long lx, unsigned long ly) unsigned long i,j; for(i=0; i0) jp[i*lx+j]=0; else jp[i*lx+j]=255; } } } ///////////////////////////////////////////////////////////////////////// //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