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

📄 process.cpp

📁 这是VC++ 2003.net图像处理的光盘源程序!!!非常好的
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    c++;
    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];
	bdr1=0;
	for (k=0;k<=7;k++)
	  if (N[k]>=1)  bdr1 |= 0x80 >> k;
	if ((bdr1&0252)==0252)  continue;
	list[j][i]=2;
	flag=1;
	xx=0;
	for (k=0;k<=7;k++)
	  xx+= bdr1 & (0x80 >> k);
	if (xx<=1)  list[j][i]=3;
	else if ((bdr1&0160)&&(bdr1&7)
		       &&(!(bdr1&0210)))
	   list[j][i]=3;
	else if ((bdr1&0301)&&(bdr1&034)
				 &&(!(bdr1&042)))
	   list[j][i]=3;
	else if ((!(bdr1&0202))&&(bdr1&1))
	   list[j][i]=3;
	else if ((!(bdr1&0240))&&(bdr1&0100))
	   list[j][i]=3;
	else if ((!(bdr1&050))&&(bdr1&020))
	   list[j][i]=3;
	else if ((!(bdr1&012))&&(bdr1&04))
	   list[j][i]=3;
      }
    }
    for (j=1; j<Dy-1; j++) {
      for (i=1; i<Dx-1; i++) {
	if (list[j][i]!=2)  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];
	bdr1=0;   bdr2=0;
	for (k=0;k<=7;k++) {
	  if (N[k]>=1)  bdr1 |= 0x80 >> k;
	  if (N[k]>=2)  bdr2 |= 0x80 >> k;
	}
	if ((bdr1==bdr2)&&(bdr1&0201)
	   &&(bdr1&07)&&(bdr1&03))
	  list[j][i]=4;
	if (((bdr2&0200)&&(!(bdr1&010)))
	  &&(((bdr1&01)&&(bdr1&0100))
	  ||(((bdr1&06)&&(bdr1&060))&&
	  (((bdr1&01)&&(!(bdr1&0100)))
	  ||((!(bdr1&01))&&(bdr1&0100))))))
	   list[j][i]=4;
	else if (((bdr2&040)&&(!(bdr1&02)))
	  &&(((bdr1&020)&&(bdr1&0100))
	  ||(((bdr1&014)&&(bdr1&0201))&&
	  (((bdr1&020)&&(!(bdr1&0100)))
	  ||((!(bdr1&020))&&(bdr1&0100)))))
	  &&(bdr1&07)&&(bdr1&03))
	   list[j][i]=4;
	else if (((bdr2&010)&&(!(bdr1&0200)))
	  &&(((bdr1&04)&&(bdr1&020))
	  ||(((bdr1&03)&&(bdr1&0140))&&
	  (((bdr1&04)&&(!(bdr1&020)))
	  ||((!(bdr1&04))&&(bdr1&020)))))
	  &&(bdr1&0201))
	   list[j][i]=4;
	else if (((bdr2&02)&&(!(bdr1&040)))
	  &&(((bdr1&01)&&(bdr1&04))
	  ||(((bdr1&0300)&&(bdr1&030))&&
	  (((bdr1&01)&&(!(bdr1&04)))
	  ||((!(bdr1&01))&&(bdr1&04))))))
	   list[j][i]=4;
      }
    }
    for (j=1; j<Dy-1; j++) {
      for (i=1; i<Dx-1; i++) {
	if (list[j][i]!=2)  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];
	bdr4=0;   bdr5=0;
	for (k=0;k<=7;k++) {
	  if (N[k]>=4)  bdr4 |= 0x80 >> k;
	  if (N[k]>=5)  bdr5 |= 0x80 >> k;
	}
	if (!(bdr4&010)) {
	  list[j][i]=5;
	  flag=1;
	}
	else if ((!(bdr4&040))&&(!bdr5)) {
	  list[j][i]=5;
	  flag=1;
	}
	else if ((list[j][i]==3)||(list[j][i]==4))
	  list[j][i]=c;
      }
    }
    for (j=1; j<Dy-1; j++) {
      for (i=1; i<Dx-1; i++) {
	if ((list[j][i]==2)||(list[j][i]==5)) {
	  list[j][i] = 0;
	  list0[j][i]= COLOR;
	}
      }
    }
  }
  while(flag==1);

  free(list);                   
  free(buf);
}

