⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 process.cpp

📁 这是VC++ 2003.net图像处理的光盘源程序!!!非常好的
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		}
	}
	buf[j++]=i;
 
	for (i=2;i<j-2;i+=2) {
 	   m=buf[i-1];
	   n=buf[i];
       if ((n-m<a)||(abs(tab[m]-tab[n])<b)) {
 		   if (tab[m]>tab[buf[i+1]]) buf[i+1]=buf[i-1];
 		   if (tab[n]>tab[buf[i-2]]) buf[i]=buf[i-2];
		   for (k=i;k<j;k++) buf[k-2]=buf[k];
 		   j-=2;
		   i-=2;
		   continue;
	   }
	   m=buf[i+1];
	   n=buf[i];
       if ((m-n<a)||(abs(tab[m]-tab[n])<b)) {
 		   if (tab[m]<tab[buf[i-1]]) buf[i+1]=buf[i-1];
 		   if (tab[n]<tab[buf[i+2]]) buf[i+2]=buf[i];
		   for (k=i;k<j;k++) buf[k]=buf[k+2];
 		   j-=2;
		   i-=2;
	   }
	}

	if (j>5) {
		for (i=2;i<j-1;i+=2) {
		   m=n=0;
           for (k=0;k<buf[i];k++)   m+=tab[k];
           for (k=buf[i];k<256;k++) n+=tab[k];
			buf2[i]=abs(m-n);
 		}
		m=buf2[2];
		n=2;
		for (i=4;i<j-1;i+=2) {
			if (buf2[i]<m) {
				m=buf2[i];
				n=i;
			}
		}
		thre=buf[n];
	}
	else if (j>3) thre=buf[2];
	else {
 		if (buf[1]<10) n=buf[0]; 
 		else
		{
			for (k=buf[1]-3;k>5;k--) { 
				if (tab[k]>h/2) continue;
				if (tab[k+1]-tab[k]>=tab[k]-tab[k-2]) {
 					for (v=k-3;v>k-g;v--)
						if (tab[v+1]<tab[v]) break;
					if ((v>k-g)&&(tab[k]-tab[v]>g/2)) k=v+2;
					if (tab[k]<60) break;
				}
  			}
  			n=k;
			if (k>5) buf[0]=k;
		}
 		if (buf[1]>245) m=buf[2];
 		else 
		{
			for (k=buf[1]+3;k<250;k++) { 
				if (tab[k]>h/2) continue;
				if (tab[k-1]-tab[k]>=tab[k]-tab[k+2]) {
 					for (v=k+3;v<k+g;v++)
						if (tab[v-1]<tab[v]) break;
					if ((v<k+g)&&(tab[k]-tab[v]>g/2)) k=v-2;
					break;
				}
  			}
 			m=k;
			if (k<250) buf[2]=k;
		}
		s=t=0;
		for (i=0;i<n;i++)   s+=tab[i];
		if (m>0) 
 			for (i=m;i<256;i++) t+=tab[i];
		if (s>t) thre=n;
		else thre=m;
 	}
	*bn=j;
 	return(thre);
}

//---------------------------------------------------------------------------------

