www.pudn.com > dip.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; i 0) 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 g { for(j=0; j f[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; i 0) { 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