void WINAPI Rosenfeld4(BYTE **list0,int Dx,int Dy)
{
  int  i,j,k,ii,jj,kk,flag;
  int  N[10];
  int  jbd[5]={0,-1,1,0,0};
  int  ibd[5]={0,0,0,1,-1};
  char NRND,N48,N26,N24,N46,N68,N82;
  char N123,N345,N567,N781;
  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 (kk=1;kk<=4;kk++) {
      jj=jbd[kk];
      for (j=1; j<Dy-1; j++) {
	for (i=1; i<Dx-1; i++) {
	  ii=ibd[kk];
	  if (!list[j][i])  continue;
	  if (list[j+jj][i+ii])  continue;
	  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];
	  N[8]=list[j+1][i];

	  NRND=N[2]+N[4]+N[6]+N[8];
	  if (NRND<=1)  continue;
	  N48=N[4]+N[8];
	  N567=N[5]+N[6]+N[7];
	  if (N[2]==1 && N48==0 && N567>0)
	    continue;
	  N123=N[1]+N[2]+N[3];
	  if (N[6]==1 && N48==0 && N123>0)
	    continue;
	  N26=N[2]+N[6];
	  N345=N[3]+N[4]+N[5];
	  if (N[8]==1 && N26==0 && N345>0)
	    continue;
	  N781=N[7]+N[8]+N[1];
	  if (N[4]==1 && N26==0 && N781>0)
	    continue;
	  N46=N[4]+N[6];
	  if (N[5]==1 && N46==0)  continue;
	  N68=N[6]+N[8];
	  if (N[7]==1 && N68==0)  continue;
	  N82=N[8]+N[2];
	  if (N[1]==1 && N82==0)  continue;
	  N24=N[2]+N[4];
	  if (N[3]==1 && N24==0)  continue;
	  if (N[5]==0 && N46==2)  continue;
	  if (N[7]==0 && N68==2)  continue;
	  if (N[1]==0 && N82==2)  continue;
	  if (N[3]==0 && N24==2)  continue;

	  list0[j][i]=COLOR;
	  flag=1;
	}
      }
      for (i=0;i<Dy;i++) {
        memcpy(list[i],list0[i],Dx);
 	 for (j=0;j<Dx;j++)
	    if (list[i][j]!=1)  list[i][j]=0;
      }
    }
  }
  while(flag==1);

  free(list);                   
  free(buf);
}

void WINAPI Rosenfeld8(BYTE **list0,int Dx,int Dy)
{
  int  i,j,k,ii,jj,kk,flag;
  int  N[10];
  int  jbd[5]={0,-1,1,0,0};
  int  ibd[5]={0,0,0,1,-1};
  char NRND,N48,N26,N24,N46,N68,N82;
  char N123,N345,N567,N781;
  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 (kk=1;kk<=4;kk++) {
      jj=jbd[kk];
      for (j=1; j<Dy-1; j++) {
	for (i=1; i<Dx-1; i++) {
	  ii=ibd[kk];
	  if (!list[j][i])  continue;
	  if (list[j+jj][i+ii])  continue;
	  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];
	  N[8]=list[j+1][i];

	  NRND=0;
	  for (k=1; k<=8; k++)
	    NRND += N[k];
	  if (NRND<=1)  continue;
	  N48=N[4]+N[8];
	  N567=N[5]+N[6]+N[7];
	  if (N[2]==1 && N48==0 && N567>0)
	    continue;
	  N123=N[1]+N[2]+N[3];
	  if (N[6]==1 && N48==0 && N123>0)
	    continue;
	  N26=N[2]+N[6];
	  N345=N[3]+N[4]+N[5];
	  if (N[8]==1 && N26==0 && N345>0)
		 continue;
	  N781=N[7]+N[8]+N[1];
	  if (N[4]==1 && N26==0 && N781>0)
	    continue;
	  N46=N[4]+N[6];
	  if (N[5]==1 && N46==0)  continue;
	  N68=N[6]+N[8];
	  if (N[7]==1 && N68==0)  continue;
	  N82=N[8]+N[2];
	  if (N[1]==1 && N82==0)  continue;
	  N24=N[2]+N[4];
	  if (N[3]==1 && N24==0)  continue;
	  list0[j][i]=COLOR;
 	  flag=1;
	}
      }
      for (i=0;i<Dy;i++) {
		  memcpy(list[i],list0[i],Dx);
 	 for (j=0;j<Dx;j++)
	    if (list[i][j]!=1)  list[i][j]=0;
      }
    }
  }
  while(flag==1);

  free(list);                   
  free(buf);
}

void WINAPI RemoveNoise(BYTE **list,int Dx,int Dy)
{
   long i,j,k,m,n;
   BYTE **list0;

   list0=(BYTE**)malloc(Dy*sizeof(BYTE*));
   for(j=0;j<Dy;j++) { 
	  list0[j]=(BYTE*) malloc(Dx);
	  memset(list0[j],0,Dx);
   }
 
   for (j=1;j<Dy-1;j++) {
	  for (i=1;i<Dx-1;i++) {
		 for (m=-1,k=0;m<2;m++) {
			for (n=-1;n<2;n++) {
               if (list[j+m][i+n]) k++;
			}
	     }
		 if (k>4) list0[j][i]=1;
 	  }
   }

   for(j=0;j<Dy;j++) {
      memcpy(list[j],list0[j],Dx);
      if (list0[j]) free(list0[j]);
   }
   free(list0);  
}