void WINAPI LogPrewitt(BYTE **list0,BYTE **list,int Dx,int Dy,double pi)
{	
  int    i,j,k,a,b;
  double buffer[3][2048],table[256],A,B;
 
  for (i=0;i<256;i++) table[i]=log(i+1.0);
 
  for (k=0;k<Dx;k++) buffer[0][k]=table[list[0][k]];
  for (k=0;k<Dx;k++) buffer[1][k]=table[list[1][k]];
  for (i=1;i<Dy-1;i++) {
    for (k=0;k<Dx;k++) buffer[2][k]=table[list[i+1][k]];
    for (j=1;j<Dx-1;j++) {
      if (list[i][j]>30) {
        A = (buffer[0][j+1]+buffer[1][j+1]+buffer[2][j+1])-
            (buffer[0][j-1]+buffer[1][j-1]+buffer[2][j-1]);	
        B = (buffer[2][j-1]+buffer[2][j]  +buffer[2][j+1])-
            (buffer[0][j-1]+buffer[0][j]  +buffer[0][j+1]); 	
        if (fabs(A)+fabs(B)<pi) list0[i][j] = 0;  
        else                    list0[i][j] = 1;
	  }
      else {
        a = (list[i-1][j+1]+list[i][j+1]+list[i+1][j+1])-
            (list[i-1][j-1]+list[i][j-1]+list[i+1][j-1]);	
        b = (list[i+1][j-1]+list[i+1][j]+list[i+1][j+1])-
            (list[i-1][j-1]+list[i-1][j]+list[i-1][j+1]); 	
        if (abs(a)+abs(b)<12) list0[i][j] = 0; 
        else                  list0[i][j] = 1;
	  }
    }
    memcpy(buffer[0],buffer[1],Dx*sizeof(double));
    memcpy(buffer[1],buffer[2],Dx*sizeof(double));
  }
}

#define  COLOR	0

int WINAPI Cross(int* f)
{
	int  i,sum;

	for (i=1,sum=0; i<=7; i+=2) {
      if ((!f[i]) && (f[i+1] || f[i+2]))  sum++;
	}                         
	return(sum);
}

void WINAPI Hilditch(BYTE **list,int Dx,int Dy)
{
   int  i,j,k,m,n,flag;
   int  sum=0, x[10];
   char *buf0,**list0;
 
   buf0 =(char*)  malloc(Dx*Dy*sizeof(char));
   list0=(char**) malloc(Dy*sizeof(char*));
   for(k=0;k<Dy;k++) {
      list0[k]=buf0+k*Dx;
	  memcpy(list0[k],list[k],Dx);
   }
 
   i=1;		                                
   do {
      flag=0;		                      
      for (k=1; k<Dy-1; k++) {		      
		 for (j=1; j<Dx-1; j++) {	
			if (list0[k][j] != 1)  continue;       
			x[1]=list0[k][j+1];	x[2]=list0[k-1][j+1];
			x[3]=list0[k-1][j]; x[4]=list0[k-1][j-1];
			x[5]=list0[k][j-1];	x[6]=list0[k+1][j-1];
			x[7]=list0[k+1][j];	x[8]=list0[k+1][j+1];
						
			for (m=1,n=0; m<=8; m++) {
				if (x[m]==-i) {
					x[m]=1;  		  
					n++;		      
				}
				else if (x[m]<0)  x[m]=0;
			}

			sum=x[1]+x[3]+x[5]+x[7];	
			if (sum>=4) continue;      

			x[9]=x[1];
			for (m=1, sum=0; m<=8; m++)
				if (x[m]==1)   sum++;
			if ((sum<=1)||(sum-n==0))  continue;
 
			sum=Cross(x);
			if (sum!=1)  continue;
			if (list0[k-1][j]== -i) {
				x[3]=0;
				sum=Cross(x);		
				if (sum!=1)  continue;
			}
			if (list0[k][j-1]== -i) {
				x[5]=0;
				sum=Cross(x);		
				if (sum!=1)  continue;
			}

			list[k][j]=0;
			list0[k][j]=-i;   
			flag=1; 		 
		 }
      }
      i++;		         
   }
   while(flag==1);	     

   free(list0);                   
   free(buf0);
}