int  WINAPI Distance(BYTE **list1,int Dx,int Dy)
{ 
	int  i,j,k,ii,jj,g,t,max,m,n;
	short **list;                          
	BYTE *lists;
	int Mask1[3][3]={7,5,7,5,-1,0,0,0,0};
 	int Mask2[3][3]={0,0,0,0,-1,5,7,5,7};
 
	m=3;			
	n=m/2;
	list=(short**)malloc(Dy*sizeof(short*));    
                                                  
	for(i=0;i<Dy;i++) {
		list[i]=(short *) malloc(Dx*sizeof(short));
		lists=(BYTE*) list[i];
		memcpy(lists,list1[i],Dx);             
		for (j=Dx-1,k=2*(Dx-1);j>=0;j--,k-=2) {
			if (lists[j]>1) lists[k+1]=16;
			else lists[k+1]=0;
 			lists[k]=lists[j];    
 		}
	}
  
	for (i=n;i<Dy-n;i++) {
		for (j=n;j<Dx-n;j++) {
			if (list[i][j]==0) continue;
			g=Dx+Dy;
			for (ii=0;ii<m;ii++) {
				for (jj=0;jj<m;jj++) {
 					if (Mask1[ii][jj]<0) break;
 					if (Mask1[ii][jj]==0) continue;
					t=list[i-n+ii][j-n+jj]+Mask1[ii][jj];
					if (t<g) g=t;
				}
				if (Mask1[ii][jj]<0) break;
			}
 			list[i][j]= g;
		}
	}

	for (i=Dy-n-1;i>n-1;i--) {
		for (j=Dx-n-1;j>n-1;j--) {
			if (list[i][j]==0) continue;
			g=Dx+Dy;
			for (ii=m-1;ii>=0;ii--) {
				for (jj=m-1;jj>=0;jj--) {
 					if (Mask1[ii][jj]<0) break;
 					if (Mask2[ii][jj]==0) continue;
					t=list[i-n+ii][j-n+jj]+Mask2[ii][jj];
					if (t<g) g=t;
				}
				if (Mask1[ii][jj]<0) break;
			}
			if (list[i][j]>g) list[i][j]= g; 
		}
	}

	max=0;
	for (i=0;i<Dy;i++) {
		for (j=0;j<Dx;j++) {
			list[i][j] /= 5;
 			if (list[i][j]>max) max=list[i][j];
		}
	}

	for(i=0;i<Dy;i++) {
		lists=(BYTE*) list[i];
		for (j=0,k=0;j<Dx;j++,k+=2) lists[j]=lists[k];    
		memcpy(list1[i],lists,Dx);             
	}
   
	for(i=0;i<Dy;i++) 
		if (list[i]) free(list[i]); 
	free(list);  
	return(max);
}  

int EDMask[9][2]={{ 0, 0},{-1,0},{ 0,-1},{0,1},{1,0},
				  {-1,-1},{-1,1},{ 1,-1},{1,1}};

void WINAPI erosion(BYTE **list0,BYTE **list1,int Dx,int Dy,int Mask[][2],int MaskLen)
{
  int  i,j,k;

  for(k=0;k<Dy;k++) 
    memset(list0[k],0,Dx);                           
 
  for(j=1;j<Dy-1;j++) {
    for(i=1;i<Dx-1;i++){ 
		for(k=0;k<MaskLen;k++) {                      
		if (list1[j+Mask[k][1]][i+Mask[k][0]]==0)                
	      break;
	  }
      if (k==MaskLen) list0[j][i]=1;                
	}
  }
}

void WINAPI dilation(BYTE **list0,BYTE **list1,int Dx,int Dy,int Mask[][2],int MaskLen)
{
  int  i,j,k;

  for(k=0;k<Dy;k++) 
    memset(list0[k],0,Dx);                           
 
  for(j=1;j<Dy-1;j++) {
    for(i=1;i<Dx-1;i++){ 
		for(k=0;k<MaskLen;k++) {                      
			if (list1[j+Mask[k][1]][i+Mask[k][0]]==1) {                
          list0[j][i]=1;                          
	      break;
		}
	  }
	}
  }
}

void WINAPI Erosion(BYTE **list0,BYTE **list1,int Dx,int Dy)
{
   erosion(list0,list1,Dx,Dy,EDMask,9);
}

void WINAPI Dilation(BYTE **list0,BYTE **list1,int Dx,int Dy)
{
   dilation(list0,list1,Dx,Dy,EDMask,9);
}

void WINAPI Inneredge(BYTE **list0,BYTE **list1,int Dx,int Dy)
{ 
   long i, j;

   erosion(list0,list1,Dx,Dy,EDMask,9);

   for (j=0;j<Dy;j++) {
	  for (i=0;i<Dx;i++) {
         list0[j][i] ^= list1[j][i];   
	  }
   }
} 

void WINAPI Outteredge(BYTE **list0,BYTE **list1,int Dx,int Dy)
{ 
   long i, j;

   dilation(list0,list1,Dx,Dy,EDMask,9);

   for (j=0;j<Dy;j++) {
	  for (i=0;i<Dx;i++) {
         list0[j][i] ^= list1[j][i];   
	  }
   }
} 

void WINAPI Morphologyedge(BYTE **list0,BYTE **list1,int Dx,int Dy)
{ 
   long i,j,mark=1;
   BYTE **listw;

   listw=(BYTE**)malloc(Dy*sizeof(BYTE*));
   for(j=0;j<Dy;j++) 
	  listw[j]=(BYTE*) malloc(Dx);
 
   erosion(list0,list1,Dx,Dy,EDMask,9);
   dilation(listw,list1,Dx,Dy,EDMask,9);

   for (j=0;j<Dy;j++) {
	  for (i=0;i<Dx;i++) {
         list0[j][i] ^= listw[j][i];   
	  }
   }

   for(j=0;j<Dy;j++) 
      if (listw[j]) free(listw[j]);
   free(listw);  
} 

void WINAPI Skeleton(BYTE **list0,BYTE **list1,int Dx,int Dy)
{ 
   long i,j,k,m,mark=1;
   BYTE **listw,**listu;
   BYTE **lista,**listb,**listc;

   listw=(BYTE**)malloc(Dy*sizeof(BYTE*));
   listu=(BYTE**)malloc(Dy*sizeof(BYTE*));
   for(k=0;k<Dy;k++) {
  	  listw[k]=(BYTE*) malloc(Dx);
 	  listu[k]=(BYTE*) malloc(Dx);
      memset(list0[k],0,Dx);              
   }
  
   lista=list1;
   listb=listw;
   while(mark) {
	  erosion(listb,lista,Dx,Dy,EDMask,9);

	  listc=lista;
	  lista=listb;
	  listb=listc;
      erosion(listb,lista,Dx,Dy,EDMask,9);
      dilation(listu,listb,Dx,Dy,EDMask,9);

      mark=0;
  	  for (j=0;j<Dy;j++) {
		 for (i=0;i<Dx;i++) {
			m=lista[j][i] ^ listu[j][i];
            list0[j][i] |= m;
			mark |= m;
		 }
	  }
   }
   
   for(k=0;k<Dy;k++) {
      if (listw[k]) free(listw[k]);
      if (listu[k]) free(listu[k]);
   }
   free(listw);  
   free(listu);  
}

int  hMask[8][9][2]={{{1,1},{0,1},{1,0},{0,0},},
                     {{-1,0},{-1,-1},{0,-1},{0,0},},
                     {{-1,0},{-1,1},{0,1},{0,0},},
                     {{0,-1},{1,-1},{1,0},{0,0},},
                     {{1,1},{0,1},{-1,1},{0,0},},
                     {{-1,-1},{0,-1},{1,-1},{0,0},},
                     {{-1,0},{-1,1},{-1,-1},{0,0},},
                     {{1,-1},{1,0},{1,1},{0,0}} };
int  mMask[8][9][2]={{{-1,0},{-1,-1},{0,-1},},
                     {{1,1},{0,1},{1,0},},
                     {{0,-1},{1,-1},{1,0},},
                     {{-1,0},{-1,1},{0,1},},
                     {{-1,-1},{0,-1},{1,-1},},
                     {{1,1},{0,1},{-1,1},},
                     {{1,-1},{1,0},{1,1},},
                     {{-1,0},{-1,1},{-1,-1}} };
int  hMaskLen[8]={4,4,4,4,4,4,4,4};
int  mMaskLen[8]={3,3,3,3,3,3,3,3};

void hmt(BYTE **list0,BYTE **list1,int Dx,int Dy,
		int hMask[][2],int hMaskLen,int mMask[][2],int mMaskLen)
{
	int  i,j,k;
	BYTE **listw,**listu;
 
	listw=(BYTE**)malloc(Dy*sizeof(BYTE*));             
	listu=(BYTE**)malloc(Dy*sizeof(BYTE*));
	for(k=0;k<Dy;k++) {
		listw[k]=(BYTE*) malloc(Dx);
		for (i=0;i<Dx;i++) listw[k][i]=1-list1[k][i];
		listu[k]=(BYTE*) malloc(Dx);
	}

	erosion(list0,list1,Dx,Dy,hMask,hMaskLen);
	erosion(listu,listw,Dx,Dy,mMask,mMaskLen);

	for (j=0;j<Dy;j++) {

⌨️ 快捷键说明

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