void WINAPI Deutch(BYTE **list0,int Dx,int Dy)
{
  int  i,j,k,l,ii,flag;
  int  sum=0, sum1=0, f[10];
  char *buf,**list;
 
  buf =(char*)  malloc(Dx*Dy*sizeof(char));
  list=(char**) malloc(Dy*sizeof(char*));
  for(k=0;k<Dy;k++) {
    list[k]=buf+k*Dx;
    memcpy(list[k],list0[k],Dx);
  }
 
  i=1;
  do {
    flag=0;
    for (k=1; k<Dy-1; k++) {
      for (j=1; j<Dx-1; j++) {
	if (list[k][j] != 1)  continue;
	else if (i==1) {
	  f[1]=list[k][j+1];
	  f[2]=list[k-1][j+1];
	  f[3]=list[k-1][j];
	  f[4]=list[k-1][j-1];
	  f[5]=list[k][j-1];
	  f[6]=list[k+1][j-1];
	  f[7]=list[k+1][j];
	  f[8]=list[k+1][j+1];
	}
	else {
	  f[1]=list[k][j-1];
	  f[2]=list[k+1][j-1];
	  f[3]=list[k+1][j];
	  f[4]=list[k+1][j+1];
	  f[5]=list[k][j+1];
	  f[6]=list[k-1][j+1];
	  f[7]=list[k-1][j];
	  f[8]=list[k-1][j-1];
	}
	for (ii=1; ii<=8; ii++) {
	  if (f[ii]==-i)    f[ii]=1;
	  else if(f[ii]<0)  f[ii]=0;
	}
	f[9]=f[1];

	sum=sum1=0;
	for (l=1; l<9; l++) {
	  if ((f[l+1]-f[l])!=0)  sum++;
	  sum1+=f[l];
	}
	if (sum1==1)  continue;
	if (sum>4)    continue;
	if (sum==1 || sum==3)     continue;
	if ((f[1]*f[3]*f[5])!=0)  continue;
	if ((f[1]*f[3]*f[7])!=0)  continue;
	if (sum==4) {
	  if (f[1]*f[7]!=1 || f[2]+f[6]!=1 ||
		 f[3]+f[4]+f[5]+f[8]!=0)  continue;
	  if (f[1]*f[3]!=1 || f[4]+f[8]!=1 ||
	    f[2]+f[5]+f[6]+f[7]!=0)  continue;
	}
	list[k][j] = -i;
	list0[k][j]= COLOR;
	flag=1;
      }
    }
    i++;
  }
  while(flag==1);

  free(list);                   
  free(buf);
}

void WINAPI FastThin(BYTE **list0,int Dx,int Dy)
{
  int  i,j,k,flag;
  int  f[11],ap1,bp1;
  char *buf,**list;
 
  buf =(char*)  malloc(Dx*Dy*sizeof(char));
  list=(char**) malloc(Dy*sizeof(char*));
  for(k=0;k<Dy;k++) {
    list[k]=buf+k*Dx;
    memcpy(list[k],list0[k],Dx);
  }
 
  do {
    flag=0;
    for (j=1; j<Dy-1; j++) {
      for (i=1; i<Dx-1; i++) {
	if  (list[j][i] != 1)  continue;
	f[1]=list[j][i];
	f[2]=list[j][i-1];
	f[3]=list[j+1][i-1];
	f[4]=list[j+1][i];
	f[5]=list[j+1][i+1];
	f[6]=list[j][i+1];
	f[7]=list[j-1][i+1];
	f[8]=list[j-1][i];
	f[9]=list[j-1][i-1];
	f[10]=f[2];

	for (k=2; k<=10; k++)
	  f[k] = (f[k]>0) ? 1 : 0;
	if (f[4]&&f[6])
	  if (f[2]||f[8])  continue;
	bp1=0;
	for (k=2; k<=9; k++)
	  bp1+=f[k];
	if ((bp1<2)||(bp1>6))  continue;
	ap1=0;
	for (k=2; k<=9; k++)
	  if ((f[k]==0) && (f[k+1]==1))
	    ap1++;
	if (ap1!=1)  continue;
	list[j][i]=3;
		}
    }
    for (j=1; j<Dy-1; j++) {
      for (i=1; i<Dx-1; i++) {
	if (list[j][i] == 3) {
	  list[j][i] = 0;
	  list0[j][i]= COLOR;
	  flag=1;
	}
      }
    }
    if (flag==0)  break;
    flag=0;
    for (j=1; j<Dy-1; j++) {
      for (i=1; i<Dx-1; i++) {
	if  (list[j][i] != 1)  continue;
	f[1]=list[j][i];
	f[2]=list[j][i-1];
	f[3]=list[j+1][i-1];
	f[4]=list[j+1][i];
	f[5]=list[j+1][i+1];
	f[6]=list[j][i+1];
	f[7]=list[j-1][i+1];
	f[8]=list[j-1][i];
	f[9]=list[j-1][i-1];
	f[10]=f[2];

	for (k=2; k<=10; k++)
	  f[k] = (f[k]>0) ? 1 : 0;
	if (f[2]&&f[8])
	  if (f[4]||f[6])  continue;
	bp1=0;
	for (k=2; k<=9; k++)
	  bp1+=f[k];
	if ((bp1<2)||(bp1>6))  continue;
	ap1=0;
	for (k=2; k<=9; k++)
	  if ((f[k]==0) && (f[k+1]==1))
	    ap1++;
	if (ap1!=1)  continue;
	list[j][i] = 3;
      }
    }
    for (j=1; j<Dy-1; j++) {
      for (i=1; i<Dx-1; i++) {
	if (list[j][i] == 3) {
	  list[j][i] = 0;
	  list0[j][i]=COLOR;
	  flag=1;
	}
      }
	 }
  }
  while(flag==1);

  free(list);                   
  free(buf);
}

void WINAPI Naccache(BYTE **list0,int Dx,int Dy)
{
  int  i,j,k,flag;
  int  N[8];
  char *buf,**list;
 
  buf =(char*)  malloc(Dx*Dy*sizeof(char));
  list=(char**) malloc(Dy*sizeof(char*));
  for(k=0;k<Dy;k++) {
    list[k]=buf+k*Dx;
    memcpy(list[k],list0[k],Dx);
  }
 
  do {
    flag=0;
    for (j=1; j<Dy-1; j++) {
      for (i=1; i<Dx-1; i++) {
	if  (list[j][i] != 1)  continue;
	N[0]=list[j+1][i];
	N[1]=list[j+1][i-1];
	N[2]=list[j][i-1];
	N[3]=list[j-1][i-1];
	N[4]=list[j-1][i];
	N[5]=list[j-1][i+1];
	N[6]=list[j][i+1];
	N[7]=list[j+1][i+1];

	if (N[0]&&N[4])  continue;
	for (k=0;k<8;k++)
	  if (N[k]==2)  N[k]=0;
	if (N[0]&&(N[1]||N[2]||N[6]||N[7])&&
	     (N[2]||(!N[3]))&&(N[6]||(!N[5]))) {
	  list[j][i]=2;
	  continue;
	}
	if (N[4]&&(N[5]||N[6]||N[2]||N[3])&&
	     (N[6]||(!N[7]))&&(N[2]||(!N[1]))) {
	  list[j][i]=2;
	  continue;
	}
	list[j][i]=3;
      }
    }
    for (j=1; j<Dy-1; j++) {
      for (i=1; i<Dx-1; i++) {
	if (list[j][i]==2) {
	  list[j][i] = 0;
	  list0[j][i] = COLOR;
	  flag=1;
	}
	else if (list[j][i]==3)
	  list[j][i] = 1;
      }
    }
    if (flag==0) break;
    flag=0;
    for (j=1; j<Dy-1; j++) {
      for (i=1; i<Dx-1; i++) {
	if (list[j][i] != 1)  continue;
	N[0]=list[j+1][i];
	N[1]=list[j+1][i-1];
	N[2]=list[j][i-1];
	N[3]=list[j-1][i-1];
	N[4]=list[j-1][i];
	N[5]=list[j-1][i+1];
	N[6]=list[j][i+1];
	N[7]=list[j+1][i+1];

	if (N[2]&&N[6])  continue;
	for (k=0;k<8;k++)
	  if (N[k]==2)  N[k]=0;
	if (N[2]&(N[3]||N[4]||N[0]||N[1])&&
	     (N[4]||(!N[5]))&&(N[0]||(!N[7]))) {
	  list[j][i]=2;
	  continue;
	}
	if (N[6]&(N[7]||N[0]||N[4]||N[5])&&
	     (N[0]||(!N[1]))&&(N[4]||(!N[3]))) {
	  list[j][i]=2;
	  continue;
	}
	list[j][i] = 3;
      }
    }
    for (j=1; j<Dy-1; j++) {
      for (i=1; i<Dx-1; i++) {
	if (list[j][i] == 2) {
	  list[j][i] = 0;
	  list0[j][i]=COLOR;
	  flag=1;
	}
	else if (list[j][i]==3)
	  list[j][i] = 1;
      }
    }
  }
  while(flag==1);

  free(list);                   
  free(buf);
}

void WINAPI Pavlidis1(BYTE **list0,int Dx,int Dy)
{
  int  i,j,k,flag,flag1;
  int  N[8],neighb;
  char *buf,**list;
 
  buf =(char*)  malloc(Dx*Dy*sizeof(char));
  list=(char**) malloc(Dy*sizeof(char*));
  for(k=0;k<Dy;k++) {
    list[k]=buf+k*Dx;
    memcpy(list[k],list0[k],Dx);
  }
 
  do {
    flag=0;
    for (neighb=0;neighb<=7;neighb+=2) {
      for (j=1; j<Dy-1; j++) {
	for (i=1; i<Dx-1; i++) {
	  N[0]=list[j+1][i];
	  N[1]=list[j+1][i-1];
	  N[2]=list[j][i-1];
	  N[3]=list[j-1][i-1];
	  N[4]=list[j-1][i];
	  N[5]=list[j-1][i+1];
	  N[6]=list[j][i+1];
	  N[7]=list[j+1][i+1];

	  if ((list[j][i]==1)&&(N[neighb]==0)) {
	    flag1=0;
	    if ((N[3]||N[2]||N[1])&&(N[5]||
	      N[6]||N[7])&&(N[4]!=1)&&(N[0]!=1)) {
		flag1=1;
	    }
	    else if ((N[3]||N[4]||N[5])&&(N[1]||
	      N[0]||N[7])&&(N[2]!=1)&&(N[6]!=1)) {
		flag1=1;
	    }
	    else if ((N[1]==2)&&(N[0]!=1)&&(N[2]!=1)&&
		(N[3]||N[4]||N[5]||N[6]||N[7])) {
		  flag1=1;
	    }
	    else if ((N[3]==2)&&(N[2]!=1)&&(N[4]!=1)
		&&(N[0]||N[1]||N[7]||N[6]||N[5])) {
		  flag1=1;
	    }
	    else if ((N[5]==2)&&(N[4]!=1)&&(N[6]!=1)
		&&(N[7]||N[0]||N[1]||N[2]||N[3])) {
		  flag1=1;
	    }
	    else if ((N[7]==2)&&(N[6]!=1)&&(N[0]!=1)
		&&(N[1]||N[2]||N[3]||N[4]||N[5])) {
		  flag1=1;
	    }
	    if (flag1==1)  list[j][i]=2;
	    else {
	      list[j][i]=3;
	      flag=1;
	    }
	  }
	}
      }
    }
    for (j=1; j<Dy-1; j++) {
      for (i=1; i<Dx-1; i++) {
	if (list[j][i] == 3) {
	  list[j][i] = 0;
	  list0[j][i]= COLOR;
	}
      }
    }
  }
  while(flag==1);

  free(list);                   
  free(buf);
}

void WINAPI Pavlidis2(BYTE **list0,int Dx,int Dy)
{
  int  i,j,k,c,flag,xx;
  int  N[8];
  unsigned char bdr1,bdr2,bdr4,bdr5;
  char *buf,**list;
 
  buf =(char*)  malloc(Dx*Dy*sizeof(char));
  list=(char**) malloc(Dy*sizeof(char*));
  for(k=0;k<Dy;k++) {
    list[k]=buf+k*Dx;
    memcpy(list[k],list0[k],Dx);
  }

  c=5;
  do {
    flag=0